【问题标题】:Unable to Call Subroutine无法调用子程序
【发布时间】:2015-11-19 05:49:41
【问题描述】:

如果用户在用户表单中输入有效的周数,我将无法调用 sub BCD。如果用户输入的周数无效或为空,则执行子 BCD。

我的代码有什么问题?

Private Sub cmdOK1_Click()

Call ABC
Call BCD

End Sub

Sub ABC()

'Prompt message box when week number is empty
    If Me.txtWeekNo.Value = "" Then
        MsgBox "Please enter week number to print.", vbExclamation, "Print Work Order by Schedule"
        Me.txtWeekNo.SetFocus
        Exit Sub
    End If

'Check for valid week number
LColumn = Worksheets("RIG PMS").Cells(5, Worksheets("RIG PMS").Columns.Count).End(xlToLeft).Column 'Define last column in week number
Set WeekNoRng = Worksheets("RIG PMS").Range(Cells(5, 10), Cells(5, LColumn))
    If WorksheetFunction.CountIf(WeekNoRng, txtWeekNo.Value) = 0 Then
         MsgBox "Invalid Week Number"
         Exit Sub
        Else
            Unload UserForm1
    End If

    'Determine Column
        For i = 10 To LColumn
            If WorksheetFunction.CountIf(Worksheets("RIG PMS").Cells(5, i), txtWeekNo.Value) > 0 Then
                Acolumn = i
            End If
        Next i

LRow = Worksheets("RIG PMS").Cells(Rows.Count, "I").End(xlUp).Row
Set OpenWORng = Worksheets("Open WO").Range("B3:B" & Worksheets("Open WO").Range("B" & Rows.Count).End(xlUp).Row)

    For a = 7 To LRow Step 3
        AA = 0
        If Worksheets("RIG PMS").Cells(a, Acolumn).Value <> "" And Worksheets("RIG PMS").Cells(a, Acolumn - 2).Value = 1 Then
            b = Worksheets("RIG PMS").Cells(a, 7).Value
            Worksheets("Power Pack Monthly").Range("C5").Value = Worksheets("RIG PMS").Cells(a - b, 2).Value 'Asset Code
            Worksheets("Power Pack Monthly").Range("C6").Value = Worksheets("RIG PMS").Cells(a - b, 3).Value 'Description
            Worksheets("Power Pack Monthly").Range("P5").Value = Worksheets("RIG PMS").Cells(a, Acolumn).Value 'WO
            Worksheets("Power Pack Monthly").Range("P6").Value = Worksheets("RIG PMS").Cells(a + 1, Acolumn).Value 'Proposed Date
            AA = 1
        End If

        If Worksheets("RIG PMS").Cells(a, Acolumn).Value <> "" And Worksheets("RIG PMS").Cells(a, Acolumn - 2).Value = 2 Then
            b = Worksheets("RIG PMS").Cells(a, 7).Value
            Worksheets("Power Pack 6 Monthly").Range("C5").Value = Worksheets("RIG PMS").Cells(a - b, 2).Value 'Asset Code
            Worksheets("Power Pack 6 Monthly").Range("C6").Value = Worksheets("RIG PMS").Cells(a - b, 3).Value 'Description
            Worksheets("Power Pack 6 Monthly").Range("P5").Value = Worksheets("RIG PMS").Cells(a, Acolumn).Value 'WO
            Worksheets("Power Pack 6 Monthly").Range("P6").Value = Worksheets("RIG PMS").Cells(a + 1, Acolumn).Value 'Proposed Date
            AA = 1
        End If

    'Copy Open WO to Open WO Sheet
         If WorksheetFunction.CountIf(OpenWORng, Worksheets("RIG PMS").Cells(a, Acolumn).Value) = 0 And AA = 1 Then
            Worksheets("Open WO").Range("B" & Worksheets("Open WO").Range("B" & Rows.Count).End(xlUp).Row + 1).Value = Worksheets("RIG PMS").Cells(a, Acolumn).Value 'WO No.
            Worksheets("Open WO").Range("C" & Worksheets("Open WO").Range("C" & Rows.Count).End(xlUp).Row + 1).Value = Worksheets("RIG PMS").Cells(a - b, 2).Value 'Asset Code
            Worksheets("Open WO").Range("D" & Worksheets("Open WO").Range("D" & Rows.Count).End(xlUp).Row + 1).Value = Worksheets("RIG PMS").Cells(a - b, 3).Value 'Asset Description
            Worksheets("Open WO").Range("E" & Worksheets("Open WO").Range("D" & Rows.Count).End(xlUp).Row).Value = 1 'For trigger purpose
        End If

        If a = LRow - 2 Then
            MsgBox "Continue"
            Exit Sub
        End If
    Next a

End Sub

Sub BCD()

   MsgBox "ABC"

End Sub

【问题讨论】:

  • 你的代码应该在命令按钮中
  • 调用 BCD 会插入到 sub ABC 的底部,然后只有在 sub BCD 中的所有条件都被确认后才播放
  • Fabrizio,我确实在 sub ABC 的底部插入了 call BCD,但它仍然不起作用
  • 我没有你的文件,所以我无法测试它,但是如果你在 sub ABC 的底部插入 BCD,并且你已经删除了 cmdOK1_Click() 上的调用 BCD,则它是合乎逻辑的sub BCD 仅在您检查的条件为真时运行。
  • @cklim 你试过提供的答案吗?

标签: excel excel-2010 subroutine vba


【解决方案1】:

错误重现:通过将所有程序发布在UserFormCodeModule 中,我能够重现问题中提到的行为。

行为原因:第二个过程 BCD 在周数有效时未运行,因为 UserFrom 已按照此行卸载:

Unload UserForm1

Unload Statement的评论说:

备注:当一个对象被卸载时,它会从内存中移除,所有 与对象关联的内存被回收。直到放入 内存再次使用 Load 语句,用户无法与 对象,并且无法以编程方式操作该对象。

解决方案:虽然有几种解决方案适用,但我认为最简单的方法是将过程 BCD 移至标准模块 - 已测试

其他解决方案:

  • 将两个过程移出UserForm,但必须限定对UserForm 中对象的所有引用(即将Me 替换为UserForm1,并且必须限定对TxtWeekNo 的引用如UserForm1.TxtWeekNo) - 测试

  • 改为隐藏用户表单并在cmdOK1_Click 过程结束时将其卸载。

  • 可能还有很多其他人。

【讨论】:

    【解决方案2】:

    代码在表单的类模块中。它应该在标准模块中。

    【讨论】:

    • shg 和 Davesexcel :不,我不需要在命令按钮代码中,也不需要在单独的模块中。您可以从同一工作簿中的任何位置调用它(如果不是私有子)。顺便说一句,您说“我的代码无法调用子 BCD”,意思是错误消息、无限循环、代码停止、....??我的建议,在 ABC 中添加一个简单的断点并逐步调试(F8 键)...
    • Patrick,执行此代码时不会弹出错误。我使用 F8 进行逐步调试。它按预期适用于 Sub ABC。 MsgBox "Continue" 也确实弹出然后它跳回 Private Sub cmdOK1_Click() 并在 Private Sub 中进入 Sub Call 然后直接转到 End Sub 而不是跳转到 Sub BCD 以弹出 MsgBox "ABC"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2010-10-13
    • 2016-03-05
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    相关资源
    最近更新 更多