Laden...

[Erledigt] C#/VBA - Konvertierung von object[] in Variant möglich?

Erstellt von lukasS vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.222 Views
lukasS Themenstarter:in
65 Beiträge seit 2009
vor 7 Jahren
[Erledigt] C#/VBA - Konvertierung von object[] in Variant möglich?

Hallo,

ich greife in VBA auf meine C#-Klasse zu. Bis auf eine Sache, läuft alles wunderbar:
Auf der C#-Seite habe ich einige Daten, die ich als Array an den VBA-Bereich übergebe. Dieses Array wird dann direkt in die Excel-Zellen geschrieben.
Es funktioniert auch, so lange es alles string oder int ist, also einfach Typen.
Nun ist das Problem, dass die Formatierung in Excel nicht richtig ist, wenn ich alle Werte immer als string[] übergebe.
ALso kam ich auf die geniale Idee auf der C#-Seite bei meiner Funktion ein object[] als Datentyp als Rückgabewert zu nehmen, so dass das manchmal ein string oder es manchmal ein int sein kann, je nach dem.
Auf der VBA-Seite habe ich einen Variant. Aber wie es aussieht sind object[] und Variant nicht wirklich kompatibel. Stelle ich auf der C#-Seite wieder alles auf string, werden die Werte übertragen. Bei object[] wird nur ein leeres Array übertragen.

Wie müsste ich es richtig machen, damit die Werte manchmal als int, manchmal als string rüberkommen? Excel weiß ja nicht, welcher Datentyp kommen soll, das weißt nur der C#-Bereich.

Danke schon mal!

Gruß

Lukas

121 Beiträge seit 2016
vor 7 Jahren

Wieso nimmst du nicht ein var statt einem object[]?
Ist nicht unbedingt ganz sauber, aber müsste eigentlich gehen.

lukasS Themenstarter:in
65 Beiträge seit 2009
vor 7 Jahren

Wieso nimmst du nicht ein var statt einem object[]?
Ist nicht unbedingt ganz sauber, aber müsste eigentlich gehen.

Kann man überhaupt ein var zurückgeben? Bin zwar kein Freund von var oder object, dennoch würde mich das interessieren.

Meine Notlösund wäre halt erst abzufragen, welcher Typ als nächstes kommt und dann getStringArray, getIntArray etc. aus dem VBA aufzurufen. Dennoch, wie ist das wenn ich nur eine Funktion haben möchte?

F
10.010 Beiträge seit 2004
vor 7 Jahren

Das zeigt wieder einmal das viele Leute nicht verstanden haben was das var statement ist.

var besagt lediglich das man sich hier im sourcecode die explizite Typisierung spart,
aber der compiler erstellt einen fixen Typ basieren auf dem Ergebnis der Zeile.

Insofern ist das hier vollkommen unangebracht.

3.003 Beiträge seit 2006
vor 7 Jahren

Das zeigt wieder einmal das viele Leute nicht verstanden haben was das var statement ist.

Ohje, erst mit deinem Statement habe ich überhaupt verstanden, was die Vorposter dachten...das sind ja Abgründe.

@lukasS, das ist eher eine VBA-Frage: dein Ansatz, object[] zurückzugeben, ist mMn schon korrekt. Das Auspacken wird, wenn ich dich richtig verstehe, von deinem VBA-Schnippsel aus erledigt. Du müsstest also dort (und hier verlassen mich meine VBA-Kenntnisse - CTYpe oder so?) auf die wichtigsten Datentypen, die vorkommen können, testen, und entsprechend umwandeln.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

lukasS Themenstarter:in
65 Beiträge seit 2009
vor 7 Jahren

Also ich habe es geschafft. Es war noch ein Fehler in meinem C#-Bereich, den ich immer wieder übersehen habe. Dank des Wortes CType, auch wenn der direkt nichts damit zu tun hat 😃 , habe ich den entdeckt.

Ich arbeite im C#-Teil mit object[,] und gebe das Array einfach als Rückgabewert zurück. Im VBA wird das als Variant genommen, ohne CVar, CDate etc.

Das Variant-Array wird dann direkt in ein Objekt vom Typ "Name" (curRangeName.RefersToRange) übergeben und es stehen alle Werte korrekt drin.

Danke!

Lukas

W
872 Beiträge seit 2005
vor 7 Jahren

Im Zusammenspiel VBA und C# solltest Du Dich auch mit dynamic befassen.
Das ist das Equivalent zu Variant in C# - kurz gesagt ist das ein object, wo erst zur Laufzeit dynamisch geschaut wird, ob es eine Property oder eine Methode für das objekt gibt.
Das kann hilfreich sein, wenn man nicht immer wieder Casten will. Gerade bei VBA findet man die Methoden schneller als die Typen.

M
368 Beiträge seit 2006
vor 7 Jahren

Das Problem ist zwar [erledigt], aber pro forma noch [FAQ] Wie kann ich VBA-Code in C# übersetzen?

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉

lukasS Themenstarter:in
65 Beiträge seit 2009
vor 7 Jahren

Im Zusammenspiel VBA und C# solltest Du Dich auch mit dynamic befassen.
Das ist das Equivalent zu Variant in C# - kurz gesagt ist das ein object, wo erst zur Laufzeit dynamisch geschaut wird, ob es eine Property oder eine Methode für das objekt gibt.
Das kann hilfreich sein, wenn man nicht immer wieder Casten will. Gerade bei VBA findet man die Methoden schneller als die Typen.

Vielen Dank für den Tipp. Ich werde es mir auf jeden Fall anschauen.
Ich bin heute sogar auf das dynamic gestoßen, als ich nachgeschaut habe, ob man ein var als Rückgabewert von einer Funktion nehmen kann.

Falls es jemanden interessiert: Dynamic vs. Var vs. Object