2017-06-21 17 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を追加する必要があります)。 Variantsについての面白いことは、あなたがそれを推測し、変えたということです。 MaterialIDstringintlongdecimaldatearrayrange、など私たちは、範囲のアドレスがmaterialIDに起こっていることを前提とすることができますすることができ、私たちは、特定することはできません。

さらに、厄介なのは、Sheets("Material")です。これが実際に言っているのはActiveWorkboook.Sheets( "Material") `です。あなたの参照を修飾しないと、が実際にとなっています。

あなたのコードの場合には、アドレスがmaterialIDとしてstringに正しく入っていますが、「材料」という名前の別のブックからのアドレスです。おそらく、しかし可能です。

ActiveWorkbookがある程度容量が変更されている可能性があります。Sub_Routine7にある可能性があります(ここでは、サブルーチンに名前を付ける必要があります。

幸いですが、範囲を限定してすべての変数を宣言し、Option Explicitを追加するまで状況をデバッグしようとするのは迷惑です。

+0

ありがとう@Brandon!誤解をおかけして申し訳ありませんが、番号の付いたサブルーチンは実際の名前ではなく、疑似コードの説明用です。最終的には、材料式が参照しているアクティブなワークブックページへの参照を追加することで機能するようになりました。 – BWMustang13

関連する問題