我有一个Userform控制面板,我正在为工作簿制作。我有一个名为#1的页面,它用于工作簿表#1。我还有一张'添加表格'复制#1页面并创建#2页面的按钮。
问题是#1页面上控件的代码不适用于新创建的#2页面。而且我不知道第2页控件被调用了什么,所以我不能事先为它编写代码。
这是我在某处找到的复制/粘贴代码。第0页是常规设置页面,第1页是第1页。我有一个Frame占据整个多页面区域,因此它复制框架及其中的所有内容并复制它。
Option Explicit
Private Sub AddProgramButton_Click()
Dim l As Double, r As Double
Dim ctl As Control
Dim PAGECOUNT As Long
MultiPage1.Pages.Add
MultiPage1.Pages(1).Controls.Copy
PAGECOUNT = MultiPage1.Pages.Count
MultiPage1.Pages("Page" & PAGECOUNT).Paste
MultiPage1.Pages("Page" & PAGECOUNT).Caption = "#" & PAGECOUNT - 1
For Each ctl In MultiPage1.Pages(1).Controls
If TypeOf ctl Is MSForms.Frame Then
l = ctl.Left
r = ctl.Top
Exit For
End If
Next
For Each ctl In MultiPage1.Pages(PAGECOUNT - 1).Controls
If TypeOf ctl Is MSForms.Frame Then
ctl.Left = l
ctl.Top = r
Exit For
End If
Next
End Sub
答案 0 :(得分:1)
好的,我没有太多的信息可供你使用,但我可以通过使用以下方法来完成这项工作。如果要使用它,则必须根据自己的需要进行修改。
要遵循此示例,您需要创建一个新的UserForm,最好是在新工作簿中,并按照下面的说明进行操作。
我已经创建了一个UserForm,你有一个Multipage - 目前我有0页和1页。为了这个例子的目的,我忽略了(你提到它只是General Settings页面)。
从Multipage中分离,我已经放置了主CommandButton(实际上在点击时添加新页面的那个),并将其命名为AddProgramButton
。
在第1页上,我指出了一个框架。在这个框架内,我已经在我的上面放了一个CommandButton,一个TextBox和一个ComboBox。我不知道你的控件是什么,但你现在需要遵循我的例子。
现在我们需要开始输入代码。首先,如果您还没有,请在项目中插入标准模块。在此标准模块的顶部,输入以下代码:
Option Explicit
Public myButtonArr() As New CButton
Public myComboArr() As New CCombo
Public myTextBoxArr() As New CTextBox
现在,在您的UserForm模块中,您应该输入以下内容(请注意,其中一些是您首先提供的信息):
Option Explicit
Private Sub UserForm_Initialize()
Dim ctl As Control
For Each ctl In MultiPage1.Pages(1).Controls
Select Case TypeName(ctl)
Case Is = "CommandButton"
ReDim Preserve myButtonArr(1 To 1)
Set myButtonArr(1).myButton = ctl
Case Is = "ComboBox"
ReDim Preserve myComboArr(1 To 1)
Set myComboArr(1).myCombo = ctl
ctl.AddItem "A"
ctl.AddItem "B"
Case Is = "TextBox"
ReDim Preserve myTextBoxArr(1 To 1)
Set myTextBoxArr(1).myTextBox = ctl
End Select
Next ctl
End Sub
Private Sub AddProgramButton_Click()
Dim l As Double, r As Double
Dim ctl As Control
Dim PAGECOUNT As Long
MultiPage1.Pages.Add
MultiPage1.Pages(1).Controls.Copy
PAGECOUNT = MultiPage1.Pages.Count
MultiPage1.Pages("Page" & PAGECOUNT).Paste
MultiPage1.Pages("Page" & PAGECOUNT).Caption = "#" & PAGECOUNT - 1
For Each ctl In MultiPage1.Pages(1).Controls
If TypeOf ctl Is MSForms.Frame Then
l = ctl.Left
r = ctl.Top
Exit For
End If
Next
For Each ctl In MultiPage1.Pages(PAGECOUNT - 1).Controls
If TypeOf ctl Is MSForms.Frame Then
ctl.Left = l
ctl.Top = r
Exit For
End If
Next
For Each ctl In MultiPage1.Pages(PAGECOUNT - 1).Controls
Select Case TypeName(ctl)
Case Is = "CommandButton"
ReDim Preserve myButtonArr(1 To PAGECOUNT - 1)
Set myButtonArr(PAGECOUNT - 1).myButton = ctl
Case Is = "ComboBox"
ReDim Preserve myComboArr(1 To PAGECOUNT - 1)
Set myComboArr(PAGECOUNT - 1).myCombo = ctl
ctl.AddItem "A"
ctl.AddItem "B"
Case Is = "TextBox"
ReDim Preserve myTextBoxArr(1 To PAGECOUNT - 1)
Set myTextBoxArr(PAGECOUNT - 1).myTextBox = ctl
End Select
Next ctl
End Sub
现在,对于框架内的每个控件,我们需要创建一个新类。插入三个新 类模块 。您必须按如下方式命名:
CButton
CCombo
CTextBox
现在打开CButton类模块,并插入以下代码:
Option Explicit
Public WithEvents myButton As MSForms.CommandButton
Private Sub myButton_Click()
MsgBox "You clicked the button on one of the pages"
End Sub
接下来,打开CCombo类模块,并插入以下代码:
Option Explicit
Public WithEvents myCombo As MSForms.ComboBox
Private Sub myCombo_Change()
MsgBox "You changed the value of the ComboBox on one of the pages"
End Sub
最后,打开CTextBox类模块,并插入以下代码:
Option Explicit
Public WithEvents myTextBox As MSForms.TextBox
Private Sub myTextBox_Change()
MsgBox "You changed some text in the TextBox on one of the pages"
End Sub
现在,如果你测试你的Userform,它应该工作。您应该希望能够修改我的示例以符合您自己的要求。
注意:无论选择哪个页面,类模块中的事件都将产生相同的响应。您必须自己修改代码(或提供更多信息)以“个性化”结果。
你可能在这里找到了原始代码:Copy Elements From One Page To Another in Multipage with VBA in Excel。