gpt4 book ai didi

vba - Excel VBA 多个循环与循环内的变量

转载 作者:行者123 更新时间:2023-12-04 21:04:09 27 4
gpt4 key购买 nike

我已经坚持了一段时间,我真的可以使用一些帮助。我有这个子程序,它在五个工作表(B、E、L、I、T)中搜索标题为“帐户”的列。当它找到匹配项时,它会执行一个 vlookup 以将该整列的值带入跨页 (MasterTab) 中的另一个工作表中。它工作得很好。但我需要使它成为一个循环,以便它可以使用包含 550 个变量的数组(这些是其他列标题)来执行此过程。

我对循环非常陌生,并且了解基本示例,但这似乎很复杂,因为

  • 我(想我)需要在一个循环中做一个循环,因为我必须为每个 mf_x_TEXT 循环。变量(我的匹配函数的字符串),以及每个 mf_x变量(匹配函数本身)。而且由于代码本身是一个循环,那就是三个循环。
  • mf_x变量依赖于 mf_x_TEXT变量工作,所以我真的不知道如何设置它,以便循环正确放置正确的 TEXT变量向右mf_x匹配功能。

  • 这是我的工作,没有任何尝试让我正在谈论的工作。如果我向您展示我在循环中的尝试,那只会让事情变得更加困惑。 mf_Accountmf_Account_TEXT是两组 550 多个变量中的一个示例。
    Sub GetInfoAltVersion()
    '
    Dim wsMaster As Worksheet: Set wsMaster = Workbooks("LBImportMacroTemplate.xlsm").Worksheets("MasterTab")
    Dim vWSs As Variant: vWSs = Array("B", "E", "L", "I", "T")
    '
    Dim v As Long
    Dim Mrange As Range
    Dim Vrange As Range
    '
    With Workbooks("LBImportMacroTemplate.xlsm")
    Set Mrange = Nothing
    Set Vrange = Nothing
    With ActiveSheet
    lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row
    MsgBox lastrow
    End With
    '
    Dim mf_Account_TEXT As String: mf_Account_TEXT = "Account"
    'ETC, THERE ARE MANY MORE VARIABLES JUST LIKE THIS, BUT WITH DIFFERENT STRINGS
    '
    'THIS IS THE PART THAT I NEED TO LOOP FOR EACH VARIABLE
    For v = LBound(vWSs) To UBound(vWSs)
    If CBool(Application.CountIf(.Sheets(vWSs(v)).Range("A2:ZA2"), mf_Account_TEXT)) Then
    Set Mrange = .Sheets(vWSs(v)).Range("A2:ZA2")
    Set Vrange = .Sheets(vWSs(v)).Range("A:ZA")
    mf_Account = Application.Match(mf_Account_TEXT, Mrange, 0)
    '
    For i = 2 To lastrow
    wsMaster.Cells(i, 2) = Application.VLookup(wsMaster.Cells(i, 1), Vrange, mf_Account, 0)
    Next i
    Exit For
    End If
    Next v
    Set Mrange = Nothing
    Set Vrange = Nothing
    '
    End With
    End Sub

    可以帮助的一件事是,如果我可以将 application.Match vlookup 函数内部的函数,而不必使其成为变量,因为这将消除所需的循环之一。但我无法让 vlookup 以这种方式工作。我能够做到的唯一方法是将匹配函数声明为变量,然后将变量放入 index_col_num vlookup 的部分。

    我知道程序员不会手动编写 550 次,所以一定有一种方法超出了我目前的理解。如果可以的话,请帮忙,这让我发疯。

    最佳答案

    这将从主表中获取“变量”名称。将它们全部放在从第 2 列开始的第 1 行中。假设要在其他工作表中查找的值在主工作表和其他工作表的第一列中。

    如果查找值和列位于多个工作表中,那么这将使用数组后面列出的工作表覆盖该值。例如,如果查找值“12345”和列名称“帐户”同时在工作表“B”和工作表“T”中,则工作表“T”中的值将显示在您的数据中。如果您需要来自不同工作表的值,请重新排序数组以将最重要的工作表放在最后,否则将需要修改代码。

    请注意,这可能不是最有效的方法,但它应该有效。

    Sub GetInfoAltVersion()

    Dim xlWb As Workbook
    Dim wsMaster As Worksheet
    Dim vWSs As Variant: vWSs = Array("B", "E", "L", "I", "T")

    Dim v As Long
    Dim Mrange As Range
    Dim Vrange As Range
    Dim colName As String
    Dim lastCol As Integer
    Dim LastRow As Long
    Dim AccountCol As Integer
    Dim CurrSheet As Worksheet

    Set xlWb = Workbooks("LBImportMacroTemplate.xlsm")
    Set wsMaster = xlWb.Worksheets("MasterTab")

    LastRow = wsMaster.Cells(wsMaster.Rows.Count, "A").End(xlUp).Row
    MsgBox LastRow
    lastCol = wsMaster.Cells(1, wsMaster.Columns.Count).End(xlToLeft).Column
    MsgBox lastCol

    For j = 2 To lastCol
    colName = wsMaster.Cells(1, j).Value


    For v = LBound(vWSs) To UBound(vWSs)
    CurrSheet = xlWb.Sheets(vWSs(v))
    If CBool(Application.CountIf(CurrSheet.Range("A2:ZA2"), colName)) Then
    Set Mrange = CurrSheet.Range("A2:ZA2")
    Set Vrange = CurrSheet.Range("A:ZA")
    AccountCol = Application.Match(j, Mrange, 0)
    '
    For i = 2 To LastRow
    wsMaster.Cells(i, j) = Application.VLookup(wsMaster.Cells(i, 1), Vrange, AccountCol, 0)
    Next i
    End If
    Next v
    Set Mrange = Nothing
    Set Vrange = Nothing
    '
    Next j

    End Sub

    希望这可以帮助。

    关于vba - Excel VBA 多个循环与循环内的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28550456/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com