将数据加载到变量用户表单和控件中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将数据加载到变量用户表单和控件中相关的知识,希望对你有一定的参考价值。

我有一个代码在excel表(T_List)中的表上运行。代码的目的是将数据从tabl加载到用户表单控件。用户表单和控件是可验证的。代码在打开时会卡住: 用户窗体(窗体名称).Show 并且错误按摩是“类型不匹配”:

Public Sub Load_Data_to_Form()
Dim T_Test As Integer
Dim CurrRaw As Integer
Dim CurrValue As String
Dim FormName As String
Dim Control_Yes As String
Dim Control_No As String

T_Test = Sheets("T_list").Range("T1").Value   'Total raws in excel table
CurrRaw = Sheets("T_list").Range("N7").Value   'current raw

For i = 1 To T_Test 'running on test parameter table
    CurrValue = Sheets("Test_Data").Range("D_Start").Offset(CurrRaw, i + 7).Value
    FormName = Sheets("T_list").Range("T_Start").Offset(i, 6).Value
    Control_Yes = Sheets("T_list").Range("T_Start").Offset(i, 4).Value
    Control_No = Sheets("T_list").Range("T_Start").Offset(i, 5).Value

If CurrValue = "Pass" Then
   UserForms(FormName).Show     '---> **the code stuck here**
   UserForms(FormName).Controls(Control_Yes) = True
   UserForms(FormName).Controls(Control_No) = False
ElseIf CurrValue = "Fail" Then
   UserForms(FormName).Show
   UserForms(FormName).Controls(Control_Yes) = False
   UserForms(FormName).Controls(Control_No) = True 
End If
Next
End Sub

我做错了什么?如何调用要打开的变量userform并将值保存到其控件中?

答案

这个对我有用 - 用于引用MSForms.UserForm对象。但需要额外的权限。

Excel选项>信任中心>宏设置>信任对VBA项目对象模型的访问权限

下面的函数返回与输入名称匹配的userform对象。

Public Function UserForms(FormName As String)
    Dim c As Object
    For Each c In ThisWorkbook.VBProject.VBComponents
        If c.Type = 3 And c.Name = FormName Then
            Set UserForms = c
            Exit For
        End If
    Next
End Function

并修改您的代码如下:

Dim frm As Object
Set frm = UserForms(FormName)

If CurrValue = "Pass" Then
   frm.Show
   frm.Controls(Control_Yes) = True
   frm.Controls(Control_No) = False
ElseIf CurrValue = "Fail" Then
   frm.Show
   frm.Controls(Control_Yes) = False
   frm.Controls(Control_No) = True
End If
另一答案

UserForms.Add方法 - 没有附加功能。

Dim frm As Object
Set frm = UserForms.Add(FormName)

If CurrValue = "Pass" Then
   frm.Show
   frm.Controls(Control_Yes) = True
   frm.Controls(Control_No) = False
ElseIf CurrValue = "Fail" Then
   frm.Show
   frm.Controls(Control_Yes) = False
   frm.Controls(Control_No) = True
End If
另一答案

由于我的组织策略阻止了“信任访问VBA项目对象模型”选项,并且我无法使用下面建议的UserForms(FormName)函数,我通过使用保存用户表单名称的数组解决了问题。这是我的代码:

Public Sub Load_Data_to_Form()
Dim T_Test As Integer
Dim CurrRaw As Integer
Dim CurrValue As String
Dim FormName As String
Dim Control_Yes As String
Dim Control_No As String
Dim FormArray As Variant 'define array which hold userforms names
FormArray = Array(Test_Procedure1, Test_Procedure2, Test_Procedure3, Test_Procedure4)

T_Test = Sheets("T_list").Range("T1").Value   'Total raws in excel table
CurrRaw = Sheets("T_list").Range("N7").Value   'current raw

For i = 1 To T_Test 'running on test parameter table
    CurrValue = Sheets("Test_Data").Range("D_Start").Offset(CurrRaw, i + 7).Value
    FormName = Sheets("T_list").Range("T_Start").Offset(i, 6).Value
    Control_Yes = Sheets("T_list").Range("T_Start").Offset(i, 4).Value
    Control_No = Sheets("T_list").Range("T_Start").Offset(i, 5).Value

    For j = 0 To 3 'Running on 4 values in the FormArray
      If FormName = FormArray(j).Name Then

         If CurrValue = "Pass" Then
            FormArray(j).Controls(Control_Yes) = True
            FormArray(j).Controls(Control_No) = False
         ElseIf CurrValue = "Fail" Then
            FormArray(j).Controls(Control_Yes) = False
            FormArray(j).Controls(Control_No) = True 
         End If
       End If
     Next
Next
Test_Procedure1.Show '(show the first form and the for rest form the user can press on button 'next' in each form..)

End Sub

以上是关于将数据加载到变量用户表单和控件中的主要内容,如果未能解决你的问题,请参考以下文章

Java中代码的执行顺序

创建自定义控件并将其加载到 FormView

C# 使用表单加载其他用户控件并访问基本控件或属性

MVVM 模式中代码隐藏的实用使用

winforms - 表单加载期间带有dockstyle填充的用户控件大小不正确

Tutorial中代码的区别及不同效果