0

我正在为一个 Excel 表单编写 VB 代码,该表单提示用户回答一系列问题,然后将响应存储在工作表上的行中。目前,代码将第一个响应存储在 A2 中,然后将第二个响应存储在 B2 中,依此类推。当屏幕上出现感谢提示时,分会结束。

我想要做的是,当所有问题都得到回答时,光标将移动到下一行(A3)的第一个单元格,以便为另一个人存储相同问题的答案。它必须继续移动到下一行。

这些是主要的代码片段

Sub dform ()
    Dim mName As String
    mName = InputBox("What is your maiden named", "Maiden Name")
    Range("A2").Select
    ActiveCell.FormulaR1C1 = mName
    x = MsgBox("Are you still married?", 4)
    If x = 6 Then Range("G2").Value = "Yes"
    If x = 7 Then Range("G2").Value = "No"
    Exit Sub
End Sub
4

3 回答 3

1

首先,您可能想要编辑您的问题,因为这些问题非常不同:

What is your maiden named
What is your maiden name?

我对你的代码做了一些修改。这些评论应该可以帮助您了解正在发生的事情。使用这种方法,您可以提出问题,而无需选择或显示包含所有答案的工作表。

我已将您的硬编码行替换为一个变量,该变量设置为ws对象 A 列中的第一个空行。您可以设置ws为您的工作表被调用的任何内容。现在您可以根据需要多次运行它,它总是将新答案附加到新行。

' use this statement at the top of all modules to require variable declaration
Option Explicit

Sub dform()
    ' declare your variables
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim firstEmptyRow As Long
    Dim mName As String
    Dim x As Long

    ' you need the "set" keyword for object variables
    Set wb = ThisWorkbook
    Set ws = wb.Sheets("Sheet1")
    ' the best way to get the last row is to go up from the bottom of the sheet
    ' add 1 to get the first empty row
    firstEmptyRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row + 1

    mName = InputBox("What is your maiden named", "Maiden Name")

    ' always avoid selecting or activating in VBA code
    ws.Range("A" & firstEmptyRow).Value = mName
    x = MsgBox("Are you still married?", 4)
    If x = 6 Then ws.Range("G" & firstEmptyRow).Value = "Yes"
    If x = 7 Then ws.Range("G" & firstEmptyRow).Value = "No"
    Exit Sub
End Sub
于 2013-07-01T19:21:56.717 回答
0

您可以尝试在循环中使用 Cells 或 Offset 属性:

http://msdn.microsoft.com/en-us/library/office/aa139976(v=office.10).aspx

于 2013-07-01T18:23:19.150 回答
-1

两种可能的解决方案是:

  • 您将最后使用的行的编号存储在隐藏的工作表中
  • 您“阅读”工作表中的信息并将数据存储在第一个空行中

我认为第一种方法是最简单的方法,并且它是持久的(保存书时存储行号)。

因此,让我们假设您有一个名为的工作表utilitySheet,并且您存储了在 cell 中使用的最后一行B2。当然,该值必须是整数。

所以你可以是这样的:

sub dform()
    dim mName as String
    dim nRow as Integer

    nRow = ThisWorkbook.Sheets("utilitySheet").Cells(2,2).Value
    ' ...
    If x = 6 then ThisWorkbook.Sheets("results").Cells(nRow + 1, 7).Value = "Yes"
    If x = 7 then ThisWorkbook.Sheets("results").Cells(nRow + 1, 7).Value = "No"
    ' ...
    ' Update the row number in the utility sheet
    ThisWorkbook.Sheets("utilitySheet").Cells(2,2).Value = nRow + 1
end sub
于 2013-07-01T18:11:40.043 回答