gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:41:50 26 4
gpt4 key购买 nike

我有一个正在为工作簿制作的用户窗体控制面板。我有一个名为#1 的页面,用于工作簿表#1。我还有一个“添加工作表”按钮,用于复制#1 页面并创建#2 页面。

问题是#1 页面上的控件代码在新创建的#2 页面上不起作用。而且我不知道第 2 页控件被称为什么,因此我无法事先为其编写代码。

这是我在某处找到的复制/粘贴代码。第 0 页是常规设置页面,第 1 页是第 1 页。我有一个 Frame 占据了整个 Multipage 区域,因此它复制了框架和其中的所有内容并复制了它。

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 页。 Page 0 出于本示例的目的,我忽略了(您提到它只是“常规设置”页面)。

与多页分开,我放置了主命令按钮(单击时实际添加新页面的按钮)并将其命名为 AddProgramButton像你一样。

在第 1 页,我有你所说的框架。在这个框架内,我在我的上放置了一个命令按钮、一个文本框和一个组合框。我不知道您的控件是什么,但是您现在需要按照我的示例进行操作。

现在我们需要开始输入代码。首先,如果您还没有,请在您的项目中插入一个标准模块。在这个标准模块的顶部,输入以下代码:

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

现在,对于框架内的每个控件,我们需要创建一个新类。插入 类(class)模块 .您必须将它们命名如下:
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

现在,如果您测试您的用户表单,它应该可以工作。您应该希望能够修改我的示例以符合您自己的要求。

注意:无论选择哪个页面,类模块中的事件都会产生相同的响应。您必须自己修改代码(或提供更多信息)以“个性化”结果。

顺便说一句,您可能在这里找到了原始代码: Copy Elements From One Page To Another in Multipage with VBA in Excel .

关于Excel VBA 用户窗体多页和框架(复制/粘贴),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31433997/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com