2015-02-09 29 views
0

我試圖找出Excel中的問題。我收到了內存不足的錯誤,我懷疑這不是問題,但我不知道。Excel VBA內存不足錯誤If語句

基本上,我試圖製作一個宏來搜索電子表格中5個選項卡中的列(該列可以在5中的任何一箇中,並且它會發生很大變化),並且當它發現它時,執行一個vlookup匹配以將列返回到主選項卡中的相應位置。這是我的代碼下面,似乎它應該工作,但我得到內存不足的錯誤。當我去調試時突出顯示的行是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 

我也嘗試用case語句來完成這個工作,但是我覺得我對上面的代碼有了進一步的瞭解。如果你可以讓我知道,如果這個代碼是愚蠢的,或者如果我能解決內存不足錯誤,我將不勝感激。如果我能使這個工作起來,我會用更多的專欄來複制這個過程,以防萬一。謝謝!!

+2

如果你沒有調暗'Vrange',那麼Excel會將它視爲'Variant'並嘗試加載你的範圍'rB'的全部內容(它定義爲'Set rB = wsB.Range(「 A:ZA「)')作爲這個新變量'Vrange'的數組。由於該數組爲27列,超過65000(或超過100萬Excel 2007+)行,因此Excel崩潰。基本上你需要用'Dim Vrange as Range'這行聲明Vrange作爲範圍變量,然後在你的If .. Elseif ..語句中將它設置爲期望的範圍。 – tigeravatar 2015-02-09 16:58:05

+1

看起來你還需要做同樣的'Mrange' – tigeravatar 2015-02-09 17:01:04

+0

哦,男人,我認爲這樣做!這是很好的信息,非常感謝你! – msim 2015-02-09 17:02:59

回答

0

爲了讓您一開始,代碼的第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在那裏你可以繼續處理結束。最後三個只是提醒手動設置範圍和工作簿對象後,你完成了他們。

+0

謝謝,我喜歡你在這裏所做的,我不知道Lbound/Ubound/Cbool,所以謝謝。但是我已經將匹配和vlookup放在了註釋部分,並且出現錯誤:「無效的過程調用或參數」。它看起來完全像我在原始問題(我的IF語句之後的部分)中編寫它的方式 – msim 2015-02-09 17:44:15

+0

@msim - 您的'mf_iA'從未被賦值爲數值。如果打算表示'mf_iA_TEXT'出現的列號,我在'For ... Next'循環中進行了調整以分配它。 – Jeeped 2015-02-09 18:02:06

+0

,看起來像它的工作。還有一件事,如果你有時間,如果我要用更多的列重複這個,我會從FOR循環中複製下來並更改必要的變量嗎?因爲我試過了,它阻止了我對'countIf(.Sheets ...)'說'無效或不合格的引用',我不明白爲什麼它會在第一列工作,但會卡在下一個列表中。 – msim 2015-02-09 18:29:24