2017-06-21 50 views
0

我正在使用VBA嘗試從主子例程調用一系列子例程。當我將所有的子程序與類似於下面的代碼結合起來時,我得到#N/A表示公式被忽略的單元格。調用VBA子程序在從另一個子程序內部調用時不起作用

Sub Main() 

'Turn off autocalculation 
    Application.Calculation = xlCalculationManual 
    Application.DisplayStatusBar = False 
'********************************************************* 
'A bunch of other code 
'********************************************************* 

Call Sub_Routine1 
Call Sub_Routine2 
Call Sub_Routine3 
Call Sub_Routine4 
Call Sub_Routine5 
Call Sub_Routine6 
Call Sub_Routine7 

'This is the sub routine that is not working correctly 
Call Material_Formulas 

'Turn back on the autocalculation function 
    Application.Calculation = xlAutomatic 

'********************************************************* 
'A bunch of other code 
'********************************************************* 
    Application.DisplayStatusBar = True 
    Application.ScreenUpdating = True 
    Application.EnableEvents = True 

End Sub 

Combined_Call

當我刪除從主要子例程Material_Formulas子程序,並分別使用下面的腳本來運行它,執行它,因爲它是假設,看起來像圖像波紋管。

Private Sub Material_Formulas() 

'Turn on manual calculation 
Application.Calculation = xlCalculationManual 
Dim lRow As Integer 
Dim tiesMaterial As String 
Dim result As String 
lRow = Sheets("Material").Range("A2").End(xlDown).Row 
lCol = Sheets("Material").Range("A2").End(xlToRight).Column 

'Starts the count at column CU 
endCount = lCol - 1  
    For c = 99 To endCount 
     For r = 3 To lRow   
     tiesMaterial = Cells(r, 87).Value 

     'Looks to see if the cells starting at CU2 contains a number and then iterates through each cell in row 3 to add a formula 
     If tiesMaterial = "TIES MATERIAL" Then 

      'Defines the unique ID and calendar year cells for the index-match-match function 
      materialID = Sheets("Material").Cells(r, "CQ").Address(False, False) 
      materialYear = Sheets("Material").Cells(2, c).Address(False, False) 

      'Starting in cell CU3 it adds the formula =INDEX(BOM_Summary_Array,MATCH(CQ3,BOM_Summary_ID,0),MATCH(CU2,BOM_Summary_Head,0)) 
      Sheets("Material").Cells(r, c).Formula = "=INDEX(BOM_Summary_Array,MATCH(Material!" & materialID & ",BOM_Summary_ID,0),MATCH(Material!" & materialYear & ",BOM_Summary_Head,0))"     
     End If 

     Next r 
    Next c  
'Turn on the auto calculation function 
Application.Calculation = xlAutomatic 
End Sub 

Separate_Call

我在做什麼錯?當我手動和獨立地選擇它時它如何運行良好,但是當我將它與其他子例程結合時它失敗了?

+0

當你說*「失敗」*你的意思是它什麼都不做或者拋出一個錯誤** ?? ** –

+0

單元格中的公式是什麼?如果不是正確的公式應該是什麼? –

+0

跨越第2行的實際日期的格式爲「yyyy」或2012年至2021年的整數? – Jeeped

回答

1

之前你需要改善你的代碼。我幾乎可以保證,這可能是因爲編寫不好的代碼而發生的。例如:

materialID = Sheets("Material").Cells(r, "CQ").Address(False, False) 
materialYear = Sheets("Material").Cells(2, c).Address(False, False) 

注意materialIDmaterialYear從不聲明。這意味着它們屬於Variant類型(出於這個原因,您需要將Option Explicit添加到代碼模塊的頂部)。關於變體的有趣之處在於,他們,你猜對了,各不相同。 MaterialID可能是一個string,一個int,一個long,一個decimal,一個date,一個array,一個range等。我們可以假設範圍內的地址進入materialID,但我們不能確定。

此外,請注意討厭Sheets("Material")。這實際上是說ActiveWorkboook.Sheets(「材料」)。確認你的參考資料,否則你幾乎不知道什麼實際上發生。

在您的代碼中很容易發生的情況是,該地址正確地作爲string進入materialID,但它是來自另一個工作簿的名爲「材料」表的地址。不太可能,但可能。

我們所知道的很可能是ActiveWorkbook在某種程度上發生了變化,可能在Sub_Routine7(這裏的旁註中,您必須描述性地命名子例程,否則您的代碼遠不是可維護性)。

祝你好運,但我強烈建議不要試圖調試的情況,直到你有合格的範圍,宣佈所有變量,並添加Option Explicit

+0

謝謝@Brandon!抱歉誤解編號的子程序不是它們用於僞代碼插圖目的的實際名稱。我最終通過添加對材質公式所引用的活動工作簿頁面的引用來工作。 – BWMustang13