Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
884to888
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
884to888
884to888
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

#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

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ß!

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

178 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige