VBA:如果在参考表中找到值,则将数据+字段从源表中拉到目标表中

VBAWARD

我有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,它最终覆盖了该值,并且也无法正常工作。

任何想法/投入将不胜感激。提前致谢。

大卫·N

您的代码几乎没有主要问题。并非要苛刻,但希望它能帮助您理解我提议的更改。

您有两个变量可以用作索引(ik),但您只能递增ik始终保持不变。这就是为什么只在1行中得到输出的原因。

您还使用了一个For Each循环,循环实际上为您在上使用的同一数据集添加了另一组不可见索引i最好使用带有的For循环i,这将消除对i=i+1和创建循环的需要enrange

另外,在IF代码语句部分,您将i在=符号的任一侧使用,这就是为什么要在1的结果输出wsmacro位于的同一行中使用的原因wsmain

在输出行上使用DestLastRow而不是代替也会给您带来问题,因为它只被计算一次(循环中没有),这就是数据被覆盖的原因。iwsmacro

您有3种不同的工作表,因此您需要3种不同的索引。

此外,wsmacrodestsht参考相同的工作表。您不需要两者。

综上所述,这是我未经测试的建议:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

SQL查询,如果在链接表中找不到,则将值设置为null

如果在表中找到active = 1,则在mysql结果中完全排除用户ID

MySQL:如果在第二张表中找到匹配的ID并添加缺少的内容,如何在第一张表中“覆盖”数据

比较源表和目标表,复制源表中不匹配的数据

如果在另一数据框中找到其列值,则从数据框中删除该行

如果在分组或分区后未找到列值,则SQL从表中过滤出记录

如果在工作表1 A列中找到值,则需要将整个行从工作表2粘贴到工作表3

如果在表中找到MySql,则返回“ I FOUND IT”字符串

Azure 数据工厂 - 在同一源表和目标表中更新或插入值

源表和目标表中没有主键如何追加源表+ SSIS包中添加的新行

如果在文件行中找到某个值,请使用AWK打印相邻字段

如果在字段中找到指定值,是否拒绝PDO MySQL语句?

使用自然键从源表中的一行更新目标表中的多行

Oracle PL / SQL过程在源表中拆分逗号分隔的数据并推入目标表

将表 1 与表 2 连接。如果在表 2 中找不到值,则从表 3 中获取

如果在另一个数据框列pandas中找到一列中的值,则返回值

如果在另一数据框的列中找到ID匹配,则更新数据框中的一列的值

如果在表2中存在MySQL,请从表1中选择所有数据,并通过ID从表2中选择替换值

如果在表中不存在MySQL查询得到B表数据

如果在数据库的任何集合中找到特定的归档值,如何在mongodb中复制旧文档并创建新文档

如果在类型列表的单元格值中找到字符串,如何根据条件删除熊猫数据框中的行?

在源表中给定DateCreated和DateUpdated列的情况下更新目标表

如何基于某些条件使用pyspark在新列中从源表到目标表填充值?

基于从源表的一列插入到目标表的多列中来优化查询

如何将多个不同的列从源表插入到目标表中的一列

插入源表一行中每一列的目标表新条目

如果在同一列表中找到标题,则根据标题对列进行分组。熊猫蟒

在源/登台表中找不到目标时更新目标行

使用Informatica检查源平面文件中的值在目标表中是否存在