Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1056to1060
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
Inhaltsverzeichnis

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

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

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

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

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige