【问题标题】:VBA vlookup to copy specific columns from multiple sheets to master sheetVBA vlookup 将特定列从多个工作表复制到主工作表
【发布时间】:2017-10-27 03:56:45
【问题描述】:

我正在使用 Excel 为计费系统生成报告,我想使用 VBA 来简化更新 Excel 的过程。我想要做的是使用 vlookup 函数将各个命名工作表中的列(G:AI)反映回母版表。所有工作表都从第 4 行开始。(第 3 行是标题)

所以我会进一步简化这个过程:

VLOOKUP VBA(在命名工作表中进行更改时) 1. 在命名工作表(“John”、“Charlie”、“George”)的 Mastersheet 中的列 (G:AI) 中启用 Vlookup 功能 2. 由于 Mastersheet 是 John、Charlie 和 George 的混合数据,相应地跨列 (G:AI) 输入 Vlookup 公式,然后直到 Mastersheet 的最后一行 3. 我的 vlookup 范围将来自命名工作表(John、Charlie、George),范围(A1:AI)从第 7 列第 4 行到数据末尾。

ws1.Cells(r, c).Value = Application.VLookup(ws1.Cells(r, 1).Value, wsNames.Range("A1:AI500"), colnum, False)

这是我到目前为止的代码。到目前为止,这就是我(在帮助下)解决的所有问题。任何帮助将不胜感激。

我的问题是,在运行代码时,ws11 的 vlookup 值在正确的位置。但是,ws12 和 ws13 的 vlookup 值会移向工作表的更左侧。例如, 而 ws11 的 vlookup 值在列 (A:AI) - 右列 ws12 的 vlookup 值在列中 (AP:BR) - 来自 AI 列的 7 列和 ws13 的 vlookup 值在列中 (BY:DA) - 来自 BR 列的 7 列 我可以插入一行代码来解决这个问题吗?

Sub green_update()
Dim wb As Workbook, ws1 As Worksheet, ws11 As Worksheet, ws12 As Worksheet, ws13 As Worksheet

Set wb = ThisWorkbook
Set ws1 = wb.Sheets("Sheet1")
Set ws11 = wb.Sheets("Sheet11")
Set ws12 = wb.Sheets("Sheet12")
Set ws13 = wb.Sheets("Sheet13")


Dim colNo As Long, ARowNo as Long
Dim for_col As Long, i As Long, r As Long, c As Long, colnum As Long
r = 4: c = 7: colnum = 7

Dim wsNames As Variant
For Each wsNames In Sheets(Array("sheet11", "sheet12", "sheet13"))

colNo = wsNames.Cells("4", Columns.Count).End(xlToLeft).Column
 For for_col = 1 To colNo

ARowNo = wsNames.Cells(Rows.Count, "A").End(xlUp).row

    For i = 1 To ARowNo
    ws1.Cells(r, c).Value = Application.VLookup(ws1.Cells(r, 1).Value, wsNames.Range("A1:AI500"), colnum, False)
    If IsError(ws1.Cells(r, c).Value) Then
    ws1.Cells(r, c).Value = 0
    End If
    r = r + 1

    Next

 r = 4
 colnum = colnum + 1
 c = c + 1

Next

colnum = 7 

  Next wsNames

End Sub   

【问题讨论】:

  • 你的问题是……?
  • 我假设这是由于在 vlookup 中使用之前未设置 colnum 而导致的失败
  • @SJR 我已经编辑了这个问题以便更好地理解。我为延误道歉
  • @smithy7876 我认为 colnum 没问题,因为我需要它在运行时在不同的列中运行。现在分别是 ws12 和 ws13 中的 vlookup 值的对齐存在问题。谢谢你。 :)
  • 目前你已经硬编码了wsNames.Range("A1:AI500")。您是说这只适用于循环中的第一张纸,而对于其他每一张纸,它应该按照您的指示向右移动?

标签: vba excel vlookup


【解决方案1】:

老实说,根据发布的代码,我看不出是什么导致了您所描述的问题。下面的代码没有什么本质上的不同——我整理了几个循环并合并了最后一行变量。让我知道你的进展情况。

Sub green_update()

Dim wb As Workbook, ws1 As Worksheet

Set wb = ThisWorkbook
Set ws1 = wb.Sheets("Sheet1")

Dim colNo As Long, ARowNo As Long
Dim for_col As Long, i As Long, r As Long, c As Long, colnum As Long

r = 4: c = 7: colnum = 7

Dim wsNames As Variant

For Each wsNames In Sheets(Array("sheet11", "sheet12", "sheet13"))
    colNo = wsNames.Cells("4", Columns.Count).End(xlToLeft).Column
    ARowNo = wsNames.Cells(Rows.Count, "A").End(xlUp).Row
    For for_col = 1 To colNo
        For i = 1 To ARowNo
            ws1.Cells(r, c).Value = Application.VLookup(ws1.Cells(r, 1).Value, wsNames.Range("A1:AI" & ARowNo), colnum, False)
            If IsError(ws1.Cells(r, c).Value) Then
                ws1.Cells(r, c).Value = 0
            End If
            r = r + 1
        Next i
        r = 4
        colnum = colnum + 1
        c = c + 1
    Next for_col
    colnum = 7
Next wsNames

End Sub

【讨论】:

  • 我已经尝试了代码,但发生的事情是它只显示一张纸上的 vlookup 值。我玩过代码“For Each wsNames In Sheets(Array("sheet11", "sheet12", "sheet13"))" 并重新排列了序列。所以当运行 sheet(Array("sheet11","sheet12","sheet13") 时,只显示 "sheet13" 的 vlookup 值。当运行 sheet(Array("sheet13","sheet12","sheet11") 时,显示“sheet11”的 vlookup 值。它们似乎只占用最后一张。但是当运行 sheet(Array("sheet11","sheet13","sheet12") 时,显示的 vlookup 值是中间的工作表。“sheet12 " 值不显示。
  • 我之前做了一些非常愚蠢的事情,所以修改了代码应该可以解决上述问题,但不确定你原来的问题。
  • 您能描述一下您希望结果如何显示吗?你在 sheet11 上进行了一堆查找,那么下一张表的结果应该出现在哪里 - 直接在下面?每张纸的colNo 的值是多少?
  • 我希望 ws11-13 的所有结果出现在 G:AI 列的 sheet1 上。在完成工作表 11 上的查找后,理想情况下,工作表 12 和工作表 13 的查找应该出现在同一列范围内。修改后的代码将 sheet11 vlookup 值放在正确的位置(G:AI 列),但不是 sheet12(在 BY:DA 列中)和 sheet13(vlookup 值没有复制)colNo 在所有工作表中应该相同,因为行从 4 开始。 colNum 从 7(column"G") 开始到工作表末尾,但在这种情况下应该是 35(column"AI")。
  • 是的!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
相关资源
最近更新 更多