Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1360to1364
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

Makro vervollständigen, VBA indirekt

Makro vervollständigen, VBA indirekt
30.05.2014 00:03:22
Sandra
Hallo Ihr lieben,
anbei mein aktuelles Projekt,
https://www.herber.de/bbs/user/90897.xlsm
Noch ein, zwei Worte zu meinem Vorhaben:
Ich möchte mit der Tabelle eine Projektübersicht darstellen.
Da die Tabelle mit der Zeit sehr groß und unübersichtlich geworden ist, habe ich ein Makro eingebaut welches mir meine Änderungen und den letzten Stand des jeweiligen Projektes protokolliert.
Auf Tabellenblatt "Protokoll" sind diese zu finden.
Um eine bessere Zuordnung der Änderung darzustellen, gebe ich in Spalte "G", "H" und "I" die Überschrift der jeweiligen Änderung wieder. Da die Tabelle wie schon oben beschrieben sehr groß ist/wird möchte ich die indirekt-Funktion gerne vermeiden, da diese die Excel-Tabelle sehr verlangsamt.
Könnte man die INDIREKT Funktion für meine Zweckt irgendwie in das Makro mit einbinden, welches der Rechen Performance zu gute kommen würde?
Schon mal vielen Dank und einen schönen Abend wünscht
Sandra

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Erst mal ein Lob für die aufgeräumt-...
30.05.2014 02:19:36
Luc:-?
…übersichtliche PgmDarstellung, Sandra, ;-)
was durchaus nicht jedem VBA-Anfänger selbstverständlich ist. Allerdings enthält der PgmCode einige kleine Überflüssigkeiten u/o Schwächen, was seiner FktsFähigkeit aber keinen Abbruch tut (dazu später).
Deine 3 INDIREKT-Fmln enthalten ebenfalls Überflüssiges und es fehlt (perspektivisch) ein Bezug, aber das ist ja nicht dein Anliegen, deshalb hier nur der Vollständigkeit halber (2.Arg hat DefaultWert WAHR):
G2:=WENN(A2="";"";INDIREKT(E2&"!"&TEIL(D2;1;1)&1))
H2:=WENN(A2="";"";INDIREKT(E2&"!A"&TEIL(D2;2;1)))
I2:=WENN(A2="";"";INDIREKT(E2&"!B"&TEIL(D2;2;1)))
Zum Pgm Workbook_SheetChange:
1. Du solltest eine Fehlerbehandlung ergänzen bzw wenigstens nach den Deklarationen als 1.Befehl On Error GoTo fx schreiben. Die SprungMarke fx: setzt du dann vor das wiederherstellende With Application-Konstrukt: fx: With Application
2. Range(Target.Address) ist auch in diesem Fall überflüssig, weil Target ja ohnehin die ganze Auswahl repräsentiert, weshalb zur Unterscheidung, ob das 1 oder mehrere Zellen sind, If IsArray(Target) Then gereicht hätte (die unterschiedl Variablen sind eigentl überflüssig, zumal beide Variant sind) — ggf kann man auch eine Boolesche Variable setzen, was ich oft tue, weil diese Unterscheidung (wie auch bei dir) oft sinnvoll ist (PgmZweige) und die PrimärAbfrage (anders als hier) mitunter sehr lang sein kann: zB isTgArr = IsArray(Target)
3. Warum arbeitest du mit 65536 Zeilen? Du verwendest doch Xl14, das hat viel mehr!
4. Was das Application.Undo im Pgm soll, ist mir jetzt nicht klar — jedenfalls wdn die vorgenommenen Änderungen nicht rückgängig gemacht (warum auch?). Das Auskommentieren hat folglich auch keine Auswirkungen.
5. Die gewünschten PgmZeilen lauten:
.Cells(lngLetzteZeile, 7) = Sh.Cells(1, intSpalte)
.Cells(lngLetzteZeile, 8) = Sh.Cells(lngZeile, 1)
.Cells(lngLetzteZeile, 9) = Sh.Cells(lngZeile, 2)

bzw
.Cells(lngLetzteZeile, 7) = Sh.Cells(1, Target.Column)
.Cells(lngLetzteZeile, 8) = Sh.Cells(Target.Row, 1)
.Cells(lngLetzteZeile, 9) = Sh.Cells(Target.Row, 2)

wobei sh. auch vor dem adressliefernden Cells eingesetzt wdn sollte (obere Befehle, Befehl zu Spalte 4).
Anmerkung zu 1.:
Für den Notfall wäre ein Event-FlipFlop ganz gut, damit durch Fehler nicht wieder eingeschaltete Events wieder eingeschaltet wdn können. Es sei denn, du baust die Projekt-Pgmm so auf, dass das automatisch geschieht.
Sub EventFF()
With Application: .EnableEvents = Not .EnableEvents: End With
End Sub
Das gilt übrigens auch für den Username. Diese GlobalVariable fällt bei PgmAbbruch auch auf LeerString, müsste dann also neu gefüllt wdn.
Morrn, Luc :-?

Anzeige
AW: Erst mal ein Lob für die aufgeräumt-...
04.06.2014 22:21:59
Sandra
Guten Abend,
habe an meiner Protokoll-Tabelle weiter gefeilt und benötige mal wieder eure Unterstützung. An dieser Stelle noch mal ein riesen Dank an "Luc:-?".
Da meine Tabelle sehr umfangreich ist, geht es mir in erster Linie um die Rechenperformance, um so ein flüssig arbeiten zu können.
Evtl. ist die ein oder andere Zeile Überflüssig oder man kann den Code vereinfachen, dann immer her mit euren Vorschlägen.
Des weiteren möchte ich in das Makro folgendes einbauen:
1) es soll nicht der kompletten Bereich protokollieren werden, sonder nur die Zellen aus "Tabelle1", Spalte O2:O300, S2:S300, T2:T300; W2:W300
2) es sollen nur die überschrieben Zellen (nicht die leer beschriebenen Zellen) aus "Tabelle 1" auf Tabellenblatt "Protokoll" dokumentiert werden
3) dieser Punkt ist mir besonders wichtig
Sobald min. eine Zelle beschrieben wird, soll vor dem Schießen der Tabelle für die Spalte ein Aufforderung erscheinen "Bitte Änderung dokumentieren" in Spalte "V" / Zeile der Änderung.
D.h. wenn ich z.B. in Q2 das Datum eintrage, soll vor dem Speichern die Meldung erscheinen die Änderung in V2 zu dokumentieren.
Wenn seit dem letzten Speichern mehrere Zellen in unterschiedlichen Zeilen geändert wurden, soll dies ebenso in den entsprechenden Zeilen dokumentiert werden.
Bitte bedenkt bei eurer Antwort das ich absolute Anfängerin bin (das sich aber hoffentlich bald ändert)
Vielen Dank schon mal im Voraus und einen schönen Abend
Eure Sandra
Anbei die Tabelle

Die Datei https://www.herber.de/bbs/user/90988.xlsm wurde aus Datenschutzgründen gelöscht


Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige