2017-08-13 79 views
0

下午好,所以我已经分配了一个任务,我应该采用我制作的日历用户窗体并实现按照多页用户窗体上的选项卡复制所需日历的功能。动态复制多页中的页面

我的问题是:是否有可能动态地这样做?我将所有控件复制到另一个选项卡进行测试,但所有控件按钮都被重命名,并且我无法将它们命名为与“母版页”上的按钮相同的名称,因为命名时出现模糊性错误2个按钮在一个用户窗体上相同。

我可以使用新的按钮名称编写新的代码,但是由于添加了新的选项卡,因此无法动态完成,因此必须在创建之前为其准备好代码。

任何帮助将不胜感激。

+0

为什么您复制功能而不是使用说出单独的日历表单作为需要时? – Rory

回答

0

使用控件名称的前缀。例如。 tab1_button1tab2_button1tab33_button1。那么只有一个一个的事件处理程序服务的所有事件(按下按钮,复选框点击)

这里的一些信息using one sub for multiple buttons in excel vba

+0

问题在于OP没有命名控件。当他复制并粘贴多页时,VBA会自动为新控件命名。 – 2017-08-14 06:07:36

1

Demo Workbook

来处理这类问题的关键是创建一个类持有对新创建控件的引用。使用WithEvents将允许您处理参考控件的事件。

阅读WithEvents这里:Events And Event Procedures In VBA

为了使这项工作,你必须新建Page控件和它们在你的类变形怪之间Set引用。您还需要将类引用添加到全局集合,字典或数组中以保持活动状态。

在我的示例中,我创建了一个将遍历模板页面控件的子例程,创建并复制声明变量所需的代码并将引用设置为Windows ClipBoard。

最后一步是将用户窗体中的事件代码复制到类模块中。

enter image description here

的代码示例下载Demo Workbook

或者,您可以用TabStrip控件替换Multipage控件。不同之处在于,您可以在所有Tabs上使用TabStrip范围内的控件。您可以使用TabStrip1_Change()更新基于选定选项卡(TabStrip1.SelectedItem)的控件。

0

首先,我会建议看看托马斯Inzina的答案。 但是,在我的一个工作表中,我没有依赖WithEvents做同样的事情,所以我想展示另一种方法。

该方法按照预定的格式(例如“Input1_”(counter + 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