Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1236to1240
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Code-Optimierung (@Marc: bis hierher vielen Dank)

Code-Optimierung (@Marc: bis hierher vielen Dank)
Bibo
Hallo EXCEL-Freunde und VBA-Spezialisten,
der in der in der beigefügten Mappe beinhaltete, mit umfassender und unverzichtbarer Hilfe von Marc erstellte Code, den ich im Rahmen meiner beschränkten Möglichkeiten noch etwas anzupassen versucht habe, macht im Ergebnis all das, was er auch machen soll.
Ich befinde mich noch ganz am Anfang des Einstiegs in VBA und habe deshalb wie allerorten als unverzichtbar beschworen nachträglich die verwendeten Variablen deklariert und dimensioniert und dabei festgestellt, dass die Dimensionierung der Variable „kopf“ as String oder auch as Integer zu Problemen führt, da in Zeile 30 „.Range("A" & einfüg) = kopf(0) 'Kopf einfügen“ bei kopf ein Datenfeld erwartet wird.
Wie ist das zu erklären?
Die Sortierung im Blatt „Output“ hat zunächst auch zu Problemen geführt. Bei Aufruf der Prozedur „aufbereiten“ aus dem Blatt „Input“ oder direkt aus dem VBA-Editor hat es verblüffender Weise geklappt, nicht aber aus dem Blatt „Output“, bis ich erkannt habe, dass dieses Blatt im (ursprünglichen) Code nicht zum activesheet wurde. Habe das Problem dann mit dem verpönten .activate unelegant gelöst.
Kann bitte einer der VBA-Profis unter Euch mal drübergucken, was da im Sinne einer sauberen Struktur des Codes da noch alles zu optimieren wäre? Wäre sehr dankbar, wenn mich jemand „auf den richtigen Weg“ führen könnte.
Nochmals ganz herzlichen Dank für die bisherige Hilfe an Marc, der mir dieses Ergebnis überhaupt erst ermöglicht hat und jetzt hoffentlich nicht sauer ist.
https://www.herber.de/bbs/user/77318.xls
Mit freundlichem Gruß
Bibo

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Code-Optimierung (@Marc: bis hierher vielen Dank)
02.11.2011 13:22:06
Marc
Hallo!
Zum 1.: Nein, warum sollte ich sauer sein, wenn du sagst, was ich vorschlage. Außerdem lernen wir beide von einem optimierten Code
Zum "Kopf" deklarieren: "Dim kopf As Variant" funktioniert bei mir.
Bei der Sortierung werden die Sortierkriterien noch aus dem aktiven Sheet genommen, was in dem folgenden Code-Teil mit eingebaut ist. Dadurch kannst du das unsaubere "Aktivate" wieder rausnehmen.
.Sort Key1:=Sheets("Output").Range("A1"), Order1:=xlAscending, Key2:=Sheets("Output").Range("B1" _
) _
, Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom, DataOption1:=xlSortTextAsNumbers, _
DataOption2:=xlSortNormal
Natürlich darf sich jemand anderer gern noch äußern.....
Gruß, Marc
Anzeige
AW: Code-Optimierung (@Marc: bis hierher vielen Dank)
02.11.2011 14:46:31
Bibo
Hallo Marc,
schön, so schnell wieder von Dir zu hören und wiederum vielen Dank für Deine Mühe.
Den "Sortier"-Code habe ich wie von Dir vorgeschlagen angepasst und es funktioniert auch.
"kopf" habe ich ohne Dimensionierung deklariert, da % und $ nicht funktioniert haben, ist also automatisch Datentyp Variant.
Bei "kopf$" hat mich wohl die Kommentierung 'String wird bei leerzeichen getrennt, _ Ergebnis = Array, Rückgabe mit Kopf(0), bzw Kopf(1)

kopf = Split(Sheets("Input").Cells(i, 1).Value) 'String wird bei leerzeichen getrennt, Ergebnis = Array, Rückgabe mit Kopf(0), bzw Kopf(1) 
irritiert und auf die wohl falsche Fährte gelockt, die abgeschnittenen 13 Zeichen seien eine Zeichenkette vom Datentyp String.
Den Rest des Kommentars Ergebnis = Array, Rückgabe mit Kopf(0), bzw Kopf(1) habe ich _ zwar mit dem Hinweis auf eine unterschiedliche Rückgabe zwar registriert aber wohl auch nicht so ganz verstanden. Ich vermute, es handelt sich um ein Datenfeld vom Typ Variant mit einem Index, der von Option Base abhängig sein müsste, oder irgendwie so. Kannst Du mir das bitte noch erklären? Wozu ist dies notwendig, welchen Vorteil hat dies bzw. wie ließe es sich anders lösen. Ist bzw. wäre das bei der von Dir alternativ vorgeschlagenen Variante

kopf = Left(Sheets("Input").Cells(i, 1).Value, 1, 13)
auch so?
Ach und noch etwas - wie kann oder muss ich denn hier ändern, wenn die Palettennummer (=kopf) im Blatt "Output" zwischen den Seriennummern und dem Datum in Spalte B ausgegeben werden soll?
With Sheets("Output")
.

Range("A" & einfüg) = kopf(0) 'Kopf einfügen
Sheets("Input").Range("A" & i & ":G" & endlist).Copy .Range("B" & einfüg) 'Block kopieren
.Range("A" & einfüg & ":A" & .Range("B1").End(xlDown).Row) = kopf 'Kopf ein 1. Spalte füllen
.Range("A" & einfüg & ":H" & .Range("B1").End(xlDown).Row).Interior.ColorIndex = farb 'Färben
einfüg = .Range("B1").End(xlDown).Row + 1 'Zeile hochzählen
End With
Mit freundlichem Gruß
Bibo
Anzeige
Code-Optimierung Teilerfolg
02.11.2011 16:08:39
Bibo
Hallo Marc,
hallo freundliche Helfer,
das mit der Spaltenumstellung habe ich mittlerweile hingekriegt:
With Sheets("Output")
.Range("B" & einfüg) = kopf(0) 'Kopf einfügen
Sheets("Input").Range("A" & i & ":A" & endlist).Copy .Range("A" & einfüg) 'Block kopieren
Sheets("Input").Range("B" & i & ":G" & endlist).Copy .Range("C" & einfüg) 'Block kopieren
.Range("B" & einfüg & ":B" & .Range("A1").End(xlDown).Row) = kopf 'Kopf ein 2. Spalte füllen
.Range("A" & einfüg & ":H" & .Range("B1").End(xlDown).Row).Interior.ColorIndex = farb 'Färben
einfüg = .Range("A1").End(xlDown).Row + 1 'Zeile hochzählen
End With
Die verpönte/unelegante Aktivierung des Tabellenblatts "Input" hatte ich wie von Marc vorgeschlagen rückgängig gemacht aber dann doch wieder reingenommen, da ansonsten nach Ausführung des eigentlichen Codes die Anzeige des Tabellenblatts "Output" ab Zeile 1 mit
Range("A1").Activate
ActiveWindow.ScrollRow = 1

ohne Sheets("Output").Activate nicht funktioniert hat.
Gibt es da vielleicht auch eine andere zielführende Herangehensweise?
Mit freundlichem Gruß
Bibo
Anzeige
Sheets-Benennung
03.11.2011 07:19:50
Marc
Moin!
Bei Abbrüchen mit Fehlermeldung solltest du dem Text auf jeden Fall Beachtung schenken. "Index außerhalb gültigen Bereichs" z.B. heißt, "Kann nix finden!!!" In unserem Fall hat irgendein Anfänger (und damit mein ich mich) das erste sheet "Input" genannt. Das gibts aber nicht!
Ändere es in "1", dann läuft auch der Code wieder.
Alternativ kann man auch mit den Index-zahlen der Sheets arbeiten (heißt dann Sheets(1), bzw Sheets(2), das hätte den Vorteil, das man die Dinger im Nachhinein noch umbenennen dürfte.
Mit den Datentypen steh ich nicht ganz so auf Du-und-Du. Bei der alternativer Variante würde auf jeden Fall ein String rauskommen, weil auch nur ein String auseinandergefummelt wird. Der Vorteil von SPLIT ist einfach nur, das das Trennen variabel ist, falls sich die Leerstelle mal verschieben sollte.
Ach; und nimm das ActiveWindow.ScrollRow = 1 raus! Du bist sicher nicht auf das Scrollen der einen Zeile angewiesen, oder?
Gruß, Marc
Anzeige
AW: Sheets-Benennung
03.11.2011 08:45:14
Bibo
Hallo Marc,
der Code läuft einwandfrei. Das Tabellenblatt "1" aus der Original-Datenlieferung habe ich in "Input" umbenannt und auch den Code entsprechend angepasst. Das stellt kein Problem dar.
Ich wollte gerne haben, dass nach dem Durchlaufen der mit dem Button "Konvertierung starten" aufgerufenen Prozedur das ganz nach oben gescrollte Tabellenblatt "Output" sichtbar ist und der Cursor in A1 steht.
Was ich beschreiben wollte ist, dass dies m.E. nur möglich ist, wenn das Tabellenblatt "Output" _ aktiviert ist. Deswegen

Sheets("Output").Activate damit Range("A1").Activate ActiveWindow.ScrollRow = 1 
funktioniert. Oder hast Du hier eine andere Idee, wie ich zu diesem Ergebnis kommen kann?
Nochmal die Frage zu

'String wird bei leerzeichen getrennt, Ergebnis = Array, Rückgabe mit Kopf(0), bzw Kopf(1)?
Wann und weshalb wird kopf(0) oder kopf (1) zurückgegeben?
Hier nochmal die aktuelle Mappe. Die bedingte Formatierung der Zellen mit den Seriennummern _ konnte ich mit

Columns("A:A").FormatConditions.Delete
auch noch rauslöschen.
Also ich bin mit dem Ergebnis jetzt sehr zufrieden und danke Dir nochmals ganz herzlich.
https://www.herber.de/bbs/user/77333.xls
Gruß
Bibo
Anzeige
AW: Sheets-Benennung
03.11.2011 11:13:50
Marc
Hallo!
Das aktivieren und ansteuerern der Zelle würde ich genauso machen. Und es muß auch getrennt sein, warum weiß ich nicht. Das scrollen würd ich mir trotzdem schenken, ich seh keinen Sinn darin.
Die Datenfelder in "Kopf" werden mit den gesplitteten Teilen des Strings gefüllt. Also wird "a b c" zu Kopf(0) = a, Kopf(1) = b, Kopf(2) = c.
Der Zähler des Index beginnt dabei bei Null, genau wie bei einem Array (Daher meine falsche Annahme, das es sich um ein Array handelt).
Du kannst mal folgendes machen. Schreibe dir nach der Split-funktion folgendes in den code:
debug.print Kopf(0) & " und " Kopf(1)
Die Rückgabe der Werte erfolgt im Direktbereich (STRG+G) oder ANSICHT - Direktfenster. Das ist sehr nützlich um Werte in Schleifen kontrollieren zu können. Ansonsten hilft dir das Überwachungsfenster. Am leichtesten zu erreichen, indem du den zu kontrollierenden Begriff markierst, rechte Maus, Überwachung hinzufügen, OK.
Freut mich, das du dein 1. Projekt bewältigt hast.
Gruß, Marc
Anzeige
Sorry, habe vergessen, auf "noch offen zu stellen"
02.11.2011 15:09:43
Bibo
o.w.T

286 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige