数据打印到错误的行

时间:2018-05-24 19:32:37

标签: excel vba excel-vba

好的,这个代码应该循环遍历列中的单元格,如果找到匹配则更新行上的信息,或者如果找不到匹配则打印到新行。循环在寻找匹配时工作,但它在错误的行上打印数据。例如,我的rowcount将为3,代码将写入.cells(rowcount,“J”)上打印,但它在工作表的第5行打印。我不知道为什么会这样做?

Private Sub CommandButton1_Click()

Set Wb1 = ThisWorkbook

'Names variable
With Wb1.Worksheets("Sheet1")
    Var1 = Worksheets("Sheet1").Range("d1")
End With

'Opens master workbook
Set WB2 = Workbooks.Open (...filepath)

WB2.Worksheets("Sheet1").Select
    Worksheets("Sheet1").Range("a2").Select
    RowCount = 2
    Var2 = WB2.Worksheets("Sheet1").Cells(RowCount, "A")

Do While Not WB2.Worksheets("Sheet1").Cells(RowCount, "a") = ""
    If Var1 <> Var2 Then
        RowCount = RowCount + 1
        Var2 = WB2.Worksheets("Sheet1").Cells(RowCount, "A")

    ElseIf IncNum = Var2 Then
        With WB2.Worksheets("Sheet1").Cells(RowCount, "A")
        .Cells(RowCount, "a") = Var1
    End With

    ElseIf IsEmpty(Cells(RowCount, "a")) Then
        With WB2.Worksheets("Sheet1").Cells(RowCount, "A")
        .Cells(RowCount, "a") = Var1
    End With

    End If
    Loop

End Sub

1 个答案:

答案 0 :(得分:2)

这是胡说八道:

 With WB2.Worksheets("Sheet1").Cells(RowCount, "A")
    .Cells(RowCount, "a") = Var1
 End With

这是100%的同义词:

 WB2.Worksheets("Sheet1").Cells(RowCount, "A").Cells(RowCount, "a") = Var1

基本上(假设RowCount = 3)这说:

  

在Sheet1上转到单元格&#34; A3&#34;然后去那个范围&#34; A3&#34;。这基本上就是细胞&#34; A5&#34;

为什么呢?因为它的废话加上excel很奇怪。其他人可以解释一个。

将所有这些With内容从此处取出并执行:

 WB2.Worksheets("Sheet1").Cells(RowCount, "A").Value = Var1

冲洗并重复所有其他类似代码。

这是重写:

Private Sub CommandButton1_Click()
    Set Wb1 = ThisWorkbook

    'Names variable
    Var1 = Wb1.Worksheets("Sheet1").Range("d1")

    'Opens master workbook
    Set WB2 = Workbooks.Open (...filepath)

    RowCount = 2
    Var2 = WB2.Worksheets("Sheet1").Cells(RowCount, "A")

    Do While Not WB2.Worksheets("Sheet1").Cells(RowCount, "a") = ""
        If Var1 <> Var2 Then
            RowCount = RowCount + 1
            Var2 = WB2.Worksheets("Sheet1").Cells(RowCount, "A")
        ElseIf IncNum = Var2 Then
            WB2.Worksheets("Sheet1").Cells(RowCount, "A").Value = Var1
        ElseIf IsEmpty(Cells(RowCount, "a")) Then
            With WB2.Worksheets("Sheet1").Cells(RowCount, "A").Value = Var1
        End If
    Loop

End Sub

一些提示:

不要.Select范围。特别是如果你不打算在下一行使用Selection.<something>。选择VBA中的范围没有任何好处。

With很有用,但前提是您计划使用它的子对象或方法执行以下操作:

With Sheet1
    .Unprotect
    .Range("A1").Value = "Hi"
    .Range("B1").Interior.ColorIndex = 5
    .Protect "theyllneverguessthisone"
End With

如果你之后只有一行,这是多余的:

With Sheet1
    .Range("A1").Value = "Hi"
End With

因为那可以改写为:

Sheet1.Range("A1").Value = "Hi"

哪个更具可读性,并且不会混淆代码的意图(导致您在问题中看到的问题)。