Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Auf Existenz einer Userform prüfen per VBA

Auf Existenz einer Userform prüfen per VBA
24.11.2006 12:48:00
eres
Hallo Excel-Freunde,
kann mir jemand sagen, wie ich von Mappe1.xls aus per VBA prüfen kann, ob in Mappe2.xls die Userform »UF1« existiert ?
Vielen Dank für Eure Hilfe im voraus.
Gruss
erwin
Anzeige

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Prüfen, ob anderen Mappe ein bestimmtes UF enthält
24.11.2006 13:08:29
NoNet
Hallo Erwin,
hier mein vorschlag :


Sub UF_Suchen()
    '24.11.2006, NoNet - www.excelei.de (z.Zt. DOWN !)
    Dim Mappe, uf
    Dim vbc, gefunden
    Mappe = "Mappe2" 'die zu durchsuchende Mappe
    uf = "UserForm1" 'der Name des zu suchenden UserForms
    gefunden = False
    With Workbooks(Mappe).VBProject
        For Each vbc In .vbcomponents
            If vbc.Type = 3 Then 'Userform
                If UCase(vbc.Name) = UCase(uf) Then
                    gefunden = True
                    Exit For
                End If
            End If
        Next
    End With
    MsgBox "Das UserForm '" & uf & "' wurde in " & Mappe & _
        IIf(gefunden, "", " nicht") & " gefunden !"
End Sub


Anzeige
AW: Auf Existenz einer Userform prüfen per VBA
24.11.2006 13:11:32
ramses
Hallo
Geht schon, einfach als Funktion einsetzen
Option Explicit

Function CheckUfExist(tarWkb As Workbook, ufName As String) As Boolean
Dim n As Long
With tarWkb
For n = .VBProject.VBComponents.Count To 1 Step -1
With .VBProject.VBComponents(n)
'Achtung .Name ist CaseSensitiv
If .Type = 3 And .Name = ufName Then
CheckUfExist = True
Exit Function
End If
End With
Next
End With
CheckUfExist = False
End Function


Sub Test()
MsgBox CheckUfExist(Workbooks("Book2.xls"), "UserForm1")
End Sub

ACHTUNG: Auf Gross- und KleinSchreibung achten beim Userform-Name oder mit UCASE entsprechend umstellen wenn es unabhängig sein soll.
Gruss Rainer
Anzeige
Klappt prima. Vielen Dank an Rainer + NoNet o.T.
24.11.2006 13:34:08
eres
.
Nachfrage:
24.11.2006 13:55:57
eres0107
Gibt es so etwas ähnliches auch für die Prüfung aus Mappe1.xls per VBA, ob in einem der Arbeitsblätter der Mappe2.xls die »Sub Program1« existiert ?
Vielen Dank im voraus für jede Hilfe.
Gruss
erwin
AW: Nachfrage:
24.11.2006 14:02:54
ramses
Hallo
was meinst du damit:
"..ob in einem der Arbeitsblätter der Mappe2.xls die »Sub Program1«..."
Ist die Sub in einem Klassenmodul der Tabelle oder in einem eigenen Modul der Mappe ?
Gruss Rainer
Anzeige
AW: Nachfrage:
24.11.2006 14:05:56
eres
Rainer, sorry für die Ungenauigkeit.
Die Sub suche ich im Klassenmodul der Tabelle.
Gruss
erwin
*fg* - Ausgerechnet die Klassenmodule...
24.11.2006 15:02:15
NoNet
...hatte ich nicht berücksichtigt ;-)
Hier der ergänzte Code :


Function VBA_Suchen(Mappe, objName, Optional objTyp As Variant = 3)
    'Sucht, ob in einer anderen Mappe ein bestimmtes VBA-Element existiert
    'Mappe : die zu durchsuchende Mappe
    'objName : der Name des zu suchenden UserForms/SUBs/Function
    'objTyp : Der Typ des zu suchendne VBA-Elements : 1=SUB, 2=Function, 3=UF
    'Aufruf : msgBox VBA_Suchen("mappe2","MeinMakro",1)
    'Oder : msgBox VBA_Suchen("mappe2","MeineUDF",2)
    'Oder : msgBox VBA_Suchen("mappe2","UserForm1")
    Dim vbc, gefunden, vbZeile
    gefunden = False
    For Each vbc In Workbooks(Mappe).VBProject.vbcomponents
        If vbc.Type = 3 And objTyp = 3 Then 'Userform
            If UCase(vbc.Name) = UCase(objName) Then
                gefunden = True
                Exit For
            End If
        ElseIf (vbc.Type = 1 Or vbc.Type = 100) And (objTyp = 1 Or objTyp = 2) Then
            For vbZeile = 1 To vbc.codemodule.countoflines
                If UCase(LTrim(vbc.codemodule.Lines(vbZeile, 1))) Like _
                    UCase(IIf(objTyp = 1, "SUB ", "FUNCTION ") & _
                    objName & "(*") Then
                    gefunden = True
                    Exit For
                End If
            Next
        End If
    Next
    If gefunden Then
        VBA_Suchen = True
    Else
        VBA_Suchen = False
    End If
End Function

Anzeige
AW: *fg* - Ausgerechnet die Klassenmodule...
24.11.2006 15:05:50
eres
wollte mich gerade melden ...
Toll, wenn die Lösung kommt, bevor man das Problem beschrieben hat.
Herzlichen Dank nochmals und Gruss aus Köln
erwin
UDF (Function) zum Prüfen von VBA-Elementen
24.11.2006 14:41:37
VBA-Elementen
Hallo Erwin,
ich habe das Makro nun um die Prüfmöglichkeit für SUBs, UDFs und USerForms erweitert :


Sub VBAPruefen()
    MsgBox VBA_Suchen("mappe2", "MeinMakro", 1)
    MsgBox VBA_Suchen("mappe2", "MeineUDF", 2)
    MsgBox VBA_Suchen("mappe2", "UserForm1")
End Sub
Function VBA_Suchen(Mappe, objName, Optional objTyp As Variant = 3)
    'Sucht, ob in einer anderen Mappe ein bestimmtes VBA-Element existiert
    'Mappe : die zu durchsuchende Mappe
    'objName : der Name des zu suchenden UserForms/SUBs/Function
    'objTyp : Der Typ des zu suchendne VBA-Elements : 1=SUB, 2=Function, 3=UF
    'Aufruf : msgBox VBA_Suchen("mappe2","MeinMakro",1)
    'Oder : msgBox VBA_Suchen("mappe2","MeineUDF",2)
    'Oder : msgBox VBA_Suchen("mappe2","UserForm1")
    Dim vbc, gefunden, vbZeile
    gefunden = False
    For Each vbc In Workbooks(Mappe).VBProject.vbcomponents
        If vbc.Type = 3 And objTyp = 3 Then 'Userform
            If UCase(vbc.Name) = UCase(objName) Then
                gefunden = True
                Exit For
            End If
        ElseIf vbc.Type = 1 And (objTyp = 1 Or objTyp = 2) Then
            For vbZeile = 1 To vbc.codemodule.countoflines
                If UCase(LTrim(vbc.codemodule.Lines(vbZeile, 1))) Like _
                    UCase(IIf(objTyp = 1, "SUB ", "FUNCTION ") & _
                    objName & "(*") Then
                    gefunden = True
                    Exit For
                End If
            Next
        End If
    Next
    If gefunden Then
        VBA_Suchen = True
    Else
        VBA_Suchen = False
    End If
End Function

Anzeige
Herzlichen Dank NoNet (o.T.) & have a nice weekend
24.11.2006 14:50:07
eres
.
kleine Optimierung
24.11.2006 20:08:21
Daniel
Hallo,
kleine Optimierung zur Funktion, es bringt zwar nicht viel,aber Schleifen und IF-Abfragen sollten möglichst vermieden werden. Die Funktion lässt sich so auf eine Zeile reduzieren:

Function CheckUfExist(tarWkb As Workbook, ufName As String) As Boolean
CheckUfExist = tarWkb.VBProject.VBComponents(ufName).Type = 3
End Function

Gruß, Daniel
Anzeige
AW: kleine Optimierung
27.11.2006 07:43:54
eres
Vielen Dank Daniel,
werde ich gerne berücksichtigen.
Gruss
erwin
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Userform-Existenzprüfung in Excel per VBA


Schritt-für-Schritt-Anleitung

Um zu überprüfen, ob eine Userform in einer anderen Excel-Arbeitsmappe existiert, kannst Du den folgenden VBA-Code verwenden. Dieser Code wird in einer Subroutine ausgeführt und prüft, ob die Userform UF1 in der Arbeitsmappe Mappe2 vorhanden ist.

  1. Öffne die Visual Basic for Applications (VBA)-Umgebung in Excel (Alt + F11).
  2. Füge ein neues Modul hinzu: Rechtsklick auf „VBAProject (DeinWorkbook)“ > Einfügen > Modul.
  3. Kopiere den folgenden Code in das Modul:
Sub UF_Suchen()
    Dim Mappe As String, uf As String
    Dim vbc As Object, gefunden As Boolean
    Mappe = "Mappe2" ' die zu durchsuchende Mappe
    uf = "UserForm1" ' der Name des zu suchenden UserForms
    gefunden = False

    With Workbooks(Mappe).VBProject
        For Each vbc In .VBComponents
            If vbc.Type = 3 Then ' Userform
                If UCase(vbc.Name) = UCase(uf) Then
                    gefunden = True
                    Exit For
                End If
            End If
        Next
    End With

    MsgBox "Das UserForm '" & uf & "' wurde in " & Mappe & IIf(gefunden, "", " nicht") & " gefunden!"
End Sub
  1. Schließe den VBA-Editor und führe das Makro aus.

Häufige Fehler und Lösungen

  • Fehler: „Laufzeitfehler 1004: Fehler beim Zugriff auf VB-Projekt.“

    • Lösung: Stelle sicher, dass in den Excel-Optionen die „Vertrauensstellung“ für den Zugriff auf das VBA-Projekt aktiviert ist.
  • Fehler: „Das UserForm wurde nicht gefunden.“

    • Lösung: Überprüfe den Namen der Userform auf Groß- und Kleinschreibung. VBA ist hier case-sensitive.

Alternative Methoden

Eine andere Möglichkeit zur Überprüfung der Existenz einer Userform ist die Verwendung einer Funktion. Der folgende Code zeigt, wie dies als Funktion implementiert werden kann:

Function CheckUfExist(tarWkb As Workbook, ufName As String) As Boolean
    CheckUfExist = tarWkb.VBProject.VBComponents(ufName).Type = 3
End Function

Du kannst diese Funktion dann in einer Subroutine aufrufen, um die Existenz der Userform zu überprüfen.


Praktische Beispiele

Hier sind einige praktische Beispiele, wie Du die Funktion zur Überprüfung von UserForms und anderen VBA-Elementen verwenden kannst:

Sub Test()
    MsgBox CheckUfExist(Workbooks("Mappe2.xls"), "UserForm1") ' Überprüft UserForm
    MsgBox VBA_Suchen("Mappe2", "MeinMakro", 1) ' Überprüft eine Subroutine
    MsgBox VBA_Suchen("Mappe2", "MeineUDF", 2) ' Überprüft eine Funktion
End Sub

Tipps für Profis

  • Verwende UCase oder LCase, um die Groß-/Kleinschreibung beim Vergleichen von Namen zu ignorieren.
  • Dokumentiere Deinen Code gut, insbesondere, wenn Du komplexe Projekte mit mehreren Makros und UserForms erstellst.
  • Halte Deine VBA-Projekte aufgeräumt und vermeide unnötige Schleifen, um die Leistung zu verbessern.

FAQ: Häufige Fragen

1. Wie kann ich überprüfen, ob eine Subroutine in einem Klassenmodul existiert?
Du kannst die gleiche Logik verwenden wie bei der Überprüfung von UserForms, indem Du die Typnummer für Subroutinen (1) anpasst.

2. Wo finde ich die VBA-Optionen zur Vertrauensstellung?
Gehe zu „Datei“ > „Optionen“ > „Trust Center“ > „Einstellungen für das Trust Center“ und aktiviere den Zugriff auf das VBA-Projekt.

3. Funktioniert dieser Code in allen Excel-Versionen?
Der Code sollte in den meisten modernen Excel-Versionen funktionieren, solange VBA aktiviert ist. Achte darauf, dass die Makros in den Excel-Einstellungen erlaubt sind.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige