Excel: Was ist ein Anwendungsfall für FormulaLocal?

Bonanca

Captain
Registriert
Aug. 2015
Beiträge
4.048
Hiho @All,

ich habe von einem Arbeitskollegen eine Excel Datei erhalten, in der Formeln in VBA via "FormulaLocal" eingesetzt werden. Da er anscheinend Excel auf deutsch verwendet, ich jedoch auf Englisch, führte das auch gleich #NAME? Einträgen in den entsprechenden Zellen.
Ein Test hat, wie die Doku im Grunde auch schon sagt, meine Vermutung bestätigt:
Zelle.Formula = "=SUM(A1:B2)" funktioniert unabhängig von Excelspracheinstellung.
Zelle.FormulaLocal = "=SUM(A1:B2)" führt zu #NAME?

Rufe ich eine eingetragene Formel aus einer Zelle ab:
Zelle.Formula liefert die Formel auf Englisch
Zelle.FormulaLocal liefert die Formel auf der Excelsprache (d.h. also exakt so, wie die Formel einem mit Klick auf die Zelle auch angezeigt wird.)

Meine Frage wäre nun: Was ist ein Anwendungsfall für FormulaLocal?
Wenn ich mir die Beschreibungen der Funkionen in der Doku oder auf https://www.superexcelvba.com/en/tutorial/024-excel-formulas anschaue, dann ist FormulaLocal einzig und allein eine Beschneidung in der Kompatibilität ohne echten Nutzen. VBA als solches muss doch ohnehin auf Englisch geschrieben werden (oder nicht?), die einzusetzenden Formeln also entsprechend auch auf Englisch einzugeben (um .Formula zu nutzen) erscheint mir jetzt nicht als eine Hürde.
Aber selbst wenn jemand die englischen Zell-Funktionen nicht kennt, kann man diese doch trotzdem mittels
.FormulaLocal = Formel in Muttersprache
MsgBox .Formula Formel wird auf englisch angezeigt
Programmierer kopiert diese Formel 1:1 in seinen VBA Code und macht aus .FormulaLocal ein .Formula
einbauen und erhält einen VBA-Code, der unabhängig von der Spracheinstellung funktioniert.

Habe ich einen Anwendungsfall übersehen? Gibt es einen Grund FormulaLocal nicht nur temporär (zum übersetzen wie oben, wobei es auch da alternativen gibt, die ohne FormulaLocal auskommen.), sondern als Endlösung in einem VBA-Skript zu belassen?
Bitte helft mir zu verstehen.

MfG
Bonanca
 
Wenn in Excel die Sprachversion auf "Deutsch" eingestellt ist, dann müssen auch deutschsprachige Formeln verwendet werden.
WENN(....
SUMME(....
usw.
Das Selbe gilt für andere Spracheinstellungen, dann eben entsprechend die Formeln in der enprechenden Sprache.

Im VBA-Modul muss dann in dem Fall Zelle.FormulaLocal und nicht Zelle.Formula eingegeben werden.
Ansonsten werden in den entsprechenden Zellen die Formel in englischer Sprache übertragen und das führt dann dazu, dass die Formel nicht funktioniert.
If(...
SUM(...
usw.

Die Scripsprache in VBA ist immer englisch. Man kann da aber auch deutsche Begriffe einsetzen, die müssen allerdings zwingend in eine Variable konvertiert werden.
 
NotNerdNotDau schrieb:
Im VBA-Modul muss dann in dem Fall Zelle.FormulaLocal und nicht Zelle.Formula eingegeben werden.
Ansonsten werden in den entsprechenden Zellen die Formel in englischer Sprache übertragen und das führt dann dazu, dass die Formel nicht funktioniert.
If(...
SUM(...
usw.

Dann scheint dein Excel etwas anders zu machen als meines.

Mein VBA Skript:
Code:
Sub Formula()
    ActiveSheet.Cells(1,1).Formula = "=SUM(B1:C3)"
End Formula
Das Resultat in der Zelle A1: =SUMME(B1:C3).
Wie übrigens auch im Eingangspost erwähnt.

Würde ich hingegen ActiveSheet.Cells(1,1).FormulaLocal in VBA nutzen, dann würde in der Zelle auch =SUM(B1:C3) stehen und die Zelle gibt einen Fehler zurück.
Ebenfalls wie im Eingangspost erwähnt.

Dein Beispiel wird von Excel so nicht umgesetzt.
 
Bonanca schrieb:
Dann scheint dein Excel etwas anders zu machen als meines.
Wahrscheinlich nicht.
Bei uns auf der Arbeit ist das Verwenden von Makros seit geraumer Zeit nicht mehr erlaubt.
Bis zu dem Zeitpunkt hatte ich über VBA die Abläufe in Excel-Dokumente automatisiert.

Nach dem Verbot bin ich dann zwangsläufig auf PowerShell umgestiegen und setze die Vorgaben damit um.
In den PS-Skripts verhält es sich fast genauso, wie oben in meinem Beitrag beschrieben.

Das sieht zum Beispiel so aus:
$Sheet1.Range("B27").FormulaLocal = "=HEUTE()"

Würde ich
$Sheet1.Range("B27").Formula = "=HEUTE()"
oder
$Sheet1.Range("B27").Formula = "=TODAY()"
verwenden, würde die Formel im Exceldokument nicht funktionieren und es gäbe eine Fehlermeldung.
Weil eben die Sprachversion in Excel auf deutsch eingestellt ist.

Ich bin, offensichtlich fälschlicherweise, davon ausgegangen, dass es in VBA genauso war. Ist halt schon länger her und ich habe deshalb vieles nicht mehr auf dem Schirm.
Entschuldige bitte die Verwirrungen.
 
NotNerdNotDau schrieb:
$Sheet1.Range("B27").FormulaLocal = "=HEUTE()"

Und was hindert dich jetzt genau daran die international nutzbare Formel
Code:
$Sheet1.Range("B27").Formula = "=TODAY()"
zu nutzen?
 
Bonanca schrieb:
Und was hindert dich jetzt genau daran die international nutzbare Formel
Siehe
NotNerdNotDau schrieb:
Würde ich
$Sheet1.Range("B27").Formula = "=HEUTE()"
oder
$Sheet1.Range("B27").Formula = "=TODAY()"
verwenden, würde die Formel im Exceldokument nicht funktionieren und es gäbe eine Fehlermeldung.
Weil eben die Sprachversion in Excel auf deutsch eingestellt ist.
 
NotNerdNotDau schrieb:
würde die Formel im Exceldokument nicht funktionieren und es gäbe eine Fehlermeldung.
Weil eben die Sprachversion in Excel auf deutsch eingestellt ist.
Aha.
Mein Powershell script:
Code:
$excel = New-Object -ComObject Excel.Application
$workbook = $excel.Workbooks.Open("PFAD\Test.xlsx")
$worksheet = $workbook.Worksheets.Item(1)

$worksheet.Range("A1").Formula = "=SUM(C1:E4)"
$workbook.Save()
$workbook.Close()

Ich öffne die Excel, und was steht in A1: =SUMME(C1:E4)
Also exakt das gleiche Verhalten wie bei VBA. FormulaLocal ist nicht notwendig.


Edit:
Der Vollständigkeit halber: Gebe ich im Script "=TODAY()" ein, steht in A1 (wie zu erwarten?) ebenfalls "=HEUTE()".
 
Ich bin mir relativ sicher, dass ich vor längerer Zeit mal Probleme hatte, als ich diese Unterscheidung nicht gemacht hatte.
Das war allerdings unter Office 2010.

Aktuell nutze ich Microsoft 365 und habe das jetzt mal in der darin enthaltenen Excel nachvollzogen.
In der Tat, die Verwendung von ".FormulaLocal" ist nicht mehr notwendig.
Die Verwendung von ".Formula" führt zu dem von dir geschilderten Ergebnis und somit hast du recht.
 
Zurück
Oben