我有2张纸的数据;带有案例ID列表的参考表和带有案例ID,客户名称,编号,描述等的原始表。
我们的目标是创建一个VBA循环,检查源片的各行对的基准片和如果该值是存在于所述参考表,拉从源片到目标表中的所有必需的字段。我当前的VBA代码正在使用偏移量,但这似乎无法正常工作。代码如下:
Public Sub MainFileData2()
Dim i As Long, k As Long
Dim wbmacro As Workbook
Dim wbmain As Workbook
Set wbmacro = Workbooks.Item("MacroFile.xlsm")
Set wbmain = Workbooks.Item("SourceFile.csv")
Dim wsmacro As Worksheet
Dim wsmain As Worksheet
Dim wsref As Worksheet
Set wsmacro = wbmacro.Worksheets.Item("Data")
Set wsmain = wbmain.Worksheets.Item("SourceFileData")
Set wsref = wbmacro.Worksheets.Item("Sheet1")
Set destsht = Workbooks("MacroFile.xlsm").Worksheets("Data")
Dim engrange As Range
Set engrange = wsmain.Range("B2:B500000")
Dim cell As Range
k = 1
i = 2
DestLastRow = destsht.Cells(destsht.Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False
For Each cell In engrange
If engrange.Cells(i, 1) = wsref.Cells(k, 1) Then
wsmacro.Range("candnum").Offset(i, 0) = wsmain.Range("b2").Offset(i, 0)
wsmacro.Range("candname").Offset(i, 0) = wsmain.Range("c2").Offset(i, 0)
wsmacro.Range("estat").Offset(i, 0) = wsmain.Range("e2").Offset(i, 0)
wsmacro.Range("ira").Offset(i, 0) = wsmain.Range("g2").Offset(i, 0)
wsmacro.Range("wrkflw").Offset(i, 0) = wsmain.Range("k2").Offset(i, 0)
wsmacro.Range("fln").Offset(i, 0) = wsmain.Range("o2").Offset(i, 0)
wsmacro.Range("city").Offset(i, 0) = wsmain.Range("r2").Offset(i, 0)
wsmacro.Range("country").Offset(i, 0) = wsmain.Range("s2").Offset(i, 0)
i = i + 1
Else: i = i + 1
End If
Next cell
Application.ScreenUpdating = True
End Sub
例如,随着代码的循环遍历i
,它会在源文件的第20行中找到该值,并最终将这些值一直粘贴到目标文件(“数据”表)的第20行中,从而跳过了前19个空白行。我尝试使用destlastrow代替i,它最终覆盖了该值,并且也无法正常工作。
任何想法/投入将不胜感激。提前致谢。
您的代码几乎没有主要问题。并非要苛刻,但希望它能帮助您理解我提议的更改。
您有两个变量可以用作索引(i
,k
),但您只能递增i
。k
始终保持不变。这就是为什么只在1行中得到输出的原因。
您还使用了一个For Each
循环,该循环实际上为您在上使用的同一数据集添加了另一组不可见索引i
。最好使用带有的For
循环i
,这将消除对i=i+1
和创建循环的需要enrange
。
另外,在IF
代码的语句部分,您将i
在=符号的任一侧使用,这就是为什么要在1的结果输出wsmacro
位于的同一行中使用的原因wsmain
。
在输出行上使用DestLastRow
而不是代替也会给您带来问题,因为它只被计算一次(循环中没有),这就是数据被覆盖的原因。i
wsmacro
您有3种不同的工作表,因此您需要3种不同的索引。
此外,wsmacro
并destsht
参考相同的工作表。您不需要两者。
综上所述,这是我未经测试的建议:
Public Sub MainFileData2()
Dim iDest As Long, iMain As Long, iRef As Long
Dim MainLastRow As Long, RefLastRow As Long
Dim wbMacro As Workbook
Dim wbMain As Workbook
Set wbMacro = Workbooks.Item("MacroFile.xlsm")
Set wbMain = Workbooks.Item("SourceFile.csv")
Dim wsMacro As Worksheet
Dim wsMain As Worksheet
Dim wsRef As Worksheet
Set wsMain = wbMain.Worksheets.Item("SourceFileData")
Set wsRef = wbMacro.Worksheets.Item("Sheet1")
Set wsMacro = wbMacro.Worksheets("Data")
iMacro = 1 'Index for the destination sheet
MainLastRow = wsMain.Cells(wsMain.Rows.Count, 1).End(xlUp).Row
RefLastRow = wsRef.Cells(wsRef.Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False
For iMain = 2 To MainLastRow 'Go through each row of wsMain
For iRef = 2 To RefLastRow 'For each row in the Main sheet, go through each row of the reference sheet
If wsMain.Cells(iMain, 1) = wsRef.Cells(iRef, 1) Then
wsMacro.Range("candnum").Offset(iMacro, 0) = wsMain.Cells(iMain, "B")
wsMacro.Range("candname").Offset(iMacro, 0) = wsMain.Cells(iMain, "C")
wsMacro.Range("estat").Offset(iMacro, 0) = wsMain.Cells(iMain, "E")
wsMacro.Range("ira").Offset(iMacro, 0) = wsMain.Cells(iMain, "G")
wsMacro.Range("wrkflw").Offset(iMacro, 0) = wsMain.Cells(iMain, "K")
wsMacro.Range("fln").Offset(iMacro, 0) = wsMain.Cells(iMain, "O")
wsMacro.Range("city").Offset(iMacro, 0) = wsMain.Cells(iMain, "R")
wsMacro.Range("country").Offset(iMacro, 0) = wsMain.Cells(iMain, "S")
iMacro = iMacro + 1 'Ensures the next output to wsMacro will go in the next row
Exit For 'The match has been found, so you can move on to the next row in wsMain without checking the rest of the rows in wsRef
End If
Next iRef
Next iMain
Application.ScreenUpdating = True
End Sub
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句