Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: #If #End If

#If #End If
07.07.2007 14:21:00
Reinhard
Hallo Wissende,
an sich wollte ich ein Makro schreiben was sowohl unter Word als auch Excel läuft. Was läuft bekomme ich mit Apllication.Name heraus, aber es hakt an anderer Stelle. Ich will ja aufgrund der laufenden Anwendung unterschiedlich kompilieren lassen, komme aber mit dem #If nicht zurecht.

Sub tt()
Dim A As String
A = Application.Name
#If A = "Microsoft Excel" Then
MsgBox "Excel"
#End If
End Sub


Es kommt leider keine MsgBox, also es tut sich gar nichts. Immerhin kommt auch kein Fehler.
Was muß ich da wie ändern damit die Msgbox kommt?
Danke ^ Gruß
Reinhard

Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: #If #End If
07.07.2007 14:26:00
mumpel
Hallo!
Ohne die Rauten, dann geht es.
Gruß, Rene

Leider nein
07.07.2007 14:39:14
Reinhard
Hallo Rene,
das nützt mir leide nichts, ich will ja auf das bedingte Kompilieren hinaus, damit ich dann nachher so etwas habe:

Sub tt()
Dim A As String
A = Application.Name
#If A = "Microsoft Excel" Then
Worksheets(3).Activate
#Else
ThisDocument.Activate
#End If
End Sub


Das bringt jetzt natürlich einen Fehler in Excel weil "ThisDocument" ein für Excel unbekanntes Word-Objekt ist.
Da sich Word- und Excel-Vba unterscheidet möchte ich je nachdem was vorliegt, nur bestimmte Codeteile kompilieren lassen beim Makrostar, weil Word kein "Worksheet" kennt und Excel kein "ThisDocument".
Gruß
Reinhard

Anzeige
AW: Leider nein
07.07.2007 15:43:24
ingUR
Hallo, Rene,
für bedingte Kompilierungen dürfen als Ausdruck nur mit #Const definierte Bezeichner verwendet werden.

Option Explicit
Const cEXCEL = True
Sub tt()
#If VBA6 Then
If Application.Name = "Microsoft Excel" Then
MsgBox "Excel"
Else
MsgBox "Kein Excel"
End If
#Else
MsgBox "Keine Visual Basic for Application Anwendung"
#End If
#If Win32 Then
MsgBox "Win32"
#Else
MsgBox "kein Win32"
#End If
#If Win32 Or cEXCEL Then
MsgBox "Excel oder Win32"
#Else
MsgBox "kein Excel oder kein Win32"
#End If
#If VBA6 Then
If Application.Name = "Microsoft Excel" Then
MsgBox "Excel"
Else
MsgBox "Kein Excel"
End If
#Else
MsgBox "Keine Visual Basic for Application Anwendung"
#End If
End Sub

Doch es dürfte wohl in der Mehrzahl der Fälle auch die normalen Verzweigungsmöglichkeiten ausreichen.
Gruß,
Uwe

Anzeige
AW: Leider nein
07.07.2007 19:05:00
Reinhard
Hallo Uwe,
danke dir sehr, muß das mal analysieren.
Gruß
Reinhard

AW: bed Compilerkonst. nur bed. sinnvoll in VBA
08.07.2007 08:15:00
ingUR
AW: bedingte Compilerkonstonstanten nur bedingt sinnvoll in VBA
Hallo, Reinhard,
hatte am gestrigen Nachmittag nicht mehr die Zeit gefunden, näher auf den Einsatz von #If/#ElseIf/#Else/#End If einzugehen.
Es besteht im Dialog zu den Eigenschaften des VBAProjects, die Möglichkeit, Konstanten für die bedingte Kompilierung zu setzen (VBAProject::Eigenschaften von VBAProject...) zu setzen. Die Eingabe erfolgt im Eingabefeld "Argumente für die bedingte Kompilierung". Hier können mehrere Zuweisungen, durch Doppelpunkt getrennt, eingegeben werden. Sie wirken genauso wie eine Konstantendeklaration im allgemeinen Teil mit der Direktive #Const.
Beispiele für das Eingabefeld:

DebugModus=-1: EXCEL=1: DEMO=1: Sparversion=1

Dieser Eintrag ist also wirkungsgleich mit den Zeilen:


#Const DebugModus=-1
#Const EXCEL=1
#Const DEMO=1
#Const Sparversion=1



#If Not Sparversion then
'Code der Vollversion
#End If

Daneben sind mir noch die Kompilierkonstanten Vba5 und Vba6 für VBA bekannt, so dass damit im gewissen Grade Kompatibilitätsprobleme abgefangen werden können. Vba6steht für 2000 bzw. 2002 (XP). Ferner gibt es für die Betriebssystemebene die Compilerkonstanten Win16, Win32 und Mac (Ob die Aufzählung hier vollständig ist, weiß ich nicht). Diese Konstanten können nur in den bedingten #If-Abfragen als Ausdruck eingesetzt werden.


#If Win32=False then
MsgBox "Win32 erforderlich"
'Abbruchroutine des Programms
#ElseIf Mac then
Msgbox "Keine Mac-Anwendung"
'Abbruchroutine des Programms
#End If

Da jedoch keine EXE-Datei mit VBA erzeugt wird, werden die #IF-Blöcke wohl ausführungstechnisch genauso behandelt, wie normale IF-Strukturen, so dass eigentlich nur der Einsatz Nutzen bringt, wenn man die vordefinierten Komilerkonstanten verwenden muß oder aber an zentraler Stelle („Eigenschaften von VBA-Project ...“) derartige Steuerkonstanten hinterlegen möchte.


#If Vba6 then
Anweisung X mit Parametern, die Vba6 kennt
#Else
Anweisung X ohne Parameter, die erst ab Vba6 möglich sind
#End If

Ansonsten scheint mir für Deinen Fall, in dem es darum geht, zwischen den verschiedenen Anwendungen, in denen Dein VBA-Project eingesetzt wird, der Weg über die bedingte Abfrage nicht geeignet zu sein, solange man keine vordefinierte Compilerkonstante kennt, die zwischen den Applikationen unterscheidet. Hier ist der von @ransi beschriebene Weg über das Objekt der richtige.
Allein das Auswählen zwischen versionsabhängigen Veränderungen bei den einzelnen Befehlen und Parametern in der Anwendung oder dem Betriebssystem ((VBA6 oder nicht VBA6, Betriebssystem) erfordert den Einsatz von #If-Strukturen, denn auch die Idee der Steuerung verschiedener Ausführungsoptionen in einem Projekt (DEMO, SPARVERSION, etc.) lassen sich mit normalen CONST-Deklarationen und IF- und SELECT-Blöcken umsetzen.
Gruß,
Uwe

Anzeige
AW: ergänzender Nachsatz
08.07.2007 09:12:00
ingUR
Hallo, Reinhard,
natürlich bringt die #If-Struktur einen Laufzeitgewinn, da ja nur die relevanten TRUE-Zweige der #IF-Strukturblöcke übersetzt werden, so dass bei der Abarbeiting der Programmschritte während der Laufzeit die #If-Sturukturabfragen entfallen, da nur der "TRUE-Block" existiert. Dieser wird umso deutlicher ausfallen, je häufiger die Routine in der Laufzeit auszuführen ist.
Gruß!

Anzeige
Ich bedanke mich bei Allen owT
10.07.2007 19:42:00
Reinhard
.

AW: #If #End If
07.07.2007 15:10:00
ransi
HAllo reinhard
Keine Ahnung was das mit den Rauten auf sich hat....
Aber hilft dir dieser Codeschnipsel weiter ?
' **********************************************************************
' Modul: Tabelle1 Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit


Sub tt()
Dim A As String
Dim app As Object
Set app = Application
Select Case app.Name
    Case "Microsoft Excel"
        MsgBox app.ActiveWorkbook.Worksheets(3).Name
    Case "Microsoft Word"
        MsgBox app.ActiveDocument.Name
End Select
End Sub

Du musst im weiteren Code dann eben nur sauber referenzieren.
ransi

Anzeige
AW: #If #End If bedingtes Kompilieren
07.07.2007 15:30:08
Reinhard
Hallo Ransi,
was ich nicht verstehe ist, daß der Debugger ActiveDocument nicht kennt, also er schreibt es z.B. nicht automatisch groß wenn ich es klein eingebe, aber nicht wie bei meinem Code rummeckert.
Es liegt m.E. an diesem Set app= Befehl.
Okay, wenn ich den Gesamtcode auf diese Weise hinkriege kann soll mir das Recht sein.
Grundsätzlich würde ich schon gerne wissen wie man bedingt kompilieren lassen kann, so wie in C wo man m.W. nach auch mit #Define u.ä. nur bestimtes Kompilieren läßt zur äh klar, vor der Laufzeit.
Deshalb Frage noch offen.
Danke
Gruß
Reinhard

Anzeige
AW: #If #End If
07.07.2007 15:50:00
ransi
HAllo Rhainhard
Durch das deklarieren von App as Object weiß der Kompiler nicht was App für Methoden und Eigenschaften hat.
Bevor er jetzt rummault hält er lieber die Klappe und schweigt.
Wenn du dann im Code sagst das App die Application ist, ist es zu spät um zu meckern.
Nachteil ist allerdings wie du gemerkt hast:
Intellisense für die Word Sachen geht nicht wenn du in Excel die Word-Sachen programmierst.
Umgekehrt natürlich auch nicht...
ransi
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Infobox / Tutorial

Bedingtes Kompilieren in VBA: #If und #End If korrekt nutzen


Schritt-für-Schritt-Anleitung

  1. Konstanten definieren: Um das bedingte Kompilieren in VBA zu nutzen, ist es wichtig, Konstanten mit #Const zu definieren. Beispiel:

    #Const EXCEL = True
  2. Verwendung von #If: In deinem Makro kannst du dann die #If-Direktive verwenden, um verschiedene Codeabschnitte je nach Anwendung zu kompilieren:

    #If EXCEL Then
       MsgBox "Das läuft in Excel."
    #Else
       MsgBox "Das läuft nicht in Excel."
    #End If
  3. Anwendung der Bedingungen: Achte darauf, dass du bei der Verwendung von #If nur mit #Const definierte Bezeichner benutzt, da andere Bedingungen nicht funktionieren.

  4. Kompilieren: Um sicherzustellen, dass dein Code richtig funktioniert, führe das Makro aus und teste die verschiedenen Bedingungen.


Häufige Fehler und Lösungen

  • Fehler beim Kompilieren: Wenn du einen Fehler erhältst, dass ein Objekt nicht gefunden wurde, überprüfe, ob du die richtigen Objekte für Excel oder Word verwendest. Beispiel:

    #If A = "Microsoft Excel" Then
      Worksheets(1).Activate ' Richtig für Excel
    #Else
      ThisDocument.Activate ' Richtig für Word
    #End If
  • Keine MsgBox angezeigt: Wenn deine MsgBox nicht erscheint, könnte das daran liegen, dass die Bedingungen nicht erfüllt sind. Teste die Werte von Application.Name und stelle sicher, dass sie mit deinen #If-Bedingungen übereinstimmen.


Alternative Methoden

Falls das bedingte Kompilieren nicht die gewünschte Flexibilität bietet, kannst du auch die Select Case-Anweisung verwenden:

Select Case Application.Name
    Case "Microsoft Excel"
        MsgBox "Das ist Excel."
    Case "Microsoft Word"
        MsgBox "Das ist Word."
    Case Else
        MsgBox "Unbekannte Anwendung."
End Select

Diese Methode ist einfacher und vermeidet die Komplexität von #If.


Praktische Beispiele

Hier ist ein Beispiel, das zeigt, wie du zwischen Excel und Word unterscheiden kannst:

Sub tt()
    Dim app As Object
    Set app = Application

    Select Case app.Name
        Case "Microsoft Excel"
            MsgBox "Aktuelles Arbeitsblatt: " & app.ActiveWorkbook.Worksheets(1).Name
        Case "Microsoft Word"
            MsgBox "Aktuelles Dokument: " & app.ActiveDocument.Name
        Case Else
            MsgBox "Unbekannte Anwendung"
    End Select
End Sub

Tipps für Profis

  • Verwende #Const: Definiere häufig verwendete Konstanten zu Beginn deines Codes, um die Wartbarkeit zu erhöhen.

  • Debugging: Nutze Debug.Print in Kombination mit #If, um herauszufinden, welche Teile deines Codes tatsächlich kompiliert werden.

  • Vermeidung von Fehlern: Achte darauf, dass du die richtigen Objekte verwendest, um Laufzeitfehler zu vermeiden, besonders wenn du zwischen VBA für Excel und Word wechselst.


FAQ: Häufige Fragen

1. Was sind die Vorteile des bedingten Kompilierens in VBA?
Das bedingte Kompilieren verbessert die Performance, da nur die relevanten Teile des Codes kompiliert werden. Dies ist besonders nützlich, wenn dein Makro in mehreren Anwendungen wie Excel und Word laufen soll.

2. Warum funktioniert #If nicht mit Variablen?
#If kann nur mit Konstanten verwendet werden, die mit #Const definiert sind. Variablen sind zur Compile-Zeit nicht bekannt.

3. Wie kann ich sicherstellen, dass mein Code sowohl in Excel als auch in Word funktioniert?
Verwende die Select Case-Anweisung oder definiere Konstanten, um den Code je nach Anwendung anzupassen. So kannst du sicherstellen, dass jeweils nur der relevante Code ausgeführt wird.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige