首页 > 解决方案 > 数据打印到错误的行

问题描述

好的,这段代码应该循环遍历列中的单元格,如果找到匹配项则更新该行的信息,如果找不到匹配项则打印到新行。循环在寻找匹配项时工作,但它在错误的行上打印数据。例如,我的行数为 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

标签: vbaexcel

解决方案


这是无稽之谈:

 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 上,转到单元格“A3”并转到该范围的“A3”。本质上是单元格“A5”

为什么?因为这是废话加上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"

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


推荐阅读