You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA用户窗体中巴西州对应数值无法传递至模块的问题

问题:巴西州选择的数值无法传递到模块,返回0或空值

我创建了一个包含巴西州选择控件的UserForm,通过Case语句将州名映射为对应数值,但该数值无法传递到模块,返回值始终为0或空。

用户代码

UserForm1代码

Private Sub UserForm_Initialize()

    Box_Estados.AddItem "Acre"
    Box_Estados.AddItem "Alagoas"
    Box_Estados.AddItem "Amapá"
    Box_Estados.AddItem "Amazonas"
    Box_Estados.AddItem "Bahia"
    Box_Estados.AddItem "Ceará"
    Box_Estados.AddItem "Distrito Federal"
    Box_Estados.AddItem "Espírito Santo"
    Box_Estados.AddItem "Goiás"
    Box_Estados.AddItem "Maranhão"
    Box_Estados.AddItem "Mato Grosso"
    Box_Estados.AddItem "Mato Grosso do Sul"
    Box_Estados.AddItem "Minas Gerais"
    Box_Estados.AddItem "Pará"
    Box_Estados.AddItem "Paraíba"
    Box_Estados.AddItem "Paraná"
    Box_Estados.AddItem "Pernambuco"
    Box_Estados.AddItem "Piauí"
    Box_Estados.AddItem "Rio de Janeiro"
    Box_Estados.AddItem "Rio Grande do Norte"
    Box_Estados.AddItem "Rio Grande do Sul"
    Box_Estados.AddItem "Rondônia"
    Box_Estados.AddItem "Roraima"
    Box_Estados.AddItem "Santa Catarina"
    Box_Estados.AddItem "São Paulo"
    Box_Estados.AddItem "Sergipe"
    Box_Estados.AddItem "Tocantins"
    
End Sub

Private Sub Button_Prosseguir_Click()

    Dim tempEstado As Integer
    Select Case Box_Estados.Value
        Case "Acre"
            tempEstado = 1
        Case "Alagoas"
            tempEstado = 2
        Case "Amapá"
            tempEstado = 4
        Case "Amazonas"
            tempEstado = 3
        Case "Bahia"
            tempEstado = 5
        Case "Ceará"
            tempEstado = 6
        Case "Distrito Federal"
            tempEstado = 7
        Case "Espírito Santo"
            tempEstado = 8
        Case "Goiás"
            tempEstado = 9
        Case "Maranhão"
            tempEstado = 10
        Case "Mato Grosso"
            tempEstado = 13
        Case "Mato Grosso do Sul"
            tempEstado = 12
        Case "Minas Gerais"
            tempEstado = 11
        Case "Pará"
            tempEstado = 14
        Case "Paraíba"
            tempEstado = 15
        Case "Paraná"
            tempEstado = 18
        Case "Pernambuco"
            tempEstado = 16
        Case "Piauí"
            tempEstado = 17
        Case "Rio de Janeiro"
            tempEstado = 19
        Case "Rio Grande do Norte"
            tempEstado = 20
        Case "Rio Grande do Sul"
            tempEstado = 23
        Case "Rondônia"
            tempEstado = 21
        Case "Roraima"
            tempEstado = 22
        Case "Santa Catarina"
            tempEstado = 24
        Case "São Paulo"
            tempEstado = 26
        Case "Sergipe"
            tempEstado = 25
        Case "Tocantins"
            tempEstado = 27
    End Select

    tempUser = TextBox_Login.Text
    tempPass = TextBox_Senha.Text
    tempDtFinal = dtFinalBox.Text
    
    Unload Me

End Sub

Module1代码

Public tempUser As String
Public tempPass As String
Public tempDtFinal As String
Public tempEstado As Integer

UserForm1.Show vbModeless

Do While UserForm1.Visible
    DoEvents
Loop

Login = tempUser
Senha = tempPass
DataFinal = tempDtFinal
Estado = tempEstado

期望效果:

  • 用户选择Tocantins,tempEstado应等于27
  • 用户选择Rondônia,tempEstado应等于21

解决方案

1. 修复变量覆盖问题

UserForm中声明了局部变量tempEstado,与模块中的公共变量同名,导致赋值仅在局部生效,未更新公共变量。删除UserForm中的局部变量声明,直接使用模块的公共变量:

修改后的Button_Prosseguir_Click代码:

Private Sub Button_Prosseguir_Click()
    ' 移除局部变量Dim tempEstado As Integer,直接使用模块公共变量
    Select Case Box_Estados.Value
        Case "Acre"
            tempEstado = 1
        Case "Alagoas"
            tempEstado = 2
        Case "Amapá"
            tempEstado = 4
        Case "Amazonas"
            tempEstado = 3
        Case "Bahia"
            tempEstado = 5
        Case "Ceará"
            tempEstado = 6
        Case "Distrito Federal"
            tempEstado = 7
        Case "Espírito Santo"
            tempEstado = 8
        Case "Goiás"
            tempEstado = 9
        Case "Maranhão"
            tempEstado = 10
        Case "Mato Grosso"
            tempEstado = 13
        Case "Mato Grosso do Sul"
            tempEstado = 12
        Case "Minas Gerais"
            tempEstado = 11
        Case "Pará"
            tempEstado = 14
        Case "Paraíba"
            tempEstado = 15
        Case "Paraná"
            tempEstado = 18
        Case "Pernambuco"
            tempEstado = 16
        Case "Piauí"
            tempEstado = 17
        Case "Rio de Janeiro"
            tempEstado = 19
        Case "Rio Grande do Norte"
            tempEstado = 20
        Case "Rio Grande do Sul"
            tempEstado = 23
        Case "Rondônia"
            tempEstado = 21
        Case "Roraima"
            tempEstado = 22
        Case "Santa Catarina"
            tempEstado = 24
        Case "São Paulo"
            tempEstado = 26
        Case "Sergipe"
            tempEstado = 25
        Case "Tocantins"
            tempEstado = 27
    End Select

    tempUser = TextBox_Login.Text
    tempPass = TextBox_Senha.Text
    tempDtFinal = dtFinalBox.Text
    
    Unload Me
End Sub

2. 优化窗体显示逻辑(可选)

模块中使用vbModal模态显示窗体,无需循环等待,代码更简洁:

Public tempUser As String
Public tempPass As String
Public tempDtFinal As String
Public tempEstado As Integer

UserForm1.Show vbModal ' 模态显示,窗体关闭后自动执行后续代码

Login = tempUser
Senha = tempPass
DataFinal = tempDtFinal
Estado = tempEstado

3. 高效替代方案:用ItemData绑定数值(推荐)

初始化时直接给每个州绑定对应数值,避免大量Case语句,维护更方便:

修改UserForm_Initialize代码:

Private Sub UserForm_Initialize()
    With Box_Estados
        .AddItem "Acre": .ItemData(.ListCount - 1) = 1
        .AddItem "Alagoas": .ItemData(.ListCount - 1) = 2
        .AddItem "Amapá": .ItemData(.ListCount - 1) = 4
        .AddItem "Amazonas": .ItemData(.ListCount - 1) = 3
        .AddItem "Bahia": .ItemData(.ListCount - 1) = 5
        .AddItem "Ceará": .ItemData(.ListCount - 1) = 6
        .AddItem "Distrito Federal": .ItemData(.ListCount - 1) = 7
        .AddItem "Espírito Santo": .ItemData(.ListCount - 1) = 8
        .AddItem "Goiás": .ItemData(.ListCount - 1) = 9
        .AddItem "Maranhão": .ItemData(.ListCount - 1) = 10
        .AddItem "Mato Grosso": .ItemData(.ListCount - 1) = 13
        .AddItem "Mato Grosso do Sul": .ItemData(.ListCount - 1) = 12
        .AddItem "Minas Gerais": .ItemData(.ListCount - 1) = 11
        .AddItem "Pará": .ItemData(.ListCount - 1) = 14
        .AddItem "Paraíba": .ItemData(.ListCount - 1) = 15
        .AddItem "Paraná": .ItemData(.ListCount - 1) = 18
        .AddItem "Pernambuco": .ItemData(.ListCount - 1) = 16
        .AddItem "Piauí": .ItemData(.ListCount - 1) = 17
        .AddItem "Rio de Janeiro": .ItemData(.ListCount - 1) = 19
        .AddItem "Rio Grande do Norte": .ItemData(.ListCount - 1) = 20
        .AddItem "Rio Grande do Sul": .ItemData(.ListCount - 1) = 23
        .AddItem "Rondônia": .ItemData(.ListCount - 1) = 21
        .AddItem "Roraima": .ItemData(.ListCount - 1) = 22
        .AddItem "Santa Catarina": .ItemData(.ListCount - 1) = 24
        .AddItem "São Paulo": .ItemData(.ListCount - 1) = 26
        .AddItem "Sergipe": .ItemData(.ListCount - 1) = 25
        .AddItem "Tocantins": .ItemData(.ListCount - 1) = 27
    End With
End Sub

简化后的Button_Prosseguir_Click代码:

Private Sub Button_Prosseguir_Click()
    ' 直接获取选中项绑定的数值
    tempEstado = Box_Estados.ItemData(Box_Estados.ListIndex)
    
    tempUser = TextBox_Login.Text
    tempPass = TextBox_Senha.Text
    tempDtFinal = dtFinalBox.Text
    
    Unload Me
End Sub

内容的提问来源于stack exchange,提问作者Ropelato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:56:06