16.11.2017, 14:03 (Dieser Beitrag wurde zuletzt bearbeitet: 16.11.2017, 14:04 von M*I*B.)
Hallo liebe Forengemeinde,
da ich derzeit gezwungen bin, mich mit Excel auseinander zu setzen, hielt ich es für eine gute Idee, mich hier zu registrieren; ist es das? :05:
Ich platze auch mal gleich mit einer Aufgabe hier rein...
Eine andere Software (Altium Designer) generiert über einen Export auf ein XLTM eine Liste. So weit, so gut. Haken daran ist, das ich im Template die Zeilen formatieren kann wie ich will; der Export- Stream bringt seine eigenen Formate mit (Links, Schriftgröße, Nachkommastellen bei Währung, ...), so das die Einstellungen im Template überschrieben werden... gaaanz doof :20:
Daher meine zweiteilige Frage:
Ist es irgend wie möglich, das Einfügen aus dem Export- Stream auf reinen Text zu beschränken?
... wenn nicht ...
Wie könnte man ein Macro/VBS bauen, welches nach Fertigstellung des Exportes selbstständig die Formate der Spalten ändert mit der Einschränkung, das die zu ändernden Daten immer ab Zeile 17 (inkl.) beginnen und immer vor der Zeile mit dem Wort "Gesamt" in Spalte B enden? Die Anzahl der importierten Zeilen ist nämlich immer unterschiedlich...
Wäre super, wenn mir wer unter die Arme greifen könnte ....
(16.11.2017, 14:03)M*I*B schrieb: Altium Designer [...] generiert über einen Export auf ein XLTM eine Liste. [...]Ist es irgend wie möglich, das Einfügen aus dem Export- Stream auf reinen Text zu beschränken?
Ich würde mich da an die Quelle halten. Kann man den Excel-Export in Altium viellciht konfigurieren? Gibt es ggf. in Altium einen Text-Export dieser Daten?
Was ich an Deinem Post nicht ganz verstehe: Erstellt Altium eine Excel-Datei oder verwendet das Programm eine vorhandene XLTM-Datei um seine Daten da rein zu schreiben?
16.11.2017, 15:17 (Dieser Beitrag wurde zuletzt bearbeitet: 16.11.2017, 15:23 von M*I*B.)
Moin ...
... also AD nutzt ein Template, um seine Daten da hinein zu exportieren. Das Ziel erkennt AD an Hand des Schlüsselwortes Column, gefolgt von dem Feldnahmen, wie z.B. Column=Supplier Part Number 1. Am Format kann man da leider nichts ändern (die sind zwar gut in ihrer Kernkompetenz, aber an solch lapidaren Dingen hapert es oft gewaltig...). Optional steht noch CSV, PDF, TXT, HTML und XML als Export zur Verfügung. Allerdings lassen sich bei den anderen Formaten keine Templates auswählen, so das ein Automatismus nicht machbar ist. In dem Template steckt im Übrigen bereits etwas VB, welches diverse Daten greift und mit einträgt (Revisionsnummer, Platinennummer, Pfad zum Projekt und Projektdatei ... ).
Also egal wie man es dreht; man muss leider Rücksicht auf die teils verqueren Exportfunktionen von AD nehmen...
(16.11.2017, 15:17)M*I*B schrieb: In dem Template steckt im Übrigen bereits etwas VB, welches diverse Daten greift und mit einträgt (Revisionsnummer, Platinennummer, Pfad zum Projekt und Projektdatei ... ).
Vielleicht kann man hier ansetzen und diesen Code anpassen/erweitern. Lade doch mal so ein Template hier hoch, dann kann man sich das mal ansehen.
Im Prinzip wäre auch nachträglich noch eine Anpassung möglich. Wenn man diesen Code nicht in das Template bekommt, müsste dieser dann ggf. in eine separate Datei rein und von dort aus gestartet werden (z. B. ein Addin).
Um herauszufinden, wie man Formatierungen programmiert, kann man den Makrorekorder verwenden. Einfach die Schritte aufzeichnen und dann anpassen. Aber Achtung, bei den Formaten schmeißt der Rekorder manchmal englische und deutsche Formate durcheinander. Im Zweifel wäre eine Beispieldatei mit Deinem Wunschergebnis und dem aufgezeicneten Code hilfreich für weitere Hilfe.
Ich denke, so was lässt sich nur über VBA realisieren...
Anbei mal das Template als ZIP so wie ein . Darin befinden sich auf den ersten beiden Blättern jeweils eine versteckte Zeile mit den Schlüsselwörtern. Darauf folgen die drei leeren "Beispielzeilen", die AD benötigt. Welche Formate in den Spalten ab Zeile 17 benötigt werden, geht ja schon aus den Überschriften hervor, dennoch noch mal zur Sicherheit:
$A: Zahl, kein Nachkomma $B-$K: Text ohne jegliche Formatierung beim Import, Darstellung dann als Arial-8 $L: Währung €, vier Nachkommastellen $M: Währung €, 3 Nachkommastellen
Makro "Drucken" ist ein aufgezeichnetes Makro, Makro "Speichern_als" ist händisch von mir verbrochen
16.11.2017, 17:43 (Dieser Beitrag wurde zuletzt bearbeitet: 16.11.2017, 17:43 von Der Steuerfuzzi.)
Wenn es nur um diese drei Zeilen geht und diese immer gleich bleiben:
Code:
Sub Formatkorrektur() Range("A17:A19").NumberFormat = "#,##0" With Range("B17:K19") .NumberFormat = "@" With .Font .Name = "Arial" .Size = 8 End With End With Range("L17:L19").NumberFormat = _ "_-* #,##0.0000 [$€-407]_-;-* #,##0.0000 [$€-407]_-;_-* ""-""???? [$€-407]_-;_-@_-" Range("M17:M19").NumberFormat = _ "_-* #,##0.000 [$€-407]_-;-* #,##0.000 [$€-407]_-;_-* ""-""??? [$€-407]_-;_-@_-" End Sub
Das ganze kannst Du dann auch vom Speichern oder Drucken-Makro aus aufrufen.
Leider handelt es sich nicht nur um die drei Zeilen. Diese drei Zeilen dienen AD lediglich als eine Art Beispiel oder was auch immer; ohne die drei Leerzeilen (die nachher weg sind; siehe Beispiel- Ergebnis) funktioniert der Export nicht.
Also vom Prinzip her sollte Dein Script zumindest für die ersten drei Zeilen laufen. Damit es aber bis zur letzten Zeile läuft, deren Anzahl vollkommen unterschiedlich sein kann, müsste man irgendwie auf die Zeile mit dem Wort "Gesamt" in Spalte B prüfen und dann abbrechen. Diese Zeile ist immer die letzte Zeile und wird vom Export immer weiter geschoben.
Also irgendwie müsste das in einer Schleife laufen. Ich kann's leider nur in PHP o.ä., was dann etwa so aussehen würde:
Code:
$zeile = 17 while (instr($zeile: Spalte B) not "Gesamt" then
Range("A$zeile").NumberFormat = "#,##0" With Range("B$zeile:K$zeile") .NumberFormat = "@" With .Font .Name = "Arial" .Size = 8 End With End With Range("L$zeile").NumberFormat = _ "_-* #,##0.0000 [$€-407]_-;-* #,##0.0000 [$€-407]_-;_-* ""-""???? [$€-407]_-;_-@_-" Range("M$zeile").NumberFormat = _ "_-* #,##0.000 [$€-407]_-;-* #,##0.000 [$€-407]_-;_-* ""-""??? [$€-407]_-;_-@_-"
wend
Mir fehlt dabei nur das Wissen, wie man solche Schleifen mit dem MS- Geraffel aufbaut. Faktisch muss der Schnippsel auch direkt laufen, sobald das Dokument das erste mal aufgerufen wird, dann aber nie wieder, außer der Export wird erneut aus AD angestoßen, weil sich Bauteile geändert haben oder was auch immer. Bei Prototypen kommt das mal innert der Entwicklungsphase vor, dann ggf. noch einmal nach Test der Prototypen, in der Serienfertigung aber nie wieder (QM- Vorschrift)
Sub Formatkorrektur() Dim Bereich As Range Set Bereich = Range("A:A").Find("Quantity").Offset(1) If Not Bereich Is Nothing Then Set Bereich = Bereich.Resize(Bereich.End(xlDown).Row - Bereich.Row + 1, 13) Bereich.Columns("A").NumberFormat = "#,##0" With Bereich.Columns("B:K") .NumberFormat = "@" With .Font .Name = "Arial" .Size = 8 End With End With Bereich.Columns("L").NumberFormat = _ "_-* #,##0.0000 [$€-407]_-;-* #,##0.0000 [$€-407]_-;_-* ""-""???? [$€-407]_-;_-@_-" Bereich.Columns("M").NumberFormat = _ "_-* #,##0.000 [$€-407]_-;-* #,##0.000 [$€-407]_-;_-* ""-""??? [$€-407]_-;_-@_-" End If End Sub
sorry wegen der späten Rückmeldung; mich hatte eine Grippe niedergestreckt und die hatte mich so lieb, das sie gar nicht wieder gehen wollte
Ich werde das heute oder zumindest zeitnah mal antesten und selbstverständlich entsprechende Rückmeldung generieren....
Noch mal zu dem Code selber...
If Not Bereich Is Nothing Then ...
Das ist irgendwie so verquer, das ich einfach nicht dahinter komme, wie das von der Syntax her gemeint ist Ok, was es machen soll ist klar, aber wie baut sich das auf ????
(23.11.2017, 10:07)M*I*B schrieb: If Not Bereich Is Nothing Then ...
Moin! Ich grätsche mal rein.
Bereich ist eine Objektvariable vom Typ Range. Wenn sie nur deklariert, aber (noch) nicht korrekt(!) per Set = zugewiesen wurde, ist deren Wert "Nothing". Falls die Range.Find-Methode nichts findet, bleibt sie folgerichtig "Nothing". Die doppelte Verneinung aus obigem Schnipsel besagt nun: Wenn der Bereich nicht mit Nichts belegt ist (also im Erfolgsfall), dann mache etwas.
Ergänzend: VBA kennt nicht das Schlüsselwort "Something", deshalb ist diese (nur auf den ersten Blick) verquere Logik notwendig.
Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)