vba - 数据打印到错误的行
问题描述
好的,这段代码应该循环遍历列中的单元格,如果找到匹配项则更新该行的信息,如果找不到匹配项则打印到新行。循环在寻找匹配项时工作,但它在错误的行上打印数据。例如,我的行数为 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
解决方案
这是无稽之谈:
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"
这更具可读性并且不会混淆代码的意图(导致您在问题中看到的问题)。
推荐阅读
- amazon-web-services - 导出 aws cloudwatch dasbhoard 的屏幕截图
- process - 按键到特定进程
- javascript - HOC 和标准组件的主要区别是什么?我什么时候应该以正确的方式使用它们?
- android - 登录到 parse-platform 时检查布尔值或字符串
- php - Laravel 5.7 在控制器中循环时为 foreach() 提供的参数无效
- excel - VBA 单元格总和
- node.js - 使用 get 函数从 Solidity 结构接收 JSON [Express]
- gitlab - gitlab与子模块的持续集成问题
- ios - 如何判断 PDFDocument 是否已加载到 PDFView
- c# - Asp.net mvc:DropDownList 虚拟化,无法从下拉列表中选择数据