下午好,所以我已经分配了一个任务,我应该使用我制作的日历用户表格,并实现根据需要复制多个用户表单上的标签所需的日历。
我的问题是:是否有可能动态地这样做?我将所有控件复制到另一个选项卡上进行测试,但所有控件按钮都被重命名,我无法将它们命名为与“母版页”上的按钮相同的名称,因为命名时出现歧义错误一个用户表单上的2个按钮相同。
我可以使用新的按钮名称编写新代码,但这不能动态完成,因为添加了新选项卡,我必须在创建之前准备好代码。
非常感谢任何帮助。
答案 0 :(得分:1)
处理此类问题的关键是创建一个类来保存对新创建的控件的引用。使用WithEvents
将允许您处理引用控件的事件。
在此处阅读WithEvents
:Events And Event Procedures In VBA
为了完成这项工作,您必须在新创建的Set
控件和他们班级中的分机之间进行Page
引用。您还需要通过将类引用添加到全局集合,字典或数组来保持类引用的活动。
在我的示例中,我创建了一个子例程,它将遍历模板页面控件,创建并复制声明变量所需的代码并将引用设置为Windows ClipBoard。
最后一步是将事件代码从Userform复制到类模块中。
下载Demo Workbook代码示例。
或者,您可以使用Multipage
控件替换TabStrip
控件。不同之处在于,您可以在所有TabStrip
的{{1}}范围内拥有控件。您可以使用Tabs
根据所选选项卡(TabStrip1.SelectedItem)更新控件。
答案 1 :(得分:1)
首先,我建议看Thomas Inzina的回答。 但是,在我的一个工作表中,我做了同样的事情而不依赖于WithEvents,所以我想展示替代方法。
此方法按预定格式设置控件名称(例如“Input1_”(计数器+ 1)),以便从其他操作中轻松引用控件。
控件本身位于具有设置标题的框架内,因此我可以在复制后引用它们。
我已经对代码进行了一些编辑,因为我从更长的程序中剥离了代码,但希望它仍然完好无损。
Dim Ctrl As msforms.Control
Dim Mpage As msforms.Control
Dim Ctrl2 As msforms.Control
Dim pge As msforms.Page
Dim L As Double, R As Double
Dim PageName As String, PageTitle As String
Dim counter As Long
counter = 0
Set Mpage = Me.Controls("Multipage_1") 'set Multipage
'count current number of tabs within MPage
For Each pge In Mpage.Pages
counter = counter + 1
Next pge
'set name/title for new page
PageName = "Tab_" & (counter + 1)
PageTitle = "Tab " & (counter + 1)
With Mpage 'add tab
.Pages.Add PageName, PageTitle
.Pages(0).Controls.Copy
.Pages(counter).Paste
End With
'get position of original frame (controls are within this frame)
For Each Ctrl In Mpage.Pages(0).Controls
If TypeOf Ctrl Is msforms.Frame Then
L = Ctrl.Left
R = Ctrl.Top
Exit For
End If
Next
'apply position to new frame
For Each Ctrl In Mpage.Pages(counter).Controls
If TypeOf Ctrl Is msforms.Frame Then
Ctrl.Left = L
Ctrl.Top = R
Exit For
End If
Next
'renames input-controls and removes copied values by looping through frames
'that contain the controls, since frame-captions can be duplicates
For Each Ctrl In Mpage.Pages(counter).Controls
If TypeOf Ctrl Is msforms.Frame Then
Select Case Ctrl.Caption
Case "Input1"
For Each Ctrl2 In Ctrl.Controls
Ctrl2.Name = "Input1_" (counter + 1)
Ctrl2.Text = ""
Next Ctrl2
Case "Input2"
For Each Ctrl2 In Ctrl.Controls
Ctrl2.Name = "Input2_" (counter + 1)
Ctrl2.Text = ""
Next Ctrl2
Case "Input3"
For Each Ctrl2 In Ctrl.Controls
Ctrl2.Name = "Input3_" (counter + 1)
Ctrl2.Text = ""
Next Ctrl2
End Select
End If
Next Ctrl
答案 2 :(得分:0)
使用控件名称的前缀。例如。 tab1_button1
,tab2_button1
,tab33_button1
。然后只有一个事件处理程序为所有事件提供服务(按下按钮,复选框点击)