Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Language von Excel

48 views
Skip to first unread message

Michael

unread,
Jul 16, 2008, 7:00:42 AM7/16/08
to
Hallo zusammen,

wie bekommt man die benutzte Sprache des laufeneden Excelapplication objects

oXL = new Excel.Application();

mit oXL.UILanguage?
Da steht bei mir grad eine 0 drin. Das sagt mir jetzt aber nicht wirklich
was.

Wozu brauch ichs:
Ein englisches braucht
oRng.Formula = "=RAND()*100000";

Ein deutsches:
oRng.Formula = "=ZUFALLSZAHL()*100000";

Danke und Gruss
Michael

Frank Dzaebel

unread,
Jul 16, 2008, 7:29:51 AM7/16/08
to
Hallo Michael,

> wie bekommt man die benutzte Sprache des laufeneden Excelapplication objects
> oXL = new Excel.Application();
> mit oXL.UILanguage?

nein. Zum Beispiel mit:

int lang = oXL.LanguageSettings.get_LanguageID(
Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI);
// ggf. msoLanguageIDInstall
if (CultureInfo.GetCultureInfo(lang).TwoLetterISOLanguageName == "de")
// dann zum Beispiel deutsch

Gehört eher schon in eine Excel Gruppe.


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Marvin Massih

unread,
Jul 16, 2008, 8:52:01 AM7/16/08
to
Hallo Michael,

Michael schrieb:


> Ein englisches braucht
> oRng.Formula = "=RAND()*100000";
>
> Ein deutsches:
> oRng.Formula = "=ZUFALLSZAHL()*100000";

Müsstest Du über oRng.FormulaR1C1 nicht auch in der deutschen Version
englische Formeln verwenden können, die dann ggf. von Excel auf Deutsch
angezeigt werden?
So macht das zumindest der Makro-Recorder.

Gruß
Marvin

Frank Dzaebel

unread,
Jul 16, 2008, 9:20:35 AM7/16/08
to
Hallo Marvin,

> > Ein englisches braucht
> > oRng.Formula = "=RAND()*100000";
> > Ein deutsches:
> > oRng.Formula = "=ZUFALLSZAHL()*100000";
>
> Müsstest Du über oRng.FormulaR1C1 nicht auch in der deutschen Version
> englische Formeln verwenden können, die dann ggf. von Excel auf Deutsch
> angezeigt werden?

Nein, "Range.Formula" und "Range.FormulaR1C1" nutzen
die Makro-Sprache, die natürlich auch Deutsch sein kann.
Da geht dann ggf. kein "RAND" im deutschen Excel.
FormulaLocal würde die Sprache des Users nehmen (ginge auch nicht).

[Range.Formula Property (Microsoft.Office.Interop.Excel)]
http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range.formula.aspx

[Range.FormulaR1C1 Property (Microsoft.Office.Interop.Excel)]
http://msdn.microsoft.com/de-de/library/microsoft.office.interop.excel.range.formular1c1(VS.80).aspx

Theroetisch wäre ja noch "FormulaLocal" ein Ansatz:

"Assume that you enter the formula =
SUM(A1:A10) in cell A11 on worksheet one, using the
American English version of Microsoft Excel. If you then
open the workbook on a computer that's running the
German version and run the following example, the example
displays the formula =SUMME(A1:A10) in a message box."

[FormulaLocal Property [Excel 2007 Developer Reference]]
http://msdn.microsoft.com/en-us/library/bb213525.aspx

Nur, man befindet sich ja hier in einem
Automationsszenario, Marvin.

Marvin Massih

unread,
Jul 16, 2008, 9:52:55 AM7/16/08
to
Hallo Frank,

Frank Dzaebel schrieb:


> Nein, "Range.Formula" und "Range.FormulaR1C1" nutzen
> die Makro-Sprache, die natürlich auch Deutsch sein kann.

Der Makro-Recorder meines deutschen Excel 2007 unter meinem deutschen
Vista Ultimate erzeugt mir so etwas:

ActiveCell.FormulaR1C1 =
TRUNC((TODAY()-WEEKDAY(TODAY(),2)-DATE(YEAR(TODAY()+4-WEEKDAY(TODAY(),2)),1,-10))/7)

Das sieht mir doch sehr englisch aus ;-).
Das Makro lässt sich auch in einem deutschen Excel 2003 unter einem
deutschen XP Pro ausführen.

Gruß
Marvin

Marvin Massih

unread,
Jul 16, 2008, 10:19:16 AM7/16/08
to
Ich schrieb:
> ActiveCell.FormulaR1C1 =
> TRUNC((TODAY()-WEEKDAY(TODAY(),2)-DATE(YEAR(TODAY()+4-WEEKDAY(TODAY(),2)),1,-10))/7)

Natürlich in Anführungszeichen...

Das Verhalten lässt sich auch ganz leicht reproduzieren:

Einfach irgendwo Zahlen eingeben, Makrorekorder anschmeißen und in
irgendeine Zelle "=SUMME(<Bereich>)" schreiben.
Der erzeugte Code sieht dann ungefähr so aus:

ActiveCell.FormulaR1C1 = "=SUM(R[-2]C:R[-1]C)"

Also eindeutig der englische Begriff.

Gruß
Marvin

Frank Dzaebel

unread,
Jul 16, 2008, 10:19:29 AM7/16/08
to
Hallo Marvin,

> Das sieht mir doch sehr englisch aus ;-).
> Das Makro lässt sich auch in einem deutschen Excel 2003
> unter einem deutschen XP Pro ausführen.

Marvin, es geht hier nicht um Makros.
Es ist ja ein guter Einfall, aber es hilft hier
IMHO nicht.

Ich wiederhole das nochmal:
Der OP führt hier eine Automatisierung über C# aus!
Versuche einmal "ActiveCell.FormulaR1C1=Sum(..."
in Deinem Excel über *AUTOMATION* zu setzen.
Das funktioniert so nicht, aber das deutsche
funktioniert (lies das Original-Posting des OP).

Das das englische "Sum" über andere Wege
funktioniert, steht doch schon haarklein in
meinem Posting und in der Doku.

Marvin Massih

unread,
Jul 16, 2008, 10:38:52 AM7/16/08
to
Hallo Frank,

Frank Dzaebel schrieb:


> Ich wiederhole das nochmal:
> Der OP führt hier eine Automatisierung über C# aus!

Ok, ich war davon ausgegangen, dass die Automatisierungs-Schnittstelle
identisch ist mit dem, das über VBA verfügbar ist.
Ergo: Wenn es über VBA geht, geht es auch über C#
Wenn ich mich da getäuscht habe, passt der Ratschlag natürlich nicht.

Gruß
Marvin

Frank Dzaebel

unread,
Jul 16, 2008, 11:45:41 AM7/16/08
to
Hallo Michael,

> int lang = oXL.LanguageSettings.get_LanguageID(
>     Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI);

Bessere Lösung aber normal über Reflection:

CultureInfo englishCulture = CultureInfo.GetCultureInfo("en-US");

private void SetFormulaLocal()
{
Range range = xlApp.get_Range("B1", Missing.Value);
xlApp.get_Range("A1", "A2").Value2 = 2222;
object ret = range.GetType().InvokeMember("Formula",
BindingFlags.SetProperty, null, range,
new object[] { "=Sum(A1+A2)" }, englishCulture);
}

[Creating Excel Solutions for Use in Multiple Countries/Regions Using
Visual Studio Tools for Office]
http://msdn.microsoft.com/en-us/library/aa537159.aspx

Dass die Frage in eine Excel-Gruppe gehört, nehme ich mal ganz schnell
zurück ;-)

Frank Dzaebel

unread,
Jul 16, 2008, 12:57:10 PM7/16/08
to
> Bessere Lösung aber normal über Reflection:
> object ret = range.GetType().InvokeMember("Formula", ...

oder ggf. auch analog:
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
http://groups.google.com/group/microsoft.public.de.german.entwickler.dotnet.csharp/msg/8070c9ae7c853a53

Das kann aber auch Seiteneffekte haben (englische Fehlermeldungen,
englisches Datums-Format etc.).
Das muss dann sorgfältig gegen Performance und Kultur-
Effekte geprüft werden. Sauberer im Normalfall zwar Reflection,
es gibt aber pragmatische Fälle "pro" CurrentCulture.

0 new messages