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

Forumthread: Unterschiedliche Sprachen

Unterschiedliche Sprachen
04.03.2009 11:46:26
manu
HAllo
bei uns gibt es verschiedene Excel Versionen hinsichtlich der Sprache.
Die Funktion "GetOpenFilename" gibt je nach Deutscher oder Englischer Version "false" oder "falsch" zurück bzw. den Filename selber. Kann man das irgendwie standardisieren mit wenig Code? Ich weiss nicht, wie viele Sprachen noch im Umlauf sind und ich wollte nicht für jede Sprache raussuchen, wie "falsch" jetzt do heist.
Dann lese ich noch erstellte PivotTables aus. Das Zwischenergebnis ".... Ergebnis" heist es nur im Deutschen so. Irgendeine Idee, wie man das einfach codieren kann?
GRuss
Manu
Anzeige

20
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Unterschiedliche Sprachen
04.03.2009 11:51:34
Tino
Hallo,
übergib den Rückgabewert an eine Variable vom Typ Boolean, diese sollte damit umgehen können.
Beispiel:

Dim booWert As Boolean
booWert = "Wahr"
Debug.Print booWert
booWert = "Falsch"
Debug.Print booWert


Gruß Tino

AW: Unterschiedliche Sprachen
04.03.2009 11:57:49
Ramses
Hallo
Da geht auch "False"
Function demo() As Variant
    Dim x
    x = Application.GetOpenFilename("Text Files (*.txt), *.txt")
    If x = False Then
        MsgBox "Wert X: " & x & ", also OK"
    End If
End Function

Das mit "...Ergebnis":
Da ich nicht weiss wie du die Zellen durchsuchst, würde ich es mit dem Formeltest probieren
Instr(1,Cells(x,x).Formula,"SUBTOTAL") > 1 Then
Gruss Rainer
Anzeige
AW: Unterschiedliche Sprachen
04.03.2009 12:16:56
Jogy
Hi.
Ich würde das sogar eher mit
If VarType(x) =vbBoolean Then ...
machen.
Ist im konkreten Fall egal, da GetOpenFilename nur im Fehlerfall ein "Falsch" zurückgeben kann, beispielsweise bei Application.InputBox könnte "Falsch" aber eine Eingabe gewesen sein.
Gruss, Jogy
AW: Unterschiedliche Sprachen
04.03.2009 12:20:34
Ramses
Hallo
Da Variablen normalerweise spezifisch deklariert werden sollen !!!
Dim x As String
können diese nicht plötzlich "vbBoolean" werden

Function demo() As Variant
Dim x As String
x = Application.GetOpenFilename("Text Files (*.txt), *.txt")
If VarType(x) = vbBoolean Then
MsgBox "Wert X: " & x & ", also OK"
End If
End Function


Gruss Rainer

Anzeige
AW: Unterschiedliche Sprachen
04.03.2009 12:56:35
Jogy
Hi.
Mit einer spezifischen Deklaration hast Du schon bei GetOpenFilename ein Problem, wenn Multiselect auf True steht. Und wie Du mit einer spezifisch als String deklarierten Variable eine Eingabe bastelst, bei der sowohl keine Eingabe (womit InputBox ausfällt) als auch "Falsch" (womit Application.InputBox ausfällt) vorkommen kann (und beides natürlich im Gegensatz zum Drücken des Abbrechen-Buttons keinen Abbruch hervorrufen soll), das würde mich dann schon interessieren - vielleicht habe ich da ja bislang etwas übersehen und es wäre natürlich schön, wenn sich das anders lösen ließe.
Von daher ist dieses "sollen" schön und recht, nur gibt es Anwendungsfälle, bei denen eine spezifische Deklaration nicht sinnvoll ist. Und welchen konkreten Nachteil eine Variant-Deklaration hier hat, ist mir auch nicht so recht klar. Da würde ich (bei längerem Code) eher die Bezeichnung der Variable mit "x" als problematisch ansehen.
Gruss, Jogy
Anzeige
AW: Unterschiedliche Sprachen
04.03.2009 13:12:43
Ramses
Hallo
"...als auch "Falsch" (womit Application.InputBox ausfällt)..."
Das ist doch kein Hinderungsgrund ?
"..das würde mich dann schon interessieren..."
Das ist ja Programmierlogik und abhängig davon was ich erreichen will.
Dementsprechend definiere ich die Variablen.
Wenn ich zwingend einen Integerwert benötige, dann werde ich sicher keine Dezimalzahl erlauben = Variablendeklaration
"...nur gibt es Anwendungsfälle, bei denen eine spezifische Deklaration nicht sinnvoll ist..."
Kenn ich ehrlich gesagt keine. Ich definiere Variable weil ich bestimmte Werte/Objecte brauche und auch wissen muss was dort drin steht.
"...Da würde ich (bei längerem Code) eher die Bezeichnung der Variable mit "x" als problematisch ansehen..."
Gebe ich dir recht, aber für die Demo reicht es :-)
Gruss Rainer
Anzeige
AW: Unterschiedliche Sprachen
04.03.2009 13:25:14
Jogy
"...als auch "Falsch" (womit Application.InputBox ausfällt)..."
Das ist doch kein Hinderungsgrund ?

Hast Du es schon mal ausprobiert? Wenn ich Application.InputBox verwende, dann steht in einem String sowohl bei Eingabe von "Falsch" als auch beim Druck von Abbrechen eben "Falsch". Wie soll man das unterscheiden? Bei einer Variant-Variable habe ich dagegen einmal einen String "Falsch" und das andere Mal eine boolsche Variable mit False.
Wenn ich zwingend einen Integerwert benötige, dann werde ich sicher keine Dezimalzahl erlauben = Variablendeklaration
Den grundsätzlichen Sinn von Variablendeklarationen habe ich nie bestritten. Ist ja nicht so, dass ich nur Variant im Code hätte, das beschränkt sich im wesentlichen auf die beiden genannten Beispiele.
"...nur gibt es Anwendungsfälle, bei denen eine spezifische Deklaration nicht sinnvoll ist..."
Kenn ich ehrlich gesagt keine. Ich definiere Variable weil ich bestimmte Werte/Objecte brauche und auch wissen muss was dort drin steht.

GetOpenFileName, Multiselect auf True. Gibt einen Array zurück, wenn etwas ausgewählt wurde und eine boolsche Variable wenn nicht. Da kommt man nur mir Variant weiter, weil ich zwar weiß was ich will, aber nicht weiß, was ich kriege. Oder habe ich hier eine Lücke?
Gruss, Jogy
Anzeige
AW: Unterschiedliche Sprachen
04.03.2009 14:09:57
Ramses
Hallo
Dachte ich auch, das wäre kein Hinderungsgrund,... muss mich nun aber von dir belehren lassen :-)
Erstaunlich, dass die beiden Inputboxen unterschiedliche Rückgabewerte haben
Sub Demo3()
    Dim x As String
    x = Application.InputBox("Bitte ""Falsch"" eingeben", "Test", "Falsch", Type:=2)
    If StrPtr(x) = 0 Then
        MsgBox "Abbrechen gedrückt"
    Else
        MsgBox "Mit OK bestätigt"
    End If
End Sub

Sub Demo4()
    Dim x As String
    x = InputBox("Bitte ""Falsch"" eingeben", "Test", "Falsch")
    If StrPtr(x) = 0 Then
        MsgBox "Abbrechen gedrückt"
    Else
        MsgBox "Mit OK bestätigt"
    End If
End Sub

Das mit Mulitselect hatte ich noch nicht :-)
Scheint aber tatsächlich ein Problem zu sein. Muss mal sehen ob es da was gibt.
Gruss Rainer
Anzeige
AW: Unterschiedliche Sprachen
04.03.2009 16:10:10
Jogy
Hi.
Das mit den unterschiedlichen Rückgabewerten ist mir auch erst hier im Forum mal bewußt geworden, als das zu unterschiedlichen Reaktionen im Programm eines Fragstellers und in meinem Beispielcode geführt hat.
Aber Dein Code war jetzt für mich wieder aufschlussreich, mit StrPtr habe ich noch gar nie gearbeitet. Dadurch bekommt man zumindest bei InputBox die richtige Reaktion hin. Da war dann wohl doch eine Lücke bei mir ;). Da werden wohl ein paar Application.Inputbox wieder der InputBox weichen.
Wobei das ganze Verhalten schon interessant ist:
StrPtr(vbNullString) = 0
StrPtr("") = 116900028
"" = vbNullString
Verstehe wer will...
Gruss, Jogy
Anzeige
Es wird noch interssanter
04.03.2009 19:23:19
Ramses
Hallo
Probier mal mehrfach dieses aus
Sub Demo3()
    Dim x As String
    x = Application.InputBox("Bitte ""Falsch"" eingeben", "Test", "Falsch", Type:=2)
    Debug.Print StrPtr(x)
    If StrPtr(x) = 0 Then
        MsgBox "Abbrechen gedrückt"
    Else
        MsgBox "Mit OK bestätigt"
    End If
End Sub

Und beende die Application.Inputbox immer mit Abbrechen und schau dir dann die Werte im Direktfenster an.
Die Zahl änderst sich jedesmal , sonst wäre es eine Variante wie man das abfragen könnte
Keine Idee was hier ausgewertet wird. StrPtr ist zwar ein Zeiger, und ich glaube dass hier die Speicheradresse zurückgegeben wird als Long-Wert.
Aber zum verwerten habe ich bisher keine Systematik gefunden, der regelmässig auf den korrekten Rückgabewert schliessen lässt
Gruss Rainer
Anzeige
nicht über einen Kamm scheren
04.03.2009 22:45:13
Tino
Hallo,
ich würde GetOpenFilename und die InputBox nicht über einen Kamm scheren.
Bei GetOpenFilename, kann man nur einen Pfad zurückgeben oder auf abbrechen drücken.
Durch die Typumwandlung, wird aus
CStr(False) = "Falsch" (deutsches System)
CStr(False) = "False" (englischen System)
Bei GetOpenFilename wird bei Abbruch
"Falsch" (deutsches System)
"False" (englisches System)
zurückgegeben.
Diese beiden Strings kann ich miteinander vergleichen ohne
aus der Variablen sFile einen Varianten Typ machen.
Eine zwiespältige Rückgabe wie bei Application.InputBox ist bei GetOpenFilename
sowieso nicht möglich.
Entweder bekomme ich einen Pfad zurück oder eben durch Abbruch False.
Brauch also nicht zwingend einen Varianten Typ.

Sub test()
Dim sFile As String
sFile = Application.GetOpenFilename("Text Files (*.txt), *.txt")
If sFile = CStr(False) Then
MsgBox "Benutzer hat abgebrochen", vbInformation
Else
MsgBox "Benutzer hat die Datei" & Chr(13) & sFile & Chr(13) & "gewählt", vbInformation
End If
End Sub


Bei der Inputbox würde ich individuell vorgehen,
je nach dem was ich als Rückgabe erwarte.
Bei Text (String) verwende ich
InputBox und fange den Abbruch über StrPtr ab.
Bei Zahlen oder so, verwende ich Application.InputBox und
begrenze die Eingabe mit der Angabe des entsprechenden Typs.
Gruß Tino

Anzeige
AW: Es wird noch interssanter
05.03.2009 13:13:02
Jogy
Hi.
Wobei das ja noch logisch ist, die Speicheradresse ändert sich ja bei jeder Ausführung. Von daher ist StrPtr eigentlich nur bei InputBox sinnvoll, da dort bei Abbrechen keine Speicheradresse existiert (übrigens auch, wenn die Variable der zugwiesen wird vorher schon einen Wert hatte).
Bei Application.InputBox hilft eigentlich nur die Typabfrage, wenn es wirklich wasserdicht sein soll.
Gruss, Jogy
Anzeige
AW: Unterschiedliche Sprachen
04.03.2009 12:50:23
Tino
Hallo,
oder wenn die Variable ein String bleiben soll, könnte es auch so gehen.
True und False werden mit cstr in der Landessprache ausgegeben.

Dim x As String
x = Application.GetOpenFilename("Text Files (*.txt), *.txt")
Debug.Print x = CStr(False)
Debug.Print x = CStr(True)


Gruß Tino

Anzeige
AW: Unterschiedliche Sprachen
04.03.2009 12:54:53
Ramses
Hallo Tino
"...werden mit cstr in der Landessprache ausgegeben..."
Das will er ja vermeiden

Function demo() As Variant
Dim x As String
x = Application.GetOpenFilename("Text Files (*.txt), *.txt")
If x = False Then
MsgBox "Wert X: " & x & ", also OK"
End If
End Function


Funktioniert immer, egal in welcher Sprache
Gruss Rainer

Anzeige
AW: Unterschiedliche Sprachen
04.03.2009 13:05:59
Tino
Hallo,
aber
x = Application.GetOpenFilename("Text Files (*.txt), *.txt")
gibt doch
"Falsch" oder "Wahr" bei deutsch
und
"False" oder "True" bei englisch zurück.
wenn x ein String ist.
Gruß Tino
AW: Unterschiedliche Sprachen
04.03.2009 13:20:31
Ramses
Hallo Tino
".."Falsch" oder "Wahr" bei deutsch..."
Nein, es ist nur eine Frage der Variablenabfrage
Option Explicit

Sub demo1()
    Dim x As String
    x = Application.GetOpenFilename("Text Files (*.txt), *.txt")
    'Abfrage International
    'Abfrage auf False = Wahrheitswert
    If x = False Then
        'X hat die den deutschen Wert "Falsch" in diesem Moment !!
        MsgBox "Wert X: " & x & ", also OK"
    End If
End Sub

Sub Demo2()
    Dim x As String
    'Abfrage Deutsch
    x = Application.GetOpenFilename("Text Files (*.txt), *.txt")
    If x = "Falsch" Then
        MsgBox "Wert X: " & x & ", also OK"
    End If
End Sub

Unter E2003 Englisch funktioniert Demo2 nicht mehr,
"Demo1" funktioniert sowohl in der deutschen wie in der englischen Version
Gruss Rainer
Anzeige
AW: Unterschiedliche Sprachen
04.03.2009 13:33:15
Tino
Hallo,
die erste geht aber nur, wenn x Falsch oder Wahr ist, steht in x der Pfad gibs ein error.
Bin auf dem weg zur arbeit, schaue heute abend noch mal rein.
Gruß Tino
AW: Unterschiedliche Sprachen
04.03.2009 15:15:13
Ramses
Hallo
Hab ich durch den Hinweis von Jogy auch bemerkt.
Es geht nur mit einer Variant Lösung, ausserdem haben Application.Inputbox und die normale Inputbox unterschiedliche Rückgabewerte was die Abbrechen/OK Tasten betreffen.
Da haut das "If StrPtr(x) =" auch nicht mehr hin,... :-(
Gruss Rainer
Anzeige
AW: Unterschiedliche Sprachen
04.03.2009 13:38:08
Tino
Hallo,
achso, daher habe ich mit cstr False in einen String gemacht.
Gruß Tino
AW: alternative Lösung
06.03.2009 23:45:38
Daniel
Hi
du könntest das auch so abfragen:
wenn mit GETOPENFILENAME auch tatsächlich eine Datei geöffnet wurde, dann steht im Ergebnisstring der Pfad mit dem Dateinamen.
dh wenn nicht abgebrochen wurde, dann enthält der Ergebnsstring immer mindestens eines von diesen Zeichen:
- den Doppelpunkt ":" (trennt den Laufwerksbuchstaben vom Pfad
- den Slash "\" (trennt die Ordner im Pfad)
- den Punkt "." (trennt das Dateiart-Suffix vom Dateinamen
der Rückgabewert beim Abbrechen ("Falsch", "False", ...) enthält diese Zeichen nicht, also brauchst du einfach nur auf das vorhanden sein von ".", ":" oder "\" zu prüfen und bist damit Sprachversionsunabhängig.
Beispiel:

Dim Datei as String
Datei = Application.GetOpenFileName
If Instr(Datei, ":") = 0 then
Msgbox "Es wurde keine Datei ausgewählt"
else
Workbooks.Open Datei
End if


Gruß, Daniel

Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Unterschiedliche Sprachen in Excel


Schritt-für-Schritt-Anleitung

Um mit verschiedenen Sprachversionen von Excel umzugehen, kannst Du die Rückgabewerte von Funktionen wie GetOpenFilename standardisieren. Hier ist eine einfache Schritt-für-Schritt-Anleitung:

  1. Deklariere die Variable:

    Dim Datei As Variant
  2. Verwende GetOpenFilename:

    Datei = Application.GetOpenFilename("Text Files (*.txt), *.txt")
  3. Überprüfe den Rückgabewert:

    If Datei = False Then
       MsgBox "Abbrechen gedrückt"
    Else
       MsgBox "Datei ausgewählt: " & Datei
    End If

Diese Methode funktioniert unabhängig von der Sprache der Excel-Version, da sie den Rückgabewert False korrekt interpretiert.


Häufige Fehler und Lösungen

  • Fehler beim Vergleich von Rückgabewerten: Wenn Du versuchst, False mit einem String zu vergleichen (z.B. x = "Falsch"), wird das nicht immer funktionieren. Verwende stattdessen:

    If x = False Then
      ' Code hier
    End If
  • Nicht eindeutige Rückgabewerte bei InputBox: Die InputBox gibt bei Abbrechen einen String zurück, was zu Verwirrung führen kann. Verwende StrPtr zur Überprüfung:

    If StrPtr(x) = 0 Then
      MsgBox "Abbrechen gedrückt"
    End If

Alternative Methoden

Eine alternative Methode zur Behandlung der unterschiedlichen Rückgabewerte besteht darin, auf spezifische Zeichen im Rückgabewert zu prüfen. Wenn eine Datei erfolgreich ausgewählt wurde, wird der Dateipfad immer einen Doppelpunkt :, einen Slash \ oder einen Punkt . enthalten. Hier ein Beispiel:

Dim Datei As String
Datei = Application.GetOpenFilename
If InStr(Datei, ":") = 0 Then
    MsgBox "Es wurde keine Datei ausgewählt"
Else
    Workbooks.Open Datei
End If

Diese Methode ist ebenfalls sprachunabhängig und einfach zu implementieren.


Praktische Beispiele

Hier sind einige praktische Beispiele, die Dir helfen können, die oben genannten Konzepte zu verstehen:

  1. Beispiel für GetOpenFilename:

    Sub DateiÖffnen()
       Dim Datei As Variant
       Datei = Application.GetOpenFilename("Text Files (*.txt), *.txt")
       If Datei = False Then
           MsgBox "Keine Datei ausgewählt"
       Else
           MsgBox "Datei ausgewählt: " & Datei
       End If
    End Sub
  2. Beispiel für die Verwendung der InputBox:

    Sub EingabePrüfen()
       Dim Eingabe As String
       Eingabe = Application.InputBox("Gib 'Falsch' ein", Type:=2)
       If StrPtr(Eingabe) = 0 Then
           MsgBox "Abbrechen gedrückt"
       Else
           MsgBox "Eingegebener Wert: " & Eingabe
       End If
    End Sub

Tipps für Profis

  • Verwende Variant für Rückgabewerte: Wenn Du nicht sicher bist, ob der Rückgabewert ein String oder ein Boolean ist, verwende Dim x As Variant, um die Flexibilität zu erhöhen.

  • Vermeide sprachspezifische Rückgaben: Nutze die CStr-Funktion, um sicherzustellen, dass die Rückgabewerte immer einen einheitlichen String zurückgeben:

    If CStr(x) = "Falsch" Then
      ' Handle case
    End If
  • Teste Deine Lösungen in verschiedenen Excel-Versionen: Da die Funktionalität in unterschiedlichen Versionen variieren kann, ist es hilfreich, Deine Lösungen in verschiedenen Sprachversionen zu testen.


FAQ: Häufige Fragen

1. Warum gibt GetOpenFilename unterschiedliche Rückgabewerte zurück?
Die Rückgabewerte können je nach Sprache der Excel-Version variieren (z.B. "Falsch" für Deutsch und "False" für Englisch). Es ist wichtig, diese Unterschiede bei der Programmierung zu berücksichtigen.

2. Wie kann ich sicherstellen, dass mein Code in verschiedenen Sprachversionen funktioniert?
Verwende universelle Rückgabewerte wie False und prüfe auf spezifische Zeichen im Dateipfad anstelle von sprachabhängigen Werten.

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