2017-07-04 3 views
1

Wie kann ich feststellen, ob ein Steuerelementobjekt (z. B. acTextBox) Mitglied einer Seitenauflistung in VBA ist?Suchen Sie den Abschnitt oder die Seite eines VBA-Steuerelements

Wenn ein Steuerelementobjekt den Fokus hat, wird eine Funktion aufgerufen, um den Fokus basierend auf dem verwendeten Schlüsseltyp auf den nächsten control.tabindex zu verschieben. Das habe ich mit Sendkeys "{TAB}" geschafft, aber ich möchte das ändern, da diese Methode NUMLOCK ständig auf der Tastatur deaktiviert.

Bis jetzt funktioniert die folgende Funktion, aber die Prozedur berücksichtigt alle Steuerelemente in einem Formular. Es sollte nur die Steuerelemente innerhalb derselben Sektion oder Seite berücksichtigen, von der die Funktion aufgerufen wird. Um dies zu erreichen, muss ich wissen, ob sich das aktive Steuerelement innerhalb einer Seite und/oder Sektion befindet und wenn ja, der Name oder der Index dieser Seite/Sektion. Ich kann den Code dafür nicht finden.

Public Function GotoNextTab() 
    Dim ctlNext, ctlCurrent As Control 
    Dim frmCurrent As Form 
    Dim lngNextTab As Long 
    Set frmCurrent = Screen.Activeform 
    Set ctlCurrent = Forms(frmCurrent.Name).ActiveControl 

    lngNextTab = Val(ctlCurrent.TabIndex) + 1 

    Do Until lngNextTab = frmCurrent.Controls.Count 
     For Each ctlNext In frmCurrent.Controls 
      Select Case ctlNext.ControlType 
       Case acCheckBox, _ 
        acComboBox, _ 
        acCommandButton, _ 
        acListBox, _ 
        acOptionButton, _ 
        acSubform, _ 
        acTabCtl, _ 
        acTextBox, _ 
        acToggleButton 
         If ctlNext.TabIndex = lngNextTab Then 
          If ctlNext.TabStop = True Then 
           'Make sure that the focus can be set here! 
           If ctlNext.Visible = True And ctlNext.Enabled = True Then 
            ctlNext.SetFocus 
            Exit Function 
           Else 
            'Focus could not be moved, so increase lngNextTab 
            lngNextTab = lngNextTab + 1 
           End If 
          Else 
           'This was the last tab, so exit 
           Exit Function 
          End If 
         End If 
      End Select 
     Next ctlNext 
    Loop 
End Function 
+0

Was meinen Sie mit * Seiten Sammlung * in Bezug auf Formulare? Meinst du das [Access 2003-Funktion] (https://msdn.microsoft.com/en-us/library/office/aa210669 (v = office.11) .aspx)? Wenn Sie einen Screenshot dieser interessanten Form teilen können. Und wo wird diese Funktion aufgerufen? Welches Triggerereignis (OnOpen, OnClick, AfterUpdate)? – Parfait

+0

Ich arbeite in V2010, aber ja, genau das meine ich. Die Steuerelemente befinden sich auf verschiedenen Seiten in einem Registersteuerelement. Der Bereich der Tabindex-Werte ist auf die Anzahl der Steuerelemente innerhalb einer Registerkarte beschränkt (ansonsten würde ich sie einfach fortlaufend nummerieren). Deshalb möchte ich wissen, auf welcher Seite (Seiten (Index)) sich das Steuerelement befindet, – Art

Antwort

1

Betrachten Sie die TabControl.Pages() Sammlung mit Kontrollen auf bestimmte Registerkarten zuzugreifen.

Nachstehend finden Sie ein Beispiel: Zuerst finden Sie die entsprechende Seite der aktiven Steuerung durch alle Steuerelemente auf jeder Registerkarte. Ordnen Sie dann die aktuelle Seite zu und durchlaufen Sie alle Steuerelemente. Die Überprüfung anhand des Namens ist zuverlässig, da jedes Steuerelement mit oder ohne Registerkarten in einem Formular eindeutig sein muss.

... 
Dim currpage As Page 
Dim tabCtrl As Control 
Dim pagename As String 

' FIND CURRENT PAGE OF ACTIVE CONTROL 
For Each currpage In Forms!myForm!TabCtl.Pages 
    For Each tabctrl In currpage.Controls 
     If tabctrl.Name = ctlCurrent.Name 
      pagename = currpage.Name 
     End If 
    Next tabctrl  
Next currpage 

If Len(pagename) > 0 Then 
    ' ASSIGN CURRENT TAB PAGE 
    Set currpage = Forms!myForm!mytabCtl.Pages(pagename) 

    ' LOOP THROUGH ALL CONTROLS ON CURRENT PAGE 
    For Each tabctrl In currpage.Controls 
     '...PROCESS EACH CTRL OF CURRENT TAB PAGE 
    Next tabctrl  

    Set tabctrl = Nothing 
    Set currpage = Nothing 
End If 
0

Vielen Dank für Ihre Antwort, das hat mir in die richtige Richtung geholfen. Ich habe festgestellt, dass sich die Elterneigenschaft immer auf die Kontrolle einer Ebene bezieht (in diesem Fall das Page-Objekt). Ich muss noch ein Feature einfügen, um zu dem ersten verfügbaren Steuerelement innerhalb der übergeordneten Steuerelementauflistung zurückzukehren, wenn das letzte Steuerelement erreicht wird. Bisher gab es nicht das gewünschte Ergebnis, also bleibe ich bei dem Verfahren, wie es jetzt ist.

Private Sub Form_Load() 
    KeyPreview = True 
End Sub 

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 
    Dim ctl As Control 
    If KeyCode = vbKeyReturn Then 
     'Disregard textboxes with multiple lines 
     Set ctl = Me.ActiveControl 
     If ctl.ControlType = acTextBox Then 
      If ctl.EnterKeyBehavior Then 
       Exit Sub 
      End If 
     End If 
     GotoNextTab 
    End If 
End Sub 

Public Function GotoNextTab() 
' This function will move the focus to the next control if 
' a) This control is a specified type 
' b) The control is visible and enabled 
' c) The control has a tabstop set to true 
' 
' If the controls are within a page (TabControl), the focus is cycled within the controls on that page. 
' The function disregards sections as it is assumed that there is no need to cycle controls on a form header or footer 
' The focus does not cycle within subforms. 

On Error Resume Next 

    Dim ctlNext as Control 
    Dim ctlCurrent As Control 
    Dim frmCurrent As Form 
    Dim lngNextTab As Long 
    Set frmCurrent = Screen.Activeform 
    Set ctlCurrent = Forms(frmCurrent.Name).ActiveControl 
    If ctlCurrent.Parent.ControlType = acOptionGroup Then 
     Set ctlCurrent = ctlCurrent.Parent 
    End If 
    lngNextTab = ctlCurrent.TabIndex 

    Do Until lngNextTab > ctlCurrent.Parent.Controls.Count 
     lngNextTab = lngNextTab + 1 
     For Each ctlNext In ctlCurrent.Parent.Controls 
      Select Case ctlNext.ControlType 
       Case acCheckBox, _ 
        acComboBox, _ 
        acCommandButton, _ 
        acListBox, _ 
        acSubform, _ 
        acTabCtl, _ 
        acTextBox, _ 
        acToggleButton, _ 
        acOptionGroup 
         If ctlNext.TabIndex = lngNextTab Then 
          'Make sure that the focus can be set here! 
          If ctlNext.TabStop = True And ctlNext.Visible = True And ctlNext.Enabled = True Then 
           ctlNext.SetFocus 
           Exit Function 
          Else 
           Exit For 'restart for/next and search the next value 
          End If 
         End If 
      End Select 
     Next ctlNext 
    Loop 
End Function 
Verwandte Themen