Excel VBA用户表单多页和框架(复制/粘贴)

时间:2015-07-15 15:00:17

标签: excel-vba userform multipage vba excel

我有一个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

1 个答案:

答案 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