2017-08-24 6 views
0

Ich habe gerade begonnen, VBA in einem Word 2007 (Office XP) zu verwenden und ich versuche, eine Schleife zu erstellen, um durch alle Symbolleisten und durch alle Schaltflächen in jeder Symbolleiste zu gehen.VBA For .. Next Schleife versucht, durch Symbolleisten Schaltflächen

habe ich diesen Code

Public Sub PasteFromClipboard() 
    Dim i As Long 
    Dim j As Long 
    Dim sCmdBar As CommandBar 

     Dim thisCommandBar As CommandBar 
     Dim thisCommandButton As CommandBarButton 

    Debug.Print "Number", "Name", "Visible", "Built-in" 
    For i = 1 To Application.CommandBars.Count 
    Set sCmdBar = Application.CommandBars(i) 
    If sCmdBar.Visible = True Then 
     j = j + 1 
     Debug.Print j, sCmdBar.Name, sCmdBar.Visible, sCmdBar.BuiltIn 

     Dim X As Long 
     Set thisCommandBar = Application.CommandBars(sCmdBar.Name) 
     For X = 1 To thisCommandBar.Controls.Count - 1 
      Set thisCommandButton = thisCommandBar.Controls(X) 
      If thisCommandButton.Caption = "Paste" Then 
       Dim a As Long 
       a = a + 1 
       Exit For 
      End If 
     Next X 

    End If 
    Next i 

Aber ich habe Laufzeitfehler 13: Typenkonflikt auf der folgenden Zeile:

Set thisCommandButton = thisCommandBar.Controls(X).

Warum dies geschieht und wie es zu beheben?

Noch eine Frage. Ist es möglich, die Bedingung in der Art und Weise zu ändern, um die Beschriftung der Schaltfläche zu finden, wenn sie in der lokalen Sprache geschrieben ist? Nicht Englisch. In dem von mir verwendeten Wort befinden sich im Bereich "Zwischenablage" Schaltflächen wie "Vložit vše" (Alles einfügen) und "Vymazat vše" (Alles löschen) und "Možnosti" (Optionen). Und ich möchte die Symbolleiste finden, die diese drei Knöpfe enthält (aber sicher, dass ich die echten englischen Untertitel nicht kenne).

Antwort

1

Ich habe es machen arbeiten Jede Verwendung Für

Dim i As Long 
    Dim j As Long 
    Dim sCmdBar As CommandBar 

     Dim thisCommandBar As CommandBar 
     Dim thisCommandButton As CommandBarButton 

    Debug.Print "Number", "Name", "Visible", "Built-in" 
    For i = 1 To Application.CommandBars.Count 
    Set sCmdBar = Application.CommandBars(i) 
    If sCmdBar.Visible = True Then 
     j = j + 1 
     Debug.Print j, sCmdBar.Name, sCmdBar.Visible, sCmdBar.BuiltIn 

     Set thisCommandBar = Application.CommandBars(sCmdBar.Name) 
     For Each Ctl In thisCommandBar.Controls 
      If Ctl.Caption = "Paste" Then 
       Dim a As Long 
       a = a + 1 
       Exit For 
      End If 
     Next 

    End If 
    Next i 
+0

Performance-Tipp: die äußere Schleife auch ein 'Für Each' Schleife sein sollte. Sie iterieren eine Objektsammlung, verwenden Sie eine 'For Each'-Schleife. Verwenden Sie 'For ... Next'-Schleifen, wenn Sie Arrays iterieren. –

+0

Es war nur ein Code für einen Test. Ich habe nicht auf Leistung oder netten Stil geachtet. Ich wollte nur einen einfachen Code erstellen, um die Symbolleisten zu durchsuchen ... – user1141649

+0

Wenn Sie feststellen, dass die Iteration einer Objektsammlung nach Index mit einer 'For'-Schleife statt einer' For Each'-Schleife bis zu 27-mal langsamer abläuft, vielleicht werde einsinken. –