Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
788to792
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
788to792
788to792
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Dokumentation eines Makros

Dokumentation eines Makros
15.08.2006 17:52:53
Werner
Hallo,
könnte mir bitte jemand dieses Makro ein wenig dokumentieren. Ich weiß zwar was es für mich tut, würde aber gerne verstehen was genau wo passiert. Sonst werde ich es nie lernen und das wäre ziemlich schade :-/
Liebe Grüße, Werner.

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Wo ist das Makro?
15.08.2006 17:59:20
Luschi
 
AW: Wo ist das Makro?
15.08.2006 18:04:32
Werner
Oh man, ich vergesse irgendwann noch meinen Kopf :-)

Sub PlzZuweisen()
Dim j, i As Integer
For i = 1 To Range("B65536").End(xlUp).Row
For j = 1 To Range("B65536").End(xlUp).Row
x = Cells(j, Cells(j, 256).End(xlToLeft).Column + 1).Address
If Range("B" & i) = Range("C" & j) Then Cells(j, Cells(j, 256).End(xlToLeft).Column + 1) = Range("A" & i)
Next j
Next i
End Sub

AW: Wo ist das Makro?
15.08.2006 19:51:28
ingUR
Hallo, Werner,
hier füge die Erläuterung als Kommentar ein, ohne dass ich den Programmcode dort abändere, wo es sich anbieten würde.

Sub PlzZuweisen()
Dim j, i As Integer
' Range("B65536").End(xlUp).Rowliefert die letzte benutzte Reihe der Spalte B
' so dass für alle i = 1 bis i="LastRow der Schleifenkörper
' zwischen For i=... und next i genau einmal durchlaufen wird
' (if i > "LastRow" then end)
For i = 1 To Range("B65536").End(xlUp).Row
' erneut liefert Range("B65536").End(xlUp).Row die letzte benutzte Reihe der Spalte B
' so dass nun für alle j = 1 bis j="LastRow der Schleifenkörper
' zwischen For j=... und next j genau einmal durchlaufen wird
' (if j > "LastRow" then erhöhe Zähler i)
For j = 1 To Range("B65536").End(xlUp).Row
' hier wird nun die Zeile j betrachtet
' und es wird als erstes die Zahl der außerte rechte Spalten in dieser Zeile j,
' die einen Inhalt hat, ermittelt
x = Cells(j, Cells(j, 256).End(xlToLeft).Column + 1).Address
' hier wird der inhalt der aktuellen Zelle Bi mit dem der Zelle Cj verglichen
' Range("B" & i) = Range("C" & j)
' und wenn dieser gleich ist, der Wahrheitwert z.B. der Aussage B3 = C12 WAHR ist,
' dann wird der Zelle in der Zeile j
' Cells(j, ....
' in der ersten freien Zelle nach der letzten  beschriebenen Spalte in
' dieser Zeile j
' ...Cells(j, 256).End(xlToLeft).Column + 1
' der Wert der Zelle Ai eingetragen
If Range("B" & i) = Range("C" & j) Then Cells(j, Cells(j, 256).End(xlToLeft).Column + 1) = Range("A" & i)
' anschließend wir der Schleifenzähler um 1 erhöht (j=j+1)
' und mit dem Wert "LastRow" verglichen. Ist der Wert von j nicht größer, dann wird
' nochmals ein For-j-Schleifendurchlauf für das erhöhte j durchgeführt, ansonsten
' wird die auf next j folgende Anweisung ausgefüht.
' All dieses steckt also im "next j"!
Next j
' Wurde der Grenzwert "LastRow" für j überschritten,
' dann ist die FOR-j-Schleife abgeschlossen
' Es folgt die Erhöhung des Schleifenzählers um 1 (i=i+1).
' Wieder erfolgt der Vergleich dem Wert "LastRow". Ist i nicht größer als LastRow,
' dann wird nochmals ein For-i-Schleifendurchlauf für das erhöhte i gestartet,
' ansonsten wird die auf next i folgende Anweisung ausgefüht.
' Wieder steckt als dieses im "Next i"!
Next i
End Sub

Ich hoffe hierdurch ein paar Deiner Fragen beantwortet zu haben, ansonten: bei Frage, fragen!
Gruß,
Uwe
Anzeige
AW: Wo ist das Makro?
15.08.2006 23:13:16
Werner
Hallo Uwe,
vielen Dank dass Du Dir die Zeit genommen hast mir das Makro zu erklären. Langsam wird mir einiges klarer :-)
Gruß Werner.
Nachtrag zum Beitrag von ingUR
15.08.2006 20:08:47
ingUR
Hallo Werner,
diese Zeile
If Range("B" & i) = Range("C" & j) Then Cells(j, Cells(j, 256).End(xlToLeft).Column + 1) = Range("A" & i)
sollte so geschrieben werden:
If Range("B" & i) = Range("C" & j) Then
  Cells(j, Cells(j, 256).End(xlToLeft).Column + 1) = Range("A" & i)
Exit For
End IF
Wenn eine Übereinstimmung in Spalte "B" und "C" festgestellt wurde, dann
kann die innere For-Schleife verlassen werden. Wozu noch die anderen Zellen
der Spalte "C" durchsuchen?
Anmerkung:
Ob dieses Verfahren in großen Datenbeständen sinnvoll ist, wage ich zu bezweifeln,
da viel zu viel Leerdurchläufe erfolgen.
Hier würde der Find-Befehl besser reinpassen und vor allem schneller sein; _
ich kenne keine selbsterstellte Vba-Routine, die schneller ist als eine equivalente interne Excel-Vba-Funktion!
Gruß von Luschi
aus klein-Paris
Anzeige
AW: Nachtrag zum Beitrag von ingUR@Luschi
15.08.2006 22:54:41
ingUR@Luschi
Hallo,
alles in ein Array einlesen und dann per Schleife durchsuchen ist imho das schnellste.
Gruß aus’m Pott
Udo

AW: Nachtrag zum Beitrag von ingUR@Luschi
15.08.2006 23:20:45
ingUR@Luschi
Toll Udo und wie stelle ich das an? :-)
Gruß Werner.
AW: Nachtrag zum Beitrag von ingUR@Luschi
16.08.2006 10:58:59
ingUR@Luschi
Hallo,
so:

Sub PlzZuweisen()
Dim j, i As Integer
Dim vntRange As Variant
Dim ilastRow As Long, iLastCol As Integer
ilastRow = Cells(65536, 2).End(xlUp).Row  'letzte Zeile
iLastCol = Cells(1, 256).End(xlToLeft).Column + 1 'letzte Spalte + 1
vntRange = Range(Cells(1, 1), Cells(ilastRow, iLastCol)) 'Bereich in Array einlesen
'Array durchsuchen
For i = 1 To ilastRow
For j = 1 To ilastRow
If vntRange(i, 2) = vntRange(j, 3) Then
vntRange(j, iLastCol) = vntRange(i, 1)
Exit For
End If
Next j
Next i
'Bereich mit Array überschreiben
Range(Cells(1, 1), Cells(ilastRow, iLastCol)) = vntRange
End Sub

Gruß aus’m Pott
Udo

Anzeige
AW: Nachtrag zum Beitrag von ingUR@Luschi
16.08.2006 11:27:38
ingUR@Luschi
Hi Udo,
danke erst mal für Dein Makro. Mein Rechner brauchte gestern Abend 2h15min für die Zuweisung nach dem alten, bereits schnelleren Makro, das den Vorgang nach einem gefundenen Ident abbricht. Mit Deinem Makro ging es in ca. einer Minute. Leider habe ich jeweils nur eine Zuweisung pro Zeile bekommen was in manchen fällen auch richtig ist aber in vielen Fällen können es weit über 100 sein. Und irgendwie wurden auch die falschen Zahlen zugewiesen. Der vergleich haut nicht hin.
Jeder Wert aus B soll mit jedem Wert aus C verglichen werden und wenn eine Übereinstimmung da ist soll der zu B gehörige Wert in A, in E eingetragen werden wenn dort noch kein Eintrag vorhanden ist (wenn E1 zB. belegt ist soll E2 genommen werden, etc.)
Gruß aus Erfurt,
Werner.
Anzeige
AW: Nachtrag zum Beitrag von ingUR@Luschi
16.08.2006 12:28:28
ingUR@Luschi
Hallo,
aber C ist einmalig? Der Aussprung kann also erfolgen.
in deinem ursprünglichen Makro wurde der Wert aus der "B-Zeile" in die "C-Zeile" eingetragen. Genau das macht mein Makro auch.
Vielleicht solltest du mal eine abgespeckte Beispieltabelle (mit Ergebnis) hochladen.
Wenn E einfach lückenlos gefüllt werden soll:

Sub PlzZuweisen()
Dim j, i As Integer
Dim vntRange As Variant
Dim ilastRow As Long, iLastCol As Integer, iCounter As Long
ilastRow = Cells(65536, 2).End(xlUp).Row  'letzte Zeile
iLastCol = Cells(1, 256).End(xlToLeft).Column + 1 'letzte Spalte + 1
iCounter = 1
vntRange = Range(Cells(1, 1), Cells(ilastRow, iLastCol)) 'Bereich in Array einlesen
'Array durchsuchen
For i = 1 To ilastRow
For j = 1 To ilastRow
If vntRange(i, 2) = vntRange(j, 3) Then
iCounter = iCounter + 1
vntRange(iCounter, iLastCol) = vntRange(i, 1)
Exit For
End If
Next j
Next i
'Bereich mit Array überschreiben
Range(Cells(1, 1), Cells(ilastRow, iLastCol)) = vntRange
End Sub

Gruß aus’m Pott
Udo

Anzeige
AW: Nachtrag zum Beitrag von ingUR@Luschi
17.08.2006 11:18:23
ingUR@Luschi
Hallo Udo,
habs hochgeladen. Es sollte so sein. Wenn B identisch mit C dann soll A von B in der Zeile von C, unter E eingetragen werden. Steht in E schon ein Eintrag dann in F oder G, etc.
https://www.herber.de/bbs/user/35883.xls
Die Ergebnisse stehen schon da. Manche Ergebnisse sind nicht mehr nachvollziehbar, da der Rest der Tabelle fehlt. Die ersten Einträge in E und F sollten jedoch nachvollziehbar sein.
Dank im Voraus,
Gruß, Werner.
AW: Nachtrag zum Beitrag von ingUR
15.08.2006 23:18:33
ingUR
Hallo Luschi,
danke für Deine kleine Verbesserung am Makro. Glücklicherweise habe ich in Spalte C nur einzelne und keine doppelten Einträge, das verkürzt den gesamten Durchgang natürlich enorm. Morgen muss ich mir mal den Unterschied zwischen beiden Makros vor Augen führen und sehen wo da genau der Unterschied liegt. Geschrieben hast Du es ja schon, das dürfte mir helfen wenn ich das Makro betrachte. Wie gesagt, ich bin absoluter Anfänger was VBA angeht und mit Excel arbeite ich erst 3 Monate.
Grüße aus Erfurt,
Werner.
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige