If语句上的Excel VBA内存不足错误

If语句上的Excel VBA内存不足错误,vba,excel,memory,Vba,Excel,Memory,我想用Excel解决一个问题。我得到了一个内存不足的错误,我怀疑这不是问题,但我真的不知道 基本上,我正在尝试制作一个宏,在电子表格的5个选项卡中搜索一列。该列可以在5个选项卡中的任何一个选项卡中,并且它会发生很大变化。当它找到该列时,会进行vlookup匹配,以将该列返回到主选项卡中的适当位置。下面是我的代码,看起来应该可以工作,但我得到了内存不足错误。当我转到debug时突出显示的行是if语句中的第一行Vrange=rB Dim i As Integer Dim r As Range ' D

我想用Excel解决一个问题。我得到了一个内存不足的错误,我怀疑这不是问题,但我真的不知道

基本上,我正在尝试制作一个宏,在电子表格的5个选项卡中搜索一列。该列可以在5个选项卡中的任何一个选项卡中,并且它会发生很大变化。当它找到该列时,会进行vlookup匹配,以将该列返回到主选项卡中的适当位置。下面是我的代码,看起来应该可以工作,但我得到了内存不足错误。当我转到debug时突出显示的行是if语句中的第一行Vrange=rB

Dim i As Integer
Dim r As Range
'
Dim wsMaster As Worksheet: Set wsMaster = Workbooks("LBImportMacroTemplate.xlsm").Worksheets("MasterTab")
Dim wsB As Worksheet: Set wsB = Workbooks("LBImportMacroTemplate.xlsm").Worksheets("B")
Dim wsE As Worksheet: Set wsE = Workbooks("LBImportMacroTemplate.xlsm").Worksheets("E")
Dim wsL As Worksheet: Set wsL = Workbooks("LBImportMacroTemplate.xlsm").Worksheets("L")
Dim wsI As Worksheet: Set wsI = Workbooks("LBImportMacroTemplate.xlsm").Worksheets("I")
Dim wsT As Worksheet: Set wsT = Workbooks("LBImportMacroTemplate.xlsm").Worksheets("T")
'
Dim rBHeading As Range: Set rBHeading = wsB.Range("A2:ZA2")
Dim rEHeading As Range: Set rEHeading = wsE.Range("A2:ZA2")
Dim rLHeading As Range: Set rLHeading = wsL.Range("A2:ZA2")
Dim rIHeading As Range: Set rIHeading = wsI.Range("A2:ZA2")
Dim rTHeading As Range: Set rTHeading = wsT.Range("A2:ZA2")
'
Dim rB As Range: Set rB = wsB.Range("A:ZA")
Dim rE As Range: Set rE = wsE.Range("A:ZA")
Dim rL As Range: Set rL = wsL.Range("A:ZA")
Dim rI As Range: Set rI = wsI.Range("A:ZA")
Dim rT As Range: Set rT = wsT.Range("A:ZA")
'
Dim mf_iA_TEXT As String: mf_iA_TEXT = "iA"
'
If Application.CountIf(rBHeading, "iA") = 1 Then
    Vrange = rB
    Mrange = rBHeading
ElseIf Application.CountIf(rEHeading, "iA") = 1 Then
    Vrange = rE
    Mrange = rEHeading
ElseIf Application.CountIf(rLHeading, "iA") = 1 Then
    Vrange = rL
    Mrange = rLHeading
ElseIf Application.CountIf(rIHeading, "iA") = 1 Then
    Vrange = rI
    Mrange = rIHeading
Else
    Vrange = rT
    Mrange = rTHeading
End If
'
Dim mf_iA As Variant: mf_iA = Application.Match(mf_iA_TEXT, Mrange, 0)
'
With ActiveSheet
    lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row
    MsgBox lastrow
End With
'
For i = 2 To lastrow
    wsMaster.Cells(i, 2) = Application.VLookup(wsMaster.Cells(i, 1), Vrange, mf_iA, 0)
Next i
'
End Sub

我还试图通过一个案例陈述来实现这一点,但我觉得通过上面的代码,我走得更远了。如果你能让我知道这段代码是否愚蠢,或者如果我能解决内存不足的错误,我将不胜感激。如果我能做到这一点,我将复制更多列的过程,以防万一。谢谢

首先,前56行代码可以写成

    Dim v As Long, vWSs As Variant, Mrange As Range, Vrange As Range, mf_iA as long
    Dim wsMaster As Worksheet: Set wsMaster = Workbooks("LBImportMacroTemplate.xlsm").Worksheets("MasterTab")
    Dim mf_iA_TEXT As String: mf_iA_TEXT = "iA"

    vWSs = Array("B", "E", "L", "I", "T")
    With Workbooks("LBImportMacroTemplate.xlsm")
        mf_iA = 0: Set Mrange = Nothing: Set Vrange = Nothing
        For v = LBound(vWSs) To UBound(vWSs)
            If CBool(Application.CountIf(.Sheets(vWSs(v)).Range("A2:ZA2"), mf_iA_TEXT)) Then
                Set Mrange = .Sheets(vWSs(v)).Range("A2:ZA2")
                Set Vrange = .Sheets(vWSs(v)).Range("A:ZA")
                ' added the column number assignment on the next line
                mf_iA = application.match(mf_iA_TEXT, Mrange, 0)
                Exit For
            End If
        Next v
    End With

    if mf_iA = 0 then msgbox "Stop here! " & mf_iA_TEXT & "not found!"
    'assumed that Mrange and Vrange are not nothing at this point
    ' and that mf_iA is the numerical column index number for mf_iA_TEXT
    'do something with them


    Set Mrange = Nothing
    Set Vrange = Nothing
    Set wsMaster = Nothing

这会将您带到If/ElseIf/end If的末尾,在那里您可以继续处理。最后三个只是提醒您在使用完范围和工作簿对象后,手动将其设置为零。

如果您没有将Vrange设置为灰色,则Excel会将其视为变量,并尝试将范围rB(定义为set rB=wsB.RangeA:ZA)的全部内容作为数组加载到此新变量Vrange。因为在Excel2007+上,数组将有27列,超过65000行或超过100万行,所以Excel崩溃。基本上,您需要将Vrange声明为范围变量,将Dim Vrange行作为范围,然后将其设置为If中所需的范围。。艾尔塞夫。。声明。看来你也需要为Mrangeoh先生做同样的事情,我想是这样的!!这是很好的信息,非常感谢!谢谢,我喜欢你在这里所做的,我不知道Lbound/Ubound/Cbool,所以谢谢。但是我已经把匹配和vlookup放在了你的评论部分,我得到了一个错误:无效的过程调用或参数。它看起来就像我在原始问题中写的,在我的IF之后的部分statement@msim-从未为您的mf_iA分配数值。如果它是用来表示mf_iA_文本出现的列号,我已经在For中做了一个调整。。。下一个循环来分配它。看起来它起作用了。还有一件事,如果你有时间,如果我用更多的列重复这一点,我会从FOR循环复制下来,并更改必要的变量吗?因为我试过了,它阻止了我。。。说引用无效或不合格,我不明白为什么它会在第一列上工作,但在下一列上会卡住。@msim-您应该能够更改或替换另一个var mf_iA_TEXT和mf_iA,以便后续检索。如果使用上述方法重写了大部分代码,请考虑发布一个显示新代码的新问题以及如何尝试追加列检索。第一个问题是,如果找到mf_iA_文本,是否保证会找到后续要检索的列,或者这些列可能来自另一个工作表。再次感谢。我发现了太多的终端错误,但现在我有了一个不同的问题,我提出了一个新的问题。谢谢