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
> 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
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
> > 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.
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
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
> 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.
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
> 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 ;-)
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.