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
相关产品推荐
相关产品推荐

