VBA向Userform传递字符串触发Run-time Error 438如何解决?
错误原因
你的代码一共有5处核心问题,全部会触发438错误:
- 变量声明类型错误:Sheet1中
Dim myForm As UserForm声明的是通用VBA窗体类型,通用类型不包含你自定义的txtBoxVal、update、txtBoxVal2方法,调用自定义方法时直接报错。 - 属性定义逻辑错误:
txtBoxVal2是Property Get(取值属性),不需要接收传入参数,你既加了入参又没有给属性赋值返回值,调用逻辑完全错误。 - 控件属性缺失:给文本框
MyMessageBox赋值时漏写.Text属性,直接写MyMessageBox = inString会尝试调用控件不存在的默认属性触发报错。 - 跨模块变量引用错误:UserForm的
update方法里引用的publicStrVarDeclaredInFunction不存在,你在Sheet1定义的公共变量名称是publicVar,跨模块调用需要加模块前缀Sheet1.publicVar。 - 方法调用参数不匹配:你定义的
update是无参方法,调用时传入了publicVar参数,参数数量不匹配触发报错。
修复方案
第一步:先配置UserForm控件属性
选中窗体里的MyMessageBox文本框,在属性面板设置两个参数:
MultiLine设为TrueScrollBars设为2 - fmScrollBarsVertical,即可实现纵向滚动条
第二步:修正UserForm端代码
Dim inString As String ' 方案1:普通方法传值 Sub txtBoxVal(passedStr As String) inString = passedStr MyMessageBox.Text = inString End Sub ' 方案2:属性传值(不需要可以删掉) Public Property Let txtBoxVal2(passedStr As String) inString = passedStr MyMessageBox.Text = inString End Property ' 方案3:读取公共变量更新(不需要可以删掉) Public Sub update() MyMessageBox.Text = Sheet1.publicVar End Sub Private Sub UserForm_Initialize() End Sub
第三步:修正Sheet1端代码
Public publicVar As String Private Sub userformTest() ' 声明为你自定义的窗体类型,不是通用UserForm Dim myForm As MyUserForm Dim testString As String testString = "This is a test string" ' 给公共变量赋值,否则方案3拿到的是空值 publicVar = testString Set myForm = New MyUserForm With myForm ' 三个方案选一个用就行,不用全写 ' 方案1调用 Call .txtBoxVal(testString) ' 方案2调用 .txtBoxVal2 = testString ' 方案3调用 Call .update .Show End With Set myForm = Nothing End Sub
内容的提问来源于stack exchange,提问作者Revman
相关产品推荐
相关产品推荐

