Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
792to796
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
792to796
792to796
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Bildschirm "flackern"
26.08.2006 12:49:19
Walter
Hallo Zusammen,
ich habe folgendes Makro, wenn ich das ablaufen lasse, "flackert" der Bildschirm, ich möchte das man keine "Ablauf" merkt.
Geht das irgendwie ?
'-------- Lauf+Abge und Daten von Laufende/Abgemeldete kopieren ----------------

Sub Kopieren_TEST()
With Application
.ScreenUpdating = False
.DisplayAlerts = False
End With
Sheets("Lager-W").Select
ActiveSheet.Unprotect (getStrPasswort)
Range("A4").Select
If ActiveSheet.AutoFilterMode Then
Selection.AutoFilter
End If
Sheets("Werkstatt").Select
ActiveSheet.Unprotect (getStrPasswort)
If ActiveSheet.AutoFilterMode Then
Selection.AutoFilter
End If
Sheets("Lager").Select
ActiveSheet.Unprotect (getStrPasswort)
If ActiveSheet.AutoFilterMode Then
Selection.AutoFilter
End If
Sheets("Lager-W").Select
Range("A4").Select
'-------- erst vorhandene Liste löschen -----------------------------
z = Range("a4").End(xlDown).Row
ActiveSheet.Range(Cells(4, 1), Cells(z, 30)).Select
Selection.Delete Shift:=xlUp
Range("J2,M2,Z2,F1,H1").ClearContents
Selection.ClearContents
Range("A4").Select
'---- hier wird die letzte aktive zelle gemerkt ------
Range("A4").Select
Dim lc
Set lc = ActiveSheet                   'für aktive Mappe
'---- jetzt zu laufende und kopieren ---
Sheets("Lager").Select
z = Range("a4").End(xlDown).Row
ActiveSheet.Range(Cells(4, 1), Cells(z, 30)).Select
Selection.Copy
lc.Select
ActiveSheet.Paste
Sheets("Lager").Select
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios _
:=True, Password:=getStrPasswort
'---------- wieder zurück ------------
lc.Select
Range("A4").Select
Dim lz As Long
lz = Range("a4").End(xlDown).Row
ActiveSheet.Range(Cells(lz, 1), Cells(lz, 1)).Select
ActiveSheet.Range(Cells(lz + 1, 1), Cells(lz + 1, 1)).Select
Application.ScreenUpdating = True
End Sub

ES funktioniert sonst Prima,
mfg Walter MG

23
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Bildschirm "flackern"
26.08.2006 12:51:49
Rene
Hallo!
Setze am Anfang des Makros die Zeile:
Application.ScreenUpdating = False
Am Ende setzt Du die Zeile:
Application.ScreenUpdating = True
Gruß, Rene
AW: Bildschirm "flackern"
26.08.2006 14:55:05
Walter
Hallo Rene,
habe ich doch hiermit gemacht:
With Application
.ScreenUpdating = False
.DisplayAlerts = False
End With
oder
mfg Walter MG
AW: Bildschirm "flackern"
26.08.2006 15:10:00
Rene
Oh, hab ich überlesen. Normalerweise sollte doch nichts mehr flackern, oder? Merkwürdiges Microsoft.
Gruß, Rene
AW: Bildschirm "flackern"
26.08.2006 15:09:41
{Boris}
Hi Walter,
schmeiß sämtlichst die Select raus. Beispiel:

Sub ohne_select()
With Worksheets("Lager")
.Unprotect getStrPasswort
If .FilterMode Then .Range("A4").AutoFilter
End With
End Sub

Dann gibt´s auch kein Geflacker mehr.
Grüße Boris
Anzeige
Fehlermeldung
26.08.2006 17:58:40
Walter
Hallo Boris,
hiermit kommt Fehlermeldung
Worksheets ("Lauf+Abge") '.Select
gruß Walter MG
AW: Bildschirm "flackern"
26.08.2006 15:18:51
ingUR
Hallo, Rene,
das "Flackern" der Bildschirmanzeige ist auf den Einsatz der ".Select"-Anweisung zurückzuführen. Staat dieser Select-Anweisung, die das sichtbare Springen zum jeweilig angewähltem Activobjekt bewirkt, solltest Du verstärkt Objekte für diese Ziel anlegen unf darauf Bezuig nehmen.
Es ist mit nicht möglich hier ein gesichert richtigen Code aus Deiner Vorlasge herzustellen, da ich erst Deine Arbeitsmappenstruktur für Testzwecke aufbauen müßte.
Hier also ein nicht getesteter Vorentwurf, der schritteweise an einer Testarbeitsmappe ausgeführt werden sollte, um die Wirkungsweise der eingesetzten Objekte zu verdeutlichen und um zu erkennen, wo Zuordnungen von mir falsch gesetzt wurden.

Option Explicit
Sub Kopieren_TEST()
'    With Application
'        .ScreenUpdating = False
'        .DisplayAlerts = False
'    End With
Dim wsLagerW As Worksheet, wsWerkstatt As Worksheet, wsLager As Worksheet
Dim z As Long
Set wsLagerW = Sheets("Lager-W")
With wsLagerW
.Unprotect (getStrPasswort)
If .AutoFilterMode Then
.Range("A4").AutoFilter
End If
End With
Set wsWerkstatt = Sheets("Werkstatt")
With wsWerkstatt
.Unprotect (getStrPasswort)
If .AutoFilterMode Then
.Range("a4").AutoFilter
End If
End With
Set wsLager = Sheets("Lager")
With wsLager
.Unprotect (getStrPasswort)
If .AutoFilterMode Then
.Range("a4").AutoFilter
End If
End With
With wsLagerW
'Range("A4").Select
'-------- erst vorhandene Liste löschen -----------------------------
z = .Range("a4").End(xlDown).Row
.Range(Cells(4, 1), Cells(z, 30)).Delete Shift:=xlUp
.Range("J2,M2,Z2,F1,H1").ClearContents
'Selection.ClearContents
.Range("A4").Select
'---- hier wird die letzte aktive zelle gemerkt ------
'Range("A4").Select
'Dim lc
'Set lc = ActiveSheet                   'für aktive Mappe
'---- jetzt zu laufende und kopieren ---
z = wsLager.Range("a4").End(xlDown).Row
wsLager.Range(Cells(4, 1), Cells(z, 30)).Copy
.Paste
wsLager.Protect DrawingObjects:=True, Contents:=True, Scenarios _
:=True, Password:=getStrPasswort
'---------- wieder zurück ------------
Dim lz As Long
lz = .Range("a4").End(xlDown).Row
.Range(Cells(lz, 1), Cells(lz, 1)).Select               ?
.Range(Cells(lz + 1, 1), Cells(lz + 1, 1)).Select       ?
'Application.ScreenUpdating = True
End With
set wsLagerW = Nothing
set wsWerkstatt = Nothing
set wsLager =Nothing
End Sub

Gruß,
Uwe
Anzeige
Hallo noch Fehler...
26.08.2006 18:39:11
Walter
Hallo Uwe,
z = lLauf.Range("a4").End(xlDown).Row
lLauf.Range(Cells(4, 1), Cells(z, 30)).Copy &lt&lt&lt&lt&lt&lt&lt&lt bleibt stehen
.Paste
Laufzeitfehler 401 "Objekt erforderlich"
dann kann ich erst weitermachen,
gruß Walter MG
AW: Hallo noch Fehler...
26.08.2006 19:15:40
ingUR
Hallo, Walter,
es ist mit Deinem Programmauszug schwer zu sagen, wo die Fehlerquelle steckt, zumal der direkte Bezug auf bisherige Benennungen fehlt.
Ich vermute, dass lLauf nicht ornungsgemäß als Sheet-Objekt angelegt ist (Tabellenblatt mit dem Namen lLauf existiert in der Mappe und ist durch Set als Objekt angelegt). Vergleiche dazu bitte speziell die Programmzeilen

Dim ... wsLager As Worksheet
...
Set wsLager = Sheets("Lager")
...
z = wsLager.Range("a4").End(xlDown).Row
wsLager.Range(Cells(4, 1), Cells(z, 30)).Copy
.Paste
....

die mir geeignet scheinen, stellvertretend als Muster in Bezug auf Deinen Programmausschnitt zu dienen.
Gruß,
Uwe
Anzeige
Hier noch Info
26.08.2006 19:25:29
Walter
Hallo Uwe,
habe folgendes gemacht, die Daten stehen in Sheet"Laufende" (umbenannt) rein sollen Sie in "Lauf+Abge".
Dim wsLager As Worksheet
Set wsLager = Sheets("Laufende")
z = wsLager.Range("a4").End(xlDown).Row
wsLager.Range(Cells(4, 1), Cells(z, 30)).Copy
.Paste
'--------- so funktioniert -----------------------
Sheets("Laufende").Select
z = Range("a4").End(xlDown).Row
ActiveSheet.Range(Cells(4, 1), Cells(z, 30)).Select
Selection.Copy
gruß Walter MG
Noch eine Frage dazu... Wichtig!!!
26.08.2006 19:17:04
Walter
Hallo Uwe,
es "flackert" ja nicht, allerdings weiß ich auch nicht wie ich jeweils die Sheet "Anprechen" kann, um dann auch die "Zelle A4" zu aktivieren.
Ich muß ja von der 2.Sheet ebenfalls die Daten kopieren, deshalb die folgenden Zeilen,
damit ich mir die letzte aktive Zelle der Sheet merken kann, wo die Daten rein kommen.
'--- jetzt zurück, letzte Zelle +1 festlegen und dann Werkstatt und kopieren ---
Range("A4").Select
Dim lz As Long
lz = Range("a4").End(xlDown).Row
ActiveSheet.Range(Cells(lz, 1), Cells(lz, 1)).Select 'aktiviert letzte Zelle
ActiveSheet.Range(Cells(lz + 1, 1), Cells(lz + 1, 1)).Select 'Zeile nach unten
gruß Walter MG
Anzeige
AW: Noch eine Frage dazu... Wichtig!!!
26.08.2006 21:02:06
ingUR
Hallo, Walter,
es ist für mich momentan nicht so schnell nachzuvollziehen, welche Punkte in den Programmstücken nicht zusammenpassen.
Ich werde versuchen eine entsprechende Struktur Deinen Angaben entsprechend mir nachzubauen, wenn es Dir nicht zur Erleichterung möglich ist, eine geeignete Arbeitsmappe hochzuladen.
An einer uns dann gemeinsam zur verfügung stehenden Arbeitsmappe kann man dann vielleicht besser die sich ergebenen Fragen erläutern, da ich bisher nur in groben Zügen und mit allgemeinen Hinweisen reagieren konnte, wie ich in meiner ersten Antwort bereits andeutete. Doch dieses wird wohl heute nichts mehr.
Gruß,
Uwe
Anzeige
Danke,hier Erklärung, Wichtig!!!
26.08.2006 21:27:06
Walter
Hallo Uwe,
ich finde es großartig das Du so viel Mühe machst. Ich stöbere gerade auch schon in der Recherche finde allerdings kein Beispiel.
Zu Erläuterung mein Wunsch: (habe die Namen unbenannt, bleiben jetzt so)
1. Sheet = "Laufende"
2. Sheet = "Abgemeldete"
3. Sheet = "Lauf+Abge"
Die Augenblickliche Sheet ist "Lauf+Abge", hier sollen die Daten erst gelöscht werden, klappt soweit.
Dann soll die Daten aus der "Laufende" von "A4 bis das Ende und Spalte30,
kopiert werden und in die Sheet:"Lauf+Abge" ab A4 reinkopiert werden, was nicht klappt.
!!!! Jetzt soll die letzte Zelle in der "Lauf+Abge" ab A4 gesucht werden + 1 Zeile RUNTER damit ab hier die Daten genau so aus der Sheet "Abgemeldete" reinkopiert werden.
Die anderen Sachen löschen von Zellen etc., klappt das lasse ich jetzt außen vor.
Mir geht es jetzt darum, dass ich das kapiere, damit ich auch mal was alleine kann.
Würde mich freuen morgen was zu lesen...
Gute Nacht,
bis dann Walter MG
Anzeige
AW: Arbeitsmappe zum Kopieren von Bereichen
27.08.2006 08:57:58
Bereichen
Hallo, Walter,
hier die Arbeitsmappe, die als Grundlage zur weiteren Erörterung dienen kann.
https://www.herber.de/bbs/user/36187.xls
Sie enthält die drei Tabellen, die nach Deinen Vorgaben benannt sind.
Der Kernteil des Kopieren der Bereiche [A4:AD:maxRow] aus den Blättern 'laufende' und 'Abge' in denn Bereich von Tabelle 'lauf+Abge' wird in diesem Programmteil erledigt:

With wsLfd
.Activate
z = rngLfd.End(xlDown).Row
Set rngLfd = .Range(Cells(4, 1), Cells(z, 30))
rngLfd.Copy Destination:=wsLA.Range(rngLA.Address)
End With
With wsLA
.Activate
Set rngLA = .Cells(.Range("A4").End(xlDown).Row + 1, 1) 'Setzt neue Zielzelle
'(für Destination im Copy-Befehl)
End With

wobei wsLfd und rngLfd für die Quelle aus Blatt 'laufende' steht und für das Blatt 'Abgelegte' durch wsAbg bzw. rngAbg zu ersetzen sein wird.
Mit Set rngLA ... wird für den nächsten Kopieraufruf die Startzelle des Kopierzieles festgelegt.
Nach meinem Verstänndnis sollte der Kopierbefehl

Workbooks(1).Worksheet(2).Range("Quellbereich").Copy Destination:=Workbooks(1).Worksheet(1).Range("Startzelle des Zielbereichs")

eigentlich ohne besonderen Aufruf der Quellmappe funktionieren. Warum es dieses im Fall von Referenzobkjekten nicht tut, habe ich noch icht herausgefunden, da werde ich versuchen, noch nachzuarbeiten. Soweit sollte jedoch das Entfernen der weiteren Wechsel zu aktivieren Bereichen zur "Beruhigung" der Bildschirmanzeige beitgetragen haben.
Gruß,
Uwe
P.S.
Für die Nachbildung wurde den Tabellen ein Blattschutz gegeben. Das Kennwort ist Walter, wie auch aus dem betreffenden Programmbereich zu ersehen ist. Dieser Programmteil ist nach Deinen Gegebenheiten anzupassen.
P.P.S.
Das Kopieren von Bereichen von einer Arbeitsmappe in den Bereich einer anderen Arbeitsmappe, sollte eigentlich irgendwo im Archiv schon behandelt worden sein; habe allerdings selber nicht gesucht. Hier dient die Lösung nur dazu um Fragen am gemeinsamen Bild zu verankern.
Anzeige
AW: Arbeitsmappe zum Kopieren von Bereichen
27.08.2006 09:52:28
Bereichen
Hallo, Walter,
hier der korrigierte Programmcod (ScreenUdating eingebaut, Activate wo möglich entfernt, Referenzierung korrigiert in ".Range(.Cells(),.Cells)")

Option Explicit
Sub Kopieren_TEST()
Dim wsLA As Worksheet, wsLfd As Worksheet, wsAbg As Worksheet
Dim rngLA As Range, rngLfd As Range, rngAbg As Range
Dim z As Long
Application.ScreenUpdating = False
'nur für den Test, da getStrPasswort sonst nirgends festgelegt
Dim getStrPasswort As String
getStrPasswort = "Walter"
Set wsLA = Sheets("Lauf+Abge")
With wsLA
Set rngLA = wsLA.Range("A4")
.Unprotect (getStrPasswort)
If .AutoFilterMode Then
rngLA.AutoFilter
End If
End With
Set wsLfd = Sheets("laufende")
With wsLfd
Set rngLfd = .Range("A4")
.Unprotect (getStrPasswort)
If .AutoFilterMode Then
rngLfd.AutoFilter
End If
End With
Set wsAbg = Sheets("Abgemeldete")
With wsAbg
Set rngAbg = .Range("A4")
.Unprotect (getStrPasswort)
If .AutoFilterMode Then
rngAbg.AutoFilter
End If
End With
With wsLA
.Activate
'-------- erst vorhandene Liste löschen -----------------------------
' 1. wird doch überschrieben, warum also vorher löschen?
'    enthalten die Zellen in dem Bereich [A4:maxRow30] Formeln?
' 2. Warum Bereich.Delete mit nach oben schieben, wenn mit z doch
'    die letzte Zeile der Tabelle gem. Spalte A ermittelt wird?
'    genügt hier nicht:
z = rngLA.End(xlDown).Row
.Range(Cells(4, 1), Cells(z, 30)).Clear   'wirklich notwendig?
'        .Range(Cells(4, 1), Cells(z, 30)).Delete Shift:=xlUp
.Range("J2,M2,Z2,F1,H1").ClearContents
End With
With wsLfd
z = rngLfd.End(xlDown).Row
Set rngLfd = .Range(.Cells(4, 1), .Cells(z, 30))
End With
rngLfd.Copy Destination:=wsLA.Range(rngLA.Address)
rngLfd.AutoFilter '##### setzt erneut Autofilter; nur wenn gewünscht
wsLfd.Protect DrawingObjects:=True, Contents:=True, Scenarios _
:=True, Password:=getStrPasswort
'End With
With wsLA
'.Activate
Set rngLA = .Cells(.Range("A4").End(xlDown).Row + 1, 1) 'Setzt neue Zielzelle
'(für Destination im Copy-Befehl)
End With
With wsAbg
'.Activate
z = rngAbg.End(xlDown).Row
Set rngAbg = .Range(.Cells(4, 1), .Cells(z, 30))
rngAbg.Copy Destination:=wsLA.Range(rngLA.Address)
rngAbg.AutoFilter '##### setzt erneut Autofilter; nur wenn gewünscht
.Protect DrawingObjects:=True, Contents:=True, Scenarios _
:=True, Password:=getStrPasswort
End With
With wsLA
'.Activate
Set rngLA = .Cells(.Range("A4").End(xlDown).Row + 1, 1)
rngLA.Select 'am Ende des Kopiervorganges diese Zelle anwählen
'##### nur wenn gewünscht
[F2] = getStrPasswort 'nur für Testzwecke
rngLA.AutoFilter '##### setzt erneut Autofilter; nur wenn gewünscht
.Protect DrawingObjects:=True, Contents:=True, Scenarios _
:=True, Password:=getStrPasswort 'nur wenn gewünscht
End With
Application.ScreenUpdating = True
Set wsLA = Nothing
Set wsLfd = Nothing
Set wsAbg = Nothing
Set rngLA = Nothing
Set rngLfd = Nothing
Set rngAbg = Nothing
End Sub

Gruß,
Uwe
Anzeige
Super Danke -)
27.08.2006 13:45:10
Walter
Guten Morgen Uwe,
herzlichen Dank für dein Mühe, ich bin begeistert.
Ich werde jetzt mal versuchen es zu verstehen.
Danke
mfg Walter MG
Uwe, Bitte noch einmal
27.08.2006 17:49:12
Walter
Hallo Uwe,
ich baue mir gerade stück, für stück nach um alles zu kapieren.
Hier habe ich ein Problem:
'-------- erst vorhandene Liste löschen ----- das Funktioniert -----
'ohne Fehlermeldung !!!!!!!!!!!!!!!!
'z = Range("a4").End(xlDown).Row
' ActiveSheet.Range(Cells(4, 1), Cells(z, 30)).Select
' Selection.Delete Shift:=xlUp
'-------- erst vorhandene Liste löschen --- da kommt Fehlermeldung Laufzeitfehler 1004
' Wenn Daten vorhanden sind, kommt keine Fehlermeldung, wenn die Datei Leer ist,
' kommt Fehler !!!!!!!!!!!!
With wsLaufAbge
z = rgbLaAb.End(xlDown).Row
rgbLaAb.Range(Cells(rgbLaAb, 1), Cells(z, 30)).ClearContents
End With
da die Daten nach Beendigung gelöscht werden, muß es funktionieren !
Danach werden ja erst die Daten eingelesen !
gruß Walter MG
Anzeige
AW: Select vs. Referenzobjekt
27.08.2006 20:57:28
ingUR
Hallo, Walter,
gerade weil ich meinte entdeckt zu haben, dass Du gerne mit Umbenennungen während des laufenden "Rennens" arbeitest, habe ich die "Basismappe" geschaffen, die, so habe ich wohl Deinen Beitrag von heute Mittag richtig entnommen, funktioniert.
Damit wäre aber auch die Grundlage gelegt, zu untersuchen, worin sich die beiden Vorgehnsweisen (Select vs. Objektreferenzierung) voneinander unterscheiden und wo besonderes Augenmerk bei der Aus- und Nacharbeit des Programmcodes zu legen ist.
'-------- erst vorhandene Liste löschen ----- das Funktioniert -----
'ohne Fehlermeldung !!!!!!!!!!!!!!!!
1.1 | z = Range("a4").End(xlDown).Row
1.2 | ActiveSheet.Range(Cells(4, 1), Cells(z, 30)).Select
1.3 | Selection.Delete Shift:=xlUp
Ohne das Du es besonders erwähnst, hat der Code vor der Ausführung von 1.1 ActiveSheet im Visier, was bedeutet, daß diese Tabelle zuvor als aktive Tabelle ausgewählt wurde.
Der volle Umfang der Objekte dieser Tabelle (Zellen, Bereiche) steht ohne besondere Anforderung zur direkten Verfügung, liegt im Geltungsbereich des momentanen Programmabschnitts der Zeile 1.1.
Aus diesem Grund ist es auch in 1.1 nicht erforderlich, nochmals anzuzeigen, dass die Zeilennummer der letzte beschribenen Zelle in der Spalte A in z gespeichert werden soll, wenn es sich um die aktive Arbeitmappe handelt.
Mit dieser Erkenntnis läßt sich fragen, warum die Zeile 1.2 das anzuwählende Objekt (Bereich) Range(Cells(4, 1), Cells(z, 30) dennoch den Verweis auf die "Eignerin", ActivSheet, enthält ( [Object.]"Sub"-Objekt.Methode] ).
Richtig, der Programmcode würde cetera paribus genauso ohne besondere Referenzierung des Rangeobjektes auf ActiveSheet. funktionieren.
"Erkauft" wurde dieser Freiheit damit, dass vor dienen Achsionen die Objekte der betreffenden Tabelle ins unbedingte Blickfeld des Code gerückt werden mußte, was durch das Aktivieren dieser Arbeittabelle erfolgt (Sprung zur Tabelle, wenn zuvor eine andere Tabelle den Focus hatte; eben das "Flackern").
Das Ereignis infolge der Selektion, das Markieren des Zellenbereichs, ist bekannt und bei der schrittweisen Ausführung zu beobachten. Anschließend werden die Zellen im Bereich der Selektion gelöscht und das virtuell entstandene Tabellenloch durch das Heraufziehen der unter dem Bereich bisher befindlichen Tabellen geschlossen (.Delete Shift:=xlUp). Das nmacht allerdings nur Sinn, wenn es etwas zum Heraufziehen "würdiges" in diesem ehemals unterhalb der Selektion liegenden Bereich gibt. Leerzeilen herauzuziehen ist ein schilbürgerhaftes Unterfangen.
Fazit: Im Programm lassen sich die beiden Zeilen 1.2 und 1.3 mit einander ohne Absichtsverlust, jedoch mit Steigerung der Effizenz, vereinen:
ActiveSheet.Range(Cells(4, 1), Cells(z, 30)).Select + Selection.Delete Shift:=xlUp
(1.2+1.3) ' ActiveSheet.Range(Cells(4, 1), Cells(z, 30)).Delete Shift:=xlUp
und da sich die ganbze Aktion auf dem aktiven Tabellenbalt abspielt, kann weiter gekürzt werden:
(1.2+1.3) ' Range(Cells(4, 1), Cells(z, 30)).Delete Shift:=xlUp
Wenn es nun nur darum geht, den Zelleninhalt indiesm Bereich zu löschen, dann serfüllt die Programmzeile
(1.2+1.3)a ' Range(Cells(4, 1), Cells(z, 30)).ClearContens
den gleiche Zweck, ohne zusätzlich Leerzelle herauf ziehen zu müssen.
Diese Vorgehenswiese bedingt also, dass man sich in dem Bezugsobjekt (Referenzobjekt) befindet. Auf jedes Objekt innerhalb des Referenzobjektes oder jede Methode die auf bzw. in diesem anwenbar ist, kann direkt angesprochen werden.
Außerhalb dieses aktiven Objektes sind andere Objekte nur über die vollen "Pfadangaben" möglich, vergleichbar also mit der Verzeichnisstruktur eines Dateisystems.
Sol der obige Programmcode auf ein Tabellenblatt 2 ausgeführt werden ohne das das Tabellenbalt 1 verlassen wird, dann wäre im Programm expizit mitzuteilen, dass man Objekte ansprechen will, die sich in einem anderen "Objektbereich" liegen:
1.1b | z = Worksheets(2).Range("a4").End(xlDown).Row
1.2b | Worksheets(2).Range(Worksheets(2).Cells(4, 1), Worksheets(2).Cells(z, 30)).ClearContens
Mit den obigen Erkläreungen wird deutlich, dass hier eben die Zelle [A4] auf der Tabelle 2 angesprochen wird und nicht die des aktiven Tabellenblattes, wenn es nicht gerade die Tabelle 2 ist. Besonder zu beachten ist, dass in 1.2b der Rangebereich auch durch die eindeutig zu referenzierenden Eckzellen zu benenne ist!
In diesen Anweisung fällt auf, dass die Objektbeschreibung Worksheet(2) viel Schreibarbeit verursacht. Doch da gibt es als Hilfe den With ... End With-Block, der es erlaubt, ein gemeinsames Referenzobjekt "auszuklammern".
1.0c | With Worksheets(2)
1.1c | z = .Range("a4").End(xlDown).Row
1.2c | .Range(.Cells(4, 1), .Cells(z, 30)).ClearContens
1.3c | End With
Das Objekt Worksheet(2) ist gedanklich also vor jeden führenden Punkt vor einem Sub-Objekt innerhalb des With-Blocks zu setzen.
Nun gibt es zusätzlich die Möglichkeit, einem Objekt einen besonderen Referenznamen zu verleihen, ein Referenzobjekt zu erstellen:

Dim objWS2 as Worksheet
Set objWS2 = Worksheets(2)

so dass nach erfolgreicher Einführung durch den Set-Befehl, objWS2 und Worksheets(2) gleichrangig im Geltungsbereich verwendet werden kann:
1.0d | With objWS2
1.1d | z = .Range("a4").End(xlDown).Row
1.2d | .Range(.Cells(4, 1), .Cells(z, 30)).ClearContens
1.3d | End With
Nun jedoch zu dem fehlerhaften Programmstück. Der Laufzeitfehler 1004 weist bereits auf die Ursache mit seiner Fehlerinformation "Die Methode 'Range' für das 'Objekt_Global' ist fehlgeschlagen" hin. Da eine Referenzierung fehlgeschlagen ist, wird versucht auf das Übergeordnete Objekt zu zugreifen. Das ist aber "Diese ArbeitsMappe" oder das Workbook-Obkjekt, was das dirkete Unteobjekt Range nicht "kennt".
'-------- erst vorhandene Liste löschen --- da kommt Fehlermeldung Laufzeitfehler 1004
' Wenn Daten vorhanden sind, kommt keine Fehlermeldung, wenn die Datei Leer ist,
' kommt Fehler !!!!!!!!!!!!
2.1. ' With wsLaufAbge
2.2. ' z = rgbLaAb.End(xlDown).Row
2.3. ' rgbLaAb.Range(Cells(rgbLaAb, 1), Cells(z, 30)).ClearContents
2.4. ' End With

Die Fehlersuche kann sich also auf die Eindeutigkeit der Referenzierung beschränken.
In 2.1 wird auf das Objekt wsLaufAbge Bezug genommen. Ist dieses sollte ordnungsgemäß durch einen Set-Befehl als Worksheet-Objekt eingeführt worden sein (beim Debbuging darf das Objekt kein "Leer"-Objekt sein).
In 2.2. wird ein anderes Objekt mit dem Namen rgbLaAb benutzt, was nach seiner Stellung zur Methode .End(xlUp) ein Rangeobjekt ist. Auch dieses muß eindeutig und nicht "Leer" gesetzt sein. Wenn nun in der betreffenden Spalte, die in dieser Referenz als Referenz vorgegeben ist, keine beschriebene Zelle vorhanden, zu liefert diese Anweisung 2.2 den Wert Null, der der Variablen z zugewiesen wird. Eine Zelle .Cells(0, Spalte) gibt es allerdings auf keinem Tabellenblatt!
Entweder es liegt ein Referenzfehler vor (was ich vermute, da .Range("A4") in rgbLaAb enthalten sein sollte, wenn die Notation so erfolgt wie bisher), oder aber der Fall z = 0 muß gesondert untersuchrt werden. Kann es also sein, dass, wenn in Spalte A kein Eintrag ist, dass dann dennoch der Bereich [A4:AD?] gelöchst werden muß und wie ist dabei dann ? zu definieren?
2.3.a | if z > 0 then
2.3.b | rgbLaAb.Range(Cells(rgbLaAb, 1), Cells(z, 30)).ClearContents
2.3.c | else
2.3.d | ...was nun?
2.3.e | end if
Doch hier ist dann auch in der Zeile 2.3.b noch eine Unstimmigkeit zu bemerken, da rgbLaAb einerseits an der Position eines Worksheets gesetzt ist, da es als Unterobjekt ein Range-Objekt anspricht ( rgbLaAb.Range(...), anderseits aber auch an der Position einer Zeilennummer eines Rangeobjektes steht (Eigenschaft Row eines Range-Objektes). Das kann nicht sein!
Da ich Gelegenheit genommen habe, Select vs. Referenzobjekt in groben Zügen gegenüber zu stellen, hat es etwas länger gedauert, bis ich zum Kern Deiner Fragestellen gekommen bin. Ich hoffe dennoch, dass ich nicht gelangweilt habe und einen ersten Schein in das Dunkel des Einsatzes von Referenzobjekten gebracht zu haben.
Gruß,
Uwe
Die Darstellung...
28.08.2006 10:12:54
Walter
Guten Morgen Uwe,
es ist schon Super, wie Du mir dies erklärt hast.
Ich habe in der Zwischenzeit den Fehler (gestern 23.00Uhr) gefunden, FALSCHE Zuweisung,
hatte dann dein Makro Stück für Stück kopiert und siehe da, klappte !!!
Anmerkung:
Die Daten / Zeilen werden immer nach Beendung der Mappe gelöscht, damit nicht zuviel
Bytes.
Wenn ich darf, habe ich nur noch eine Frage:
Wie kann ich es darstellen, verschiedene Zellen in der Sheet anzusprechen, weil ich da die Formel kopieren möchte, die ich ja vorher hiermit:
.Range("J2,M2,Z2,F1,H1").ClearContents
gelöscht hatte, damit keine Fehlermeldung erscheint #NV etc. .
Hier:
With wsLaAb 'das ist die Sheet Lauf+Abge
.Activate
' rgbLaAb.Range("F2").Activate
' ActiveCell.FormulaR1C1 = _
' "=TEXT(""Laufende "",)&TEXT(R[-1]C,""#.0"")&"" + Abgemeldete ""&TEXT(R[-1]C[2],""#.0"")"
' Range("J2").Select
' ActiveCell.FormulaR1C1 = _
' "=IF(R[2]C[-9]&gt0,SUBTOTAL(3,R4C6:R65000C6),""Filter 0"")"
' Range("M2").Select
' ActiveCell.FormulaR1C1 = "=SUM(R4C13:R65000C13)" 'ist ZINSEN Summenformel
' Range("Z2").Select
' ActiveCell.FormulaR1C1 = "=SUM(R4C26:R65000C26)" 'Summel für NDL Ertrag
End With
Bin in der Firma und möchte gern das Makro zu Ende bringen,
mfg Walter MG
AW: Die Darstellung...
28.08.2006 14:44:31
ingUR
Hallo, Walter,
nur zwischendurch...
Ziel der Aktion war es, die Select und Active-Anwiesungen, da wo es geht, zu entfernen. Daher wundert es mich, dass Du erneut mit diesen Befehlen arbeitest, zumal die Zuweisung an eine Zelle nicht von dem Aktivzustand dieser Zelle abhängt:

With wsLaAb 'das ist die Sheet Lauf+Abge
.Range("F2").FormulaR1C1 = "=TEXT(""Laufende "",)&TEXT(R[-1]C,""#.0"")&"" + Abgemeldete ""&TEXT(R[-1]C[2],""#.0"")"
.Range("J2").FormulaR1C1 = "=IF(R[2]C[-9]>0,SUBTOTAL(3,R4C6:R65000C6),""Filter 0"")"
.Range("M2").FormulaR1C1 = "=SUM(R4C13:R65000C13)" 'ist ZINSEN Summenformel
.Range("Z2").FormulaR1C1 = "=SUM(R4C26:R65000C26)" 'Summel für NDL Ertrag
End With

Das sollte eigentlich funktionieren, wenn sich die Zellen (Range-Objekte) auf dem Blatt (Objekt), das durch wsLaAb referenziert ist, befinden.
Gruß,
Uwe
P.S.:
Zum zweiten Beitrag später mehr, falls dann noch erforderlich, da Du vielleicht schon einige Punkte selbst beheben kannst.
Mal wieder etwas schlauer...
28.08.2006 17:42:20
Walter
Hallo Uwe,
herzlichen Dank, bin mal wieder etwas schlauer.
Warte nur noch auf mein Makro, wenn Du Zeit hast, um es zu kontrollieren.
mfg Walter MG
Ich war BLÖD, hat geklappt
28.08.2006 10:30:42
Walter
Hallo Uwe,
hat geklappt !!!
Da Du ja wahrscheinlich ein Experte auf diesem Gebiet bist, schicke ich Dir mal das Makro, was ich für meine Ansprüche angelegt habe, vielleicht endeckts Du ja einen Fehler Doppelschreiben etc. wenn nicht, bitte kurze Info ob so Rcihtig !
'-------- Lauf+Abge und Daten von Laufende/Abgemeldete kopieren ----------------

Sub VF_Lauf_Abge_Kopieren_TEST()
Application.ScreenUpdating = False
' ws = die Sheet              'rgb = Breich
Dim wsLaAb As Worksheet, wsLa As Worksheet, wsAb As Worksheet
Dim rgbLaAb As Range, rgbLa As Range, rgbAb As Range
Dim z, ze As Long
Set wsLaAb = Sheets("Lauf+Abge")
With wsLaAb
Set rgbLaAb = wsLaAb.Range("A4")
.Unprotect (getStrPasswort)
If .AutoFilterMode Then
rgbLaAb.AutoFilter
End If
End With
Set wsLa = Sheets("Laufende")
With wsLa
Set rgbLa = wsLa.Range("A4")
.Unprotect (getStrPasswort)
If .AutoFilterMode Then
rgbLa.AutoFilter
End If
End With
Set wsAb = Sheets("Abgemeldete")
With wsAb
Set rgbAb = wsAb.Range("A4")
.Unprotect (getStrPasswort)
If .AutoFilterMode Then
rgbAb.AutoFilter
End If
End With
'-------- erst vorhandene Liste löschen --------------
With wsLaAb
.Activate
z = rgbLaAb.End(xlDown).Row
.Range(Cells(4, 1), Cells(z, 30)).Clear   'wirklich notwendig?
.Range("J2,M2,Z2,F1,H1").ClearContents
End With
'--------- jetzt Laufende kopieren ----------------------------
With wsLa
.Activate
z = rgbLa.End(xlDown).Row
Set rgbLa = .Range(Cells(4, 1), Cells(z, 30))
rgbLa.Copy Destination:=wsLaAb.Range(rgbLaAb.Address)
End With
With wsLaAb
.Activate
Set rgbLaAb = .Cells(.Range("A4").End(xlDown).Row + 1, 1)   'Setzt neue Zielzelle
End With                                                   '(für Destination im Copy-Befehl)
'---------- jetzt Abgemeldete kopieren ----------------------------
With wsAb
.Activate
z = rgbAb.End(xlDown).Row
Set rgbAb = .Range(Cells(4, 1), Cells(z, 30))
rgbAb.Copy Destination:=wsLaAb.Range(rgbLaAb.Address)
wsLaAb.Activate                                       'Lauf+Abge aktivieren
'--------- Spalte "B" Daten löschen ---------------------
wsLaAb.Range(Cells(4, 2), Cells(65536, 2)).Clear
End With
'---- aktive Zelle setzen, muß mit With Neu gesetzt werden ---
With wsLaAb
Set rgbLaAb = .Range("A4")
rgbLaAb.Activate
End With
'----------- Zahlenreihe setzen -----------------------------
'Range("A4").Select
ActiveCell.FormulaR1C1 = "1"
ActiveCell.AutoFill Destination:=Range(ActiveCell.Address, Cells(Range("E65536").End(xlUp).Row, 1)), Type:=xlFillSeries
'--------- jetzt wird sortiert, lf.Nr. Spalte "A" lassen -----------
With wsLaAb
.Activate
Set rgbLaAb = .Range("A4")
rgbLaAb.Activate
z = rgbLaAb.End(xlDown).Row
Set rgbLaAb = .Range(Cells(4, 2), Cells(z, 30))
rgbLaAb.Sort Key1:=Range("F4"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
End With
'------- für die Formeln ------------------------------------
With wsLaAb
wsLaAb.Range("F2").Activate
ActiveCell.FormulaR1C1 = _
"=TEXT(""Laufende   "",)&TEXT(R[-1]C,""#.0"")&""   +   Abgemeldete ""&TEXT(R[-1]C[2],""#.0"")"
Set wsLaAb = Nothing
Set wsLa = Nothing
Set wsAb = Nothing
Set rgbLaAb = Nothing
Set rgbLa = Nothing
Set rgbAb = Nothing
Application.ScreenUpdating = True
End Sub

mfg Walter MG
AW: Ich war BLÖD, hat geklappt
28.08.2006 18:30:41
ingUR
Nein, Walter,
Experte bin ich in Dingen EXCEL nun wirklich nicht. Heimwerker trifft es eher, und so kann ich mir auch den einen oder anderen Schnitzer erlauben, ohne dass da das Wohl des Büros davon abhängt.
Anders scheint es mir allerdings bei Deinem Projekt zu sein, das im Endstadium einer ausgeeiften Lösung gleichkommen soll, zuverlässig arbeiten und von Dir gepflegt werden soll. Da ist ja fast schon zu Überlegen, ob Du nicht eine professionielle Hilfe in Anspruch nehmenen solltest. Insofern ist vielleicht auch verständlich, dass Du Dir nicht die Zeit nehmen kannst, Lernschritte zu festigen, ehe es zum nächsten Punkt geht.
Ausgangspunkt war, der übermäßige Einsatz von Select/Active-Befehlen in Deiner ersten vorgestellten Testentwicklung, die zu einer "flackernden" Bildschirmaktualisierung führte, um es noch einmal zu wiederholen.
Es ist nun zwischenzeitlich eine Arbeitsmappe daraufhin entstanden, die diesen Makel nicht mehr aufweist und als Grundlage dienen sollte, um nicht fortwährend mit anderen Namen und Programmstrukturen operieren zu müssen. Active/Select-Befehle fehlen dort bis auf die letzte Setzung der Activzelle, die nach der Aktuallisierung den Focus haben soll.
Nun zeigst Du hier einen Programmteil, der eigentlich das Wesen der Objektreferenzierung nicht ausnutzt, indem wieder auf Active & Co. zurückgegriffen wird.
Nun sind wir bereits ein Stück weit in der Abänderung des Programmcodes geschritten und ich würde einer der Letzten sein, die sich mit diesem "Unvollendeten" im Regen stehen lassen wollte, doch ist von Deiner Seite klar zu entscheiden, in welcher Art Du Dir die Erabeitung vorstellst, da es sich eben nicht um eine Übung handelt, für die alle denkbaren Irrwege zulässig sind.
Anderseits hege ich den Verdacht, dass am Ende ein schlecht zu entwirrender Flickenmuster-Programmcode entsteht, da mir für strukturierte Hinweise/Empfehlungen und im Zusammenhang sehende Erläuterugen der Überblick über die Gesamtfunktion und -aufgaben des Programmbausteines fehlt. So werden untere Zellen von Summenbereichen nach Spalte E ermittel, obwohl doch Recheckbereich übernommen wurden.
Warum also z.B. wird nun in E eine andere untere Zellennummer anzusprechen sein, als die für Reihe A einmal festgestellbare, sobald alle Blöcke kopiert sind? Welche (Auto-)Filterfunktion sollen wann eingesetzt?
Sofern es sich bei den Daten um vertrauliche Daten handelt und auch keine komplette Mustermappe erstellt werden kann, die als alleinige Arbeitsunterlage dient, an der alle Aufgaben simuliert werden können (ggf. als Zip-Datei hochzuladen), dann ist zu überlegen, ob es in Deinem näheren Umfeld nicht die Möglichkeit gibt, das Projekt in seinen Planungsschritten und Entwicklungsphasen fachkundig zu besprechen.
Sofern ich weiterhin unterstützend tätig sein kann - ohne das ich professioniellen Softwareentwicklern eine Aufgabe entziehe -, bitte ich darum, dass der Zeitraum zur Erarbeitung und Festigung von Erkenntnisschritten an Hand einer Beispielsmappe eingeplant ist, denn nur so, kann auch später der Programmcode mit vernünftigen Zeitaufwand gepflegt werden, so meine ich jedenfalls.
Wenn Du die Forumsleitung darum bittest, mir Deine Emailadresse zukommen zu lassen, lassen sich die weiteren Schritte vielleicht effektiver planen, als dieses bisher geschehen ist.
Ich hoffe Du hast Verständnis für das Darstellte, denn eine kürze Bewertung Deines Programmcodes wäre mir auch nicht möglich gewesen unabhängig von den Unklarheiten in den beabsichtigten Programmschritten.
Gruß,
Uwe
Hallo bin so schon...
28.08.2006 19:28:46
Walter
Hallo Uwe,
Du hast dir recht viel Mühe gemacht, mit der Beschreibung etc. .
Meine Datei enthält viele Zahlen etc. ca. 500-700 Zeilen, die ich mittels Makro in eine
Sheet kopiert hatte, siehe das Beispiel, ich bin jetzt so zufrieden.
Die Formeln habe ich auch noch eingebaut, ich brauch jetzt nur noch 1-2 sek. für das Ablaufen des Makros, sonst ca. 3-5 sek. und das Flackern ist jetzt weg !
Ich bin, wie gesagt Super zufrieden.
Ich habe noch ein Schließen-Makro, flackert ohne Ende (funktioniert aber) was ich jetzt etsprechend ändern werde und ich möchte natürlich etwas Lernen.
Du hast RECHT sieht schon Profs. aus, aus meiner Sicht nicht.
Wenn Du möchtest hier meine Mail-Adresse walterbuhl@t-online.de , vielleicht brauch ich noch deine Unterstützung bei meinem Schließen Makro, nur wenn Du willst kannst mir ja
deine Mail-Adresse ja senden,
nochmals herzlichen Dank für die großartige Unterstützung,
mfg Walter MG

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige