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

Excel 2003 ActiveCell.NumberFormat

73 views
Skip to first unread message

Sebastian Lange

unread,
May 21, 2007, 12:43:00 PM5/21/07
to
Hallo,

Ich verzweifle gerade etwas bei der Entwicklung eines Excel-Addins.


ExcelAppObject.ActiveCell.FormulaR1C1Local = str; // str="12"
// Dieser Aufruf funktioniert ganz prima.

ExcelAppObject..ActiveCell.NumberFormat = "$#,##0.00_);[Red]($#,##0.00)";
// Dieser Aufruf löst eine Exception aus und zwar:

System.Runtime.InteropServices.COMException
"Altes Format oder ungültige Bibliothek."

Der Filter-String ist ein Sample aus der VB-Referenz für Excel 2003 und in
VB funktioniert er auch. Ich weiss nicht genau ob die NumberFormat-Eigenschaft
sein Problem ist oder der Filter-String. Sehe ich irgendwas nicht?


Viele Grüsse
Sebastian Lange


Ich habe ein frisches System aufgesetzt mit VS.NET 2003 und Office 2003.
Einbinden tuhe ich die Office 11.0 Object Library und die Excel 11.0 Object
Library.


Frank Dzaebel

unread,
May 21, 2007, 2:13:07 PM5/21/07
to
Hallo Sebastian,

> Ich verzweifle gerade etwas bei der Entwicklung eines Excel-Addins.
> ExcelAppObject.ActiveCell.FormulaR1C1Local = str; // str="12"
> // Dieser Aufruf funktioniert ganz prima.
> ExcelAppObject..ActiveCell.NumberFormat = "$#,##0.00_);[Red]($#,##0.00)";
> // Dieser Aufruf löst eine Exception aus und zwar:

Hast Du vielleicht ein deutsches Excel?
Aus [Red] mach [Rot] (oder [Farbe3]).


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

Frank Dzaebel

unread,
May 21, 2007, 4:20:59 PM5/21/07
to
> Hast Du vielleicht ein deutsches Excel?
> Aus [Red] mach [Rot] (oder [Farbe3]).

In dem Fall ist die generische Methode da auch,
bei solchen Operationen die Thread-Kultur zu ändern:

CultureInfo oldCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
app.ActiveCell.FormulaR1C1Local = "12";
app.ActiveCell.NumberFormat = "$#,##0.00_);[Red]($#,##0.00)";
Thread.CurrentThread.CurrentCulture = oldCulture;

Sebastian Lange

unread,
May 22, 2007, 10:34:00 PM5/22/07
to
Hallo Frank,

Also ich habe die englische Version von Office 2003 installiert frisch nach
VS.NET 2003 auf einem extra frischen VM-Ware System um jeglichem Library
Durcheinander vorzubeugen. Es ist offensichtlich so das dass Object ActiveCell
einfach nicht da ist, gleiches gilt z.B. auch für ExcelApp.Hwnd, auch der
Debugger
sagt mir zur Laufzeit: "ExcelApp.Hwnd" ist nicht vorhanden. Ich habe ein
"gemeinsames Add-In" aus den Projektvorlagen gewählt, den bestehenden
Office-Verweis entfernt und dann MS Office und Excel 11.0 Object Library
hinzugefügt. Da standen auch andere Versionen in Verweise/COM muss ich dazu
sagen.(System ist aber wie gesagt frisch). Wenn ich die gleichen Librarys in
einem VB6 Projekt mal testweise benutze funktioniert auch alles ganz prima.
Irgendwas geht bei diesem .NET Mapping mächtig schief und ich fühle mich
unschuldig in der Beziehung.

Viele Grüsse
Sebastian

Peter Fleischer

unread,
May 22, 2007, 11:37:04 PM5/22/07
to
Sebastian Lange wrote:
> Hallo Frank,
>
> Also ich habe die englische Version von Office 2003 installiert
> frisch nach VS.NET 2003 auf einem extra frischen VM-Ware System um
> jeglichem Library Durcheinander vorzubeugen. Es ist offensichtlich so
> das dass Object ActiveCell einfach nicht da ist, gleiches gilt z.B.
> auch für ExcelApp.Hwnd, auch der Debugger
> sagt mir zur Laufzeit: "ExcelApp.Hwnd" ist nicht vorhanden. Ich habe
> ein "gemeinsames Add-In" aus den Projektvorlagen gewählt, den
> bestehenden Office-Verweis entfernt und dann MS Office und Excel 11.0
> Object Library hinzugefügt. Da standen auch andere Versionen in
> Verweise/COM muss ich dazu sagen.(System ist aber wie gesagt frisch).
> Wenn ich die gleichen Librarys in einem VB6 Projekt mal testweise
> benutze funktioniert auch alles ganz prima. Irgendwas geht bei diesem
> .NET Mapping mächtig schief und ich fühle mich unschuldig in der
> Beziehung.

Hi Sebastian,
auf alle Active-Objekte, Activate- und Select-Methoden sollte man bei der
Objektautomatisierung verzichten, da sie einen konkreten Zustand der
Interaktion mit dem Bediener erfordern. Wenn da etwas nicht richtig
aktiviert bzw. selektiert ist, kommen Fehler.

Es sollte bei der Objektautomatisierung immer nur mit Range-Objekten
gearbeitet werden. Dein Beispiel funktioniert mit einem deutschen Office
2003 bei mir problemlos mit folgendem VB-Code:

Dim app As Object = CreateObject("Excel.Application")
app.Visible = True
app.Workbooks.Open("c:\temp\x.xls")
Dim sh As Object = app.Worksheets(1)
Dim rng As Object = sh.Cells(2, 2)
rng.Value = -123456.78
rng.NumberFormat = "$#.##0,00_);[Rot]($#.##0,00)"


--
Viele Grüße

Peter


Frank Dzaebel

unread,
May 23, 2007, 2:28:55 AM5/23/07
to
Hallo Sebastian,

> Also ich habe die englische Version von Office 2003 installiert frisch
> nach
> VS.NET 2003 auf einem extra frischen VM-Ware System um jeglichem Library
> Durcheinander vorzubeugen.

Lass uns dann mal zunächst bei diesem NumberFormat
Problem bleiben. Also ich denke trotzdem weiter, es
kann das [Red] -> [Rot] Problem sein. Was ist denn Dein:
Thread.CurrentThread.CurrentCulture.Name
vor dem Setzen des NumberFormat's, etwa "de-DE"?
Dann solltest Du das gemäss meinen Tips ändern.
Oder das es jetzt dadurch eh schon bei Dir funktioniert?

> Es ist offensichtlich so das dass Object ActiveCell
> einfach nicht da ist, gleiches gilt z.B. auch für
> ExcelApp.Hwnd, auch der Debugger sagt mir
> zur Laufzeit: "ExcelApp.Hwnd" ist nicht vorhanden.

Also Du meinst das Object selber und nicht
die Methode als solches. Dass das Objekt ActiveCell noch
nicht beim OnConnection da ist, ist vollkommen normal.
Beachte hier den Zeitpunkt, wann diese Methode aufgerufen
wird! Da ist das Excel-UI noch nicht aufgebaut.
Kopple das Setzen der ActiveCell an einen
Event der ExcelApp und setze dann erst die ActiveCell.

Beachte, das Du unbedingt diesen Event mit "-=" bei
OnDisconnection wieder unsubscriben musst.

Sebastian Lange

unread,
May 24, 2007, 11:21:01 AM5/24/07
to
Hallo Frank,

Tut mir leid ich hatte mich so darauf versteift ein Library Problem oder
sowas zu haben. Dein Code-Schnipsel hat funktionert! *unbelivable*. In meinem
Universum
kam das ändern einer Thread-Kultur bisher einfach nicht vor. Eine letzte
Frage habe ich noch :p wenn ich einen Menü-Button als Seperator haben möchte
also eine Trennlinie, was muss ich dem Button dazu mitteilen?

Viele Grüss&Danke
Sebastian

Frank Dzaebel

unread,
May 24, 2007, 3:27:36 PM5/24/07
to
Hallo Sebastian,

> Tut mir leid ich hatte mich so darauf versteift ein Library Problem oder
> sowas zu haben. Dein Code-Schnipsel hat funktionert! *unbelivable*. In
> meinem
> Universum kam das ändern einer Thread-Kultur bisher einfach nicht vor.

Ja, na wenigstens funktioniert's jetzt.


> Eine letzte Frage habe ich noch :p wenn ich einen Menü-Button als
> Seperator haben möchte also eine Trennlinie, was muss ich dem
> Button dazu mitteilen?

Bei Excel oder bei .NET?
Übrigens sollte man normal bei einer neuen (thematischen)
Frage auch einen neuen Thread dafür erstellen.

0 new messages