从另一个子例程

时间:2017-06-21 17:45:30

标签: excel vba excel-vba

我正在使用VBA尝试从主子例程调用一系列子例程。当我将所有子程序与类似于以下的代码组合在一起时,对于公式假定忽略的单元格,我得到#N / A.

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

当我从Main子例程中删除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

我做错了什么?当我手动并独立选择它时它如何正常运行但是当我将它与其他子例程结合时它会失败?

1 个答案:

答案 0 :(得分:1)

在其他任何事情之前,您需要改进代码。我几乎可以保证,由于代码写得不好,可能会发生这种情况。例如:

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

请注意,永远不会声明materialIDmaterialYear。这意味着它们属于Variant类型(出于这个原因,您需要将Option Explicit添加到代码模块的顶部)。关于Variants的有趣之处在于,你猜对了,它们各不相同。 MaterialID可以是stringintlongdecimaldatearrayrange等我们可以假设范围的地址进入materialID,但我们无法确定。

另外,请注意讨厌的Sheets("Material")。这实际上是说ActiveWorkboook.Sheets(" Material")`。鉴定您的参考资料,否则您几乎不知道实际正在发生什么。

在代码的情况下,很容易发生的事情是地址作为materialID正确地进入string,但它是来自另一个工作簿的地址,其中包含名为&#34的工作表;材料&#34 ;.不太可能,但可能。

我们所知道的很可能是ActiveWorkbook正在以某种身份发生变化,可能在Sub_Routine7中(旁边这里,你必须描述性地命名子程序,否则你的代码远不能保持可维护性)。 / p>

祝你好运,但我强烈建议在你确定你的范围,声明所有变量并添加Option Explicit之前,不要试图调试情况。