首页 > 解决方案 > 在 VBA 中传递值

问题描述

在我发布的代码中,我使用的是一个名为“ ACDS Test”的复选框,每当检查它时会创建一个工作表,然后在未选中时,它将调用上部功能并删除表格。

我正在尝试添加一个消息框,该消息框基本上像故障保险一样工作,以确保他们想要删除该页面。如果他们说他们不想删除该页面,那么我希望复选框保持选中状态。

出于某种原因,当我尝试传递值以确保复选框保持选中状态时,我收到此错误消息,但我无法弄清楚原因。

错误出现在行: Sub ACDSTest_Click(CorrectValue As Integer) 并且具体错误是:“编译错误:过程声明与具有相同名称的事件或过程的描述不匹配”。

任何帮助深表感谢!如果需要更多说明,请随时询问!

Sub DeleteWorksheet(NameSheet As String)

    Dim Ans As Long
    Dim t As String
    Dim CorrectValue As Integer
    Dim i As Long, k As Long
    k = Sheets.Count


    Ans = MsgBox("Would you like to take this test off of the form?", vbYesNo)
    Select Case Ans
        Case vbYes
            'Code reads through each page and finds one with corresponding name to string t
            'Once it finds the correct page, it deletes it
            For i = k To 1 Step -1
                t = Sheets(i).Name
                If t = NameSheet Then
                    Sheets(i).Delete
                End If
            Next i
            CorrectValue = 0
        Case vbNo
            CorrectValue = 1
    End Select

End Sub

Sub ACDSTest_Click(CorrectValue As Integer)

    Dim NameSheet As String
    Dim NameValue As String
    NameSheet = "ACDS"
    NameValue = "ACDS Test"

    If ACDSTest.Value = True Then
        CreateWorksheet (NameSheet), (NameValue)
        Worksheets("Sheet1").Activate
    Else
        DeleteWorksheet (NameSheet)
        If CorrectValue = 1 Then
            ActiveSheet.Shapes("ACDS Test").ControlFormat.Value = 1
        End If
    End If

End Sub

标签: vbaexcel

解决方案


这里的问题是,CorrectValue您在其中定义DeleteWorksheet的变量不存在于变量的上下文中,也不存在于ACDSTest_Click子例程的上下文中。这是因为在子例程或函数中定义的变量对于这些函数是局部的。为了纠正这个问题,我将转换DeleteWorksheet为如下所示的函数。

此外,触发的事件Private Sub ACDSTest_Click()无法处理将值传递给该函数,因此将其更改为Sub ACDSTest_Click(CorrectValue As Integer)会导致错误。

Function DeleteWorksheet(ByVal SheetName As String) As Boolean
    On Error GoTo SheetDNE
        SheetName = Sheets(SheetName).Name 'Check if sheet exists w/o other objects
    On Error GoTo 0
    Select Case MsgBox("Would you like to take this test off of the form?", vbYesNo)
        Case vbYes
            Application.DisplayAlerts = False
            Sheets(SheetName).Delete
            Application.DisplayAlerts = True
            DeleteWorksheet = True
        Case Else: DeleteWorksheet = False
    End Select
    Exit Function 'Exit The Function w/o error
SheetDNE:   'Sheet Does Not Exist
    MsgBox "The indicated sheet, " & SheetName & ", does not exist", vbOKOnly
End Function

Private Sub ACDSTest_Click()

    Dim NameSheet As String
    Dim NameValue As String
    NameSheet = "ACDS"
    NameValue = "ACDS Test"

    If ACDSTest.Value = True Then
        CreateWorksheet (NameSheet), (NameValue)
        Worksheets("Sheet1").Activate
    Else 
        If Not DeleteWorksheet(NameSheet) Then _ 
            ActiveSheet.Shapes("ACDS Test").ControlFormat.Value = 1
    End If

End Sub

推荐阅读