【问题标题】:VB right click copy/paste in multipageVB在多页中右键复制/粘贴
【发布时间】:2018-12-15 04:11:17
【问题描述】:

让我以我是自学成才的事实开始我的问题,所以请提供尽可能详细的信息,如果我需要您以不同的方式或多次解释,请多多包涵。

我使用 Microsoft Visual Basic 7.0 为我的团队创建了一个符号/电子邮件生成工具。我收到的唯一抱怨是他们中的许多人不习惯热键,所以他们依赖于使用鼠标但右键单击不起作用。当他们使用右键单击时,我能够找到创建复制和粘贴弹出窗口的代码,并且它在主窗体本身的少数文本框上效果很好,但是它不适用于大多数文本框它们位于多页中。

有谁知道如何更改以下代码以适用于多页上的文本框?此外,在提出建议之前,我曾考虑将所有内容移出 Multipage,但这种格式是最简单的,因为他们需要随时发送多个阶段和类型的便笺/电子邮件,所以有可供他们简单单击的选项卡是我能够创建的最用户友好的选项卡,并且他们都同意。

提前谢谢大家!

代码格式:

Dim cBar As clsBar

Private Sub UserForm_Initialize()

    On Error GoTo Whoa
    Application.EnableEvents = False

    Set cBar = New clsBar
    cBar.Initialize Me

Letscontinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume Letscontinue

End Sub

类模块中的代码:

Option Explicit

'Popup objects
Private cmdBar As CommandBar
Private WithEvents cmdCopyButton As CommandBarButton
Private WithEvents cmdPasteButton As CommandBarButton

'Useform to use
Private fmUserform As Object

'Control array of textbox
Private colControls As Collection

'Textbox Control
Private WithEvents tbControl As MSForms.TextBox
'Adds all the textbox in the userform to use the popup bar
Sub Initialize(ByVal UF As Object)
    Dim Ctl As MSForms.Control
    Dim cBar As clsBar
    For Each Ctl In UF.Controls
        If TypeName(Ctl) = "TextBox" Then

            'Check if we have initialized the control array
            If colControls Is Nothing Then
                Set colControls = New Collection
                Set fmUserform = UF
                'Create the popup
                CreateBar
            End If

            'Create a new instance of this class for each textbox
            Set cBar = New clsBar
            cBar.AssignControl Ctl, cmdBar
            'Add it to the control array
            colControls.Add cBar
        End If
    Next Ctl
End Sub

Private Sub Class_Terminate()
    'Delete the commandbar when the class is destroyed
    On Error Resume Next
    cmdBar.Delete
End Sub

'Click event of the copy button
Private Sub cmdCopyButton_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
    fmUserform.ActiveControl.Copy
    CancelDefault = True
End Sub

'Click event of the paste button
Private Sub cmdPasteButton_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
    fmUserform.ActiveControl.Paste
    CancelDefault = True
End Sub

'Right click event of each textbox
Private Sub tbControl_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If Button = 2 And Shift = 0 Then
        'Display the popup
        cmdBar.ShowPopup
    End If
End Sub

Private Sub CreateBar()
    Set cmdBar = Application.CommandBars.Add(, msoBarPopup, False, True)
    'We’ll use the builtin Copy and Paste controls
    Set cmdCopyButton = cmdBar.Controls.Add(ID:=19)
    Set cmdPasteButton = cmdBar.Controls.Add(ID:=22)
End Sub

'Assigns the Textbox and the CommandBar to this instance of the class
Sub AssignControl(TB As MSForms.TextBox, Bar As CommandBar)
    Set tbControl = TB
    Set cmdBar = Bar
End Sub

【问题讨论】:

    标签: excel class userform multipage vba


    【解决方案1】:

    获取多页控件上的 ActiveControl 名称

    有必要通过使用SelectedItem 属性的辅助函数(ActiveControlName) 了解多页选择的Page,并从那里获取控件(其名称)。改变你的按钮点击事件如下:

    类模块clsBar中的相关按钮点击事件

    'Click event of the copy button
    Private Sub cmdCopyButton_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
    Dim sACN As String
    sACN = ActiveControlName(fmUserform)    ' find control's name
           ' Debug.Print sACN & ".Copy"
    fmUserform.Controls(sACN).Copy          ' << instead of fmUserform.ActiveControl.Copy
    CancelDefault = True
    End Sub
    
    'Click event of the paste button
    Private Sub cmdPasteButton_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
    Dim sACN As String
    sACN = ActiveControlName(fmUserform)
           ' Debug.Print sACN & ".Paste"
    fmUserform.Controls(sACN).Paste    ' << instead of fmUserform.ActiveControl.Paste
    CancelDefault = True
    End Sub
    

    上述点击事件调用的辅助函数

    Function ActiveControlName(form As UserForm) As String
    'cf Site: https://stackoverflow.com/questions/47745663/get-activecontrol-inside-multipage
    'Purpose: get ActiveControl
     Dim MyMultiPage As MSForms.MultiPage, myPage As MSForms.Page
     If form.ActiveControl Is Nothing Then
        ' do nothing
     ElseIf TypeName(form.ActiveControl) = "MultiPage" Then
        Set MyMultiPage = form.ActiveControl
        Set myPage = MyMultiPage.SelectedItem
        ActiveControlName = myPage.ActiveControl.Name
     Else
        ActiveControlName = form.ActiveControl.Name
     End If
     End Function
    

    旁注

    建议检查所选文本字符串的长度,以防出现空字符串。

    【讨论】:

    • 效果很好,T.M.!!!太感谢了!我一直在努力解决这个问题大约一个月。
    猜你喜欢
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多