Schwierigkeiten mit Excel-Funktionen TextToColumn und Open
-
So jetzt aber nun zu meinem Problem ich kämpfe wahnsinnig mit Excel! Momentan öffne ich Excel und schreibe dann meine Daten rein. Jetzt will ich formel drüber packen. dazu müssen die Spalten über denen die Formeln stehen sollen numerisch sein. wenn ich jetzt aber Spalte für Spalte durch gehe und jede Spalte einzeln einfüge ( und somit entscheiden kann ob numerisch oder Text) Dauert das bei 20 Datensätzen schon min 30 sec und es sollten meistens so zw. 2000 und 64000 Datensätze exportiert werden also muss ich das verwerfen.
Also hab ich zwei Möglichkeiten ich füge alles als Text ein und konvertiere dann die gewünschten Spalten,
oder ich mach es so wie ich es hatte als Datenbankobjekt, in das ich rein schreib, nur geht da nichts mit Formeln, also müsste ich dann das entstandene File öffnen und dann über mein Excel Objekt das File bearbeiten.
So jetzt aber endlich meine Frage:
Bezgl.:Möglk.1: ich bekomm TextToColum nicht zum laufen **Wie funktioniert TextToColum ?**der sagt immer---------------------------
ACRSQL
---------------------------
Die TextToColumns-Methode des Range-Objektes konnte nicht ausgeführt werden.
---------------------------
OK
---------------------------So zu Möglichkeit zwei und die mir eigentlich liebere und vor allem einfachere:
Wie öffne ich ein bestehendes Dokument? ein neues mache ich so:
objBooks = objApp.GetWorkbooks(); objBook = objBooks.Add(covOptional); objSheets = objBook.GetWorksheets(); objSheet = objSheets.GetItem(COleVariant((short)1));
auch hier die openFkt bekomm ich nicht zum laufen!
Vielen Dank für jede Antwort.
-
also in letzter Zeit entäuscht ihr mich ein wenig!
(vielleicht werd ich auch immer besser!
)
Also wenn ich bevor ich open machen will mir sowas hier anlege:COleVariant covTrue((short)TRUE), covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
und dann den Openaufruf so mache:
objApp.CreateDispatch("Excel.Application"); objBooks = objApp.GetWorkbooks(); objBook = objBooks.Open("C:\\export.xls",covOptional,covFalse,covOptional, covOptional,covFalse,covTrue,covOptional,covOptional, covTrue, covOptional,covOptional,covOptional); //objBook = objBooks.Add(covOptional); objSheets = objBook.GetWorksheets(); objSheet = objSheets.GetItem(COleVariant((short)1));
Dann geht es!
Trotzdem danke
-
Polofreak schrieb:
also in letzter Zeit entäuscht ihr mich ein wenig!
Wie wärs mal mit ner sinnvollen Überschrift... solch Verhalten ist auch sehr enttäuschend...
-
solch verhalten?
LOL
Was solln das? Nur weil die Überschrift nicht sinnvoll WAR? Ist natürlich schreckliches verhalten!!Ich weiß nicht in welchem Teil du Mod bist, aber hier die Mods verstehen wenn man mal einen Spaß macht! Die Mods hier im MFC bemühen sich auch immer zu helfen und schreiben nicht wegen so ner lächerlichen Kleinigkeit gleich so nen Motzpost wie du!
Also lass bitte die Mods im MFC die Arbeit im MFC machen und geh du wieder in deinen Bereich!
-
Solche Überschriften werden aber im allgemeinen automatisch ignoriert, d.h. ein Großteil der Leute wird deinen Post nichtmal gelesen haben.
Also: Lass sowas in Zukunft. Wenn du Frust ablassen musst, dann achte trotzdem auf den Tonfall.
Du hast dich leider in Ecken vorgewagt, die nicht mehr alltäglich sind, dann bekommt man leider auch weniger Hilfe.
Der beste Schluß daraus wäre: Sobald du es rausgefunden hast, schreib eine Anleitung für die FAQ.
-
OK ich seh ja ein dass die Überschrift scheiße war aber ich hab ja nicht gemault, sondern nur kurz angemerkt. Aber OK ich werde mich in Zukunft bemühen die Überschriften passend zu wählen. Das mit dem Ignoriert kann auch fast nicht sein ich hab mal geschaut bevor der Post von junix kam waren schon knapp 40 Hits auf dem Post, also wurde er wohl nicht ignoriert. Naja aber wenn niemand was dagegen hat,
entschuldige ich mich hiermit höflichst bei den Mods aus dem MFC-Forum, kassier die gelbe Karte und möchte dann aber bitte das hiermit vergessen (wenn niemand was dagegen hat).
Ja wenn ich denn dann schlauer geworden bin mit dem ganzen Dreck werde ich einen schönen Post machen den dann vielleicht ein netter Mod wenn er ihn für gut empfindet in die FAQ scheibt.
~P.S.: Überschrift und danach folgendes Zitat stammen von einem Radiomoderator des Radiosenders PSR der mit seinem "sinnlos Telefon" bei Mediamarkt angerufen hat~
.
-
Probier das ganze doch in VB und VBA und übertrage das (erfolgreiche) Ergebnis
einfach in C++.
1.) In VB kann man einfacher Testen "change and continue" "Direct-Fenster" usw.
2.) In VBA kannst du den Ablauf möglicherweise sogar mittels Macro-Recorder erstellen und anschliessend das Makro als Vorlage verwenden.
-
genau so hab ich es bisher versucht.
TextToColum ist jetzt nicht mehr so wichtig, da ich es ja jetzt mit einem Datenbankobjekt erstelle und es da schon richtig ist. Dann öffne ich es und bearbeite es dann. Aber gleiches Problem ist mit BorderAround:
wenn ich das als Makro aufzeichne dann bekomme ich folgenden VB Code:Sub Makro2() ' ' Makro2 Makro ' Umranden ' ' Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone Selection.Borders(xlEdgeLeft).LineStyle = xlNone With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With Selection.Borders(xlEdgeRight).LineStyle = xlNone Selection.Borders(xlInsideVertical).LineStyle = xlNone Selection.Borders(xlInsideHorizontal).LineStyle = xlNone End Sub
Und die FKT sieht in C++ so aus:
VARIANT Range::BorderAround(const VARIANT& LineStyle, long Weight, long ColorIndex, const VARIANT& Color) { VARIANT result; static BYTE parms[] = VTS_VARIANT VTS_I4 VTS_I4 VTS_VARIANT; InvokeHelper(0x42b, DISPATCH_METHOD, VT_VARIANT, (void*)&result, parms, &LineStyle, Weight, ColorIndex, &Color); return result; }
wenn ich die jetzt aber so aufrufe:
range.BorderAround(COleVariant("xlEdgeTop"),1,0,covOptional); //oder range.BorderAround(COleVariant("xlEdgeTop"),1,0,COleVariant("black"));
kommt immer der oben bei TextToColum zitierte Fehler!
Was mach ich denn falsch??
-
Warum verwendest du eigntlich dieses SCH.... Dispatch-Interface. Die DLL hat
ein duales Interface und ermöglicht dir daher "typsicheres" Arbeiten ohne
dieses Invoke und Variant Gerümpel.
Einfach mit #import reinziehen und schon sieht der Code "fast" wie in VB aus.
-
was?
Ich benutze dieses sch... Dispatch Interface, da mir bisher nichts anderes bekannt war, was muss ich wo machen?Würde mich riesig über eine ausführlichere Erklärung freuen!
P.S.:
Rahmen kann man so setzen:Border bottomborder; borders = range.GetBorders(); bottomborder = borders.GetItem((long)3); bottomborder.SetWeight(COleVariant((short)2)); //xlThin = 2
-
Ich verwende bei Einbindung von COM-Komponenten wenn möglich, eine Vorgehen nachfolgender Art:
http://www.experts-exchange.com/Programming/Programming_Languages/Cplusplus/Q_20642013.html
-
Hm scheiße, das sieht ja viel einfacher aus als dieser Dreck den ich da mache! Die Sachen die da im example stehen sind ja wirklich VB like! sprich ich mal mal wie ich es gerne hätte zeichne Makro auf, schmeiß es ins VC++ mach paar anpassungen und fertig! Wie gut des isch!
Ich werd das bei Gelegenheit mal ausprobieren, doch mittlerweile ist mein Excelsheet schon so weit formatiert, dass ich das jetzt nicht mehr verwerfen will! Aber ich brauch sowas mit Sicherheit wieder!
Vielen herzlichen Dank!