VBA中主程序无法收到用户窗体的值

VBA中主程序无法收到用户窗体回传的值,请问这是哪里写错了啊
原来用的Msgbox,可以在名单右侧记录点名结果,换成用户窗体就不行了


```vb.net
Public Sub 点名模拟()

Dim result As String
Sheets("点名").Select

'清空点名结果
Range("C13:C26").ClearContents

 

'按顺序点名
For i = 13 To 26
    
    UserForm1.Label1.Caption = Range("B" & i).Value
    UserForm1.Show

Select Case resultValue
    Case "Yes"   '出勤
    Range("C" & i).Value = "出勤"
    Case "Cancel"    '请假
    Range("C" & i).Value = "请假"
    Case "No"    '迟到
    Range("C" & i).Value = "迟到"
End Select

Next i


End Sub




Public resultValue As String

Private Sub CommandButton1_Click()
resultValue = "Yes"
Unload Me


End Sub


Private Sub CommandButton2_Click()
  
    resultValue = "Yes"
    Unload Me
End Sub

Private Sub CommandButton3_Click()
    
    resultValue = "Yes"
    Unload Me
End Sub

```

Select Case resultValue
->
Select Case UserForm1.resultValue
另外,不要 Unload Me,换成 Me.Hide 看看

有两处问题,变量跨模块没有加对象,销毁的对象不能访问其属性。参考下面代码修改:


    Public Sub 点名模拟()

        Dim result As String
        Sheets("点名").Select

        '清空点名结果
        Range("C13:C26").ClearContents



        '按顺序点名
        For i = 13 To 26

            UserForm1.Label1.Caption = Range("B" & i).Value
            UserForm1.Show

            Select Case UserForm1.resultValue
                Case "Yes"   '出勤
                    Range("C" & i).Value = "出勤"
                Case "Cancel"    '请假
                    Range("C" & i).Value = "请假"
                Case "No"    '迟到
                    Range("C" & i).Value = "迟到"
            End Select

        Next i


    End Sub



Public resultValue As String
 
Private Sub CommandButton1_Click()
resultValue = "Yes"
Me.Hide
 
 
End Sub
 
 
Private Sub CommandButton2_Click()
  
    resultValue = "Yes"
 Me.Hide
End Sub
 
Private Sub CommandButton3_Click()
    
    resultValue = "Yes"
  Me.Hide
End Sub
 
Private Sub UserForm_Click()

End Sub


是不是要先 关闭前执行事件:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/263177
  • 以下回答来自chatgpt:

    在VBA中,收到用户窗体回传的值需要使用函数来获取,常用的函数是InputBox和UserForm。如果使用MsgBox来展示用户窗体,就只是单向的展示一个信息,无法获取用户的输入值。

    如果使用InputBox函数,可以使用以下代码:

    Sub GetInputValue()
        Dim inputValue As String
        inputValue = InputBox("请输入您的值:")
        MsgBox "您输入的值是:" & inputValue
    End Sub
    

    如果使用UserForm,可以先新建一个UserForm,添加一个TextBox来接受用户输入的值,再添加一个Button来确认输入值并关闭窗体。代码如下:

    在模块中添加以下代码:

    Sub ShowUserForm()
        UserForm1.Show
    End Sub
    
    Function GetInputValue() As String
        GetInputValue = UserForm1.TextBox1.Value
    End Function
    

    在UserForm1的代码中,添加以下代码:

    Private Sub CommandButton1_Click()
        Unload Me
    End Sub
    

    这样,在主程序中调用ShowUserForm函数即可展示用户窗体,同时通过GetInputValue函数获取用户输入的值。

    如果仍然无法收到值,可能需要检查用户窗体的代码是否正确,特别是确认按钮的代码是否正确保存输入值并关闭窗体。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

用户窗体被卸载了,resultValue变量就失去了对用户窗体的引用,所以无法真正接收到返回值。