好的,这个代码应该循环遍历列中的单元格,如果找到匹配则更新行上的信息,或者如果找不到匹配则打印到新行。循环在寻找匹配时工作,但它在错误的行上打印数据。例如,我的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
答案 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"
哪个更具可读性,并且不会混淆代码的意图(导致您在问题中看到的问题)。