Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
864to868
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
864to868
864to868
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Problem Selektion - Schleife

Problem Selektion - Schleife
26.04.2007 23:25:00
lobby007
Hallo Excel-Freaks,
ich habe einen Code:

Sub testalphabetstrcomp2neu()
Dim LJ1name As String, LJ2name As String
LJ1name = ActiveCell
LJ2name = ActiveCell.Offset(0, 1)
If StrComp(LJ1name, LJ2name, vbTextCompare) = 0 Then
ActiveCell.Select
End If
If StrComp(LJ1name, LJ2name, vbTextCompare) = 1 Then
Selection.Insert shift:=xlDown
End If
If StrComp(LJ1name, LJ2name, vbTextCompare) = -1 Then
Selection.Offset(0, 1).Insert shift:=xlDown
End If
End Sub


der Wunderbar funktioniert wenn ich ihn für jede Zeile einzeln einsetze.
Ich beginne in A2 und gehe dann zu B2 usw.
Nun soll er aber ab A2 (A1+B1= Überschrift) bis zum Ende der Liste gehen - wie macht man das?
Siehe auch Beispieldatei. - war nicht hochzuladen
A1 deueng B1 xxxx
A2 bus B2bus
A3 boat B3boat
A4 access B4 access
A5 access B5 accore
A6 entrance B6 dumm
Gruß lobby007

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Problem Selektion - Schleife
27.04.2007 07:38:00
ingUR
Hallo, @lobby007,
wenn Deine Liste alphabetisch sortiert werden darf, wobei das Sortierktierieum die Spalte A liefert, dann kann eine aufwendigere Vergleichsoperation vermieden werden:
Option Explicit

Sub testalphabetstrcomp2neu()
Dim CompResult As Integer
Dim maxR As Long, r As Long
'Sortiere
Columns("A:B").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes
maxR = Cells(Rows.Count, 1).End(xlUp).Row
r = 2
While r  0 Then
'Vergelich ist nur erforderlich,
'wenn in beiden Spalten der Zeile ein Eintrag vorhanden ist
CompResult = StrComp(Cells(r, 1), Cells(r, 2), vbTextCompare)
If CompResult  0 Then
'Zelleninhalte der Zeile unterscheiden sich,
If CompResult = 1 Then Cells(r, 1).Insert shift:=xlDown Else Cells(r, 2).Insert  _
shift:=xlDown
If r 


Anzeige
AW: Problem Selektion - Schleife
27.04.2007 07:59:51
lobby007
Hallo ingUR,
vielen Dank - funktioniert wie verrückt.
Mich hätte zwar interessiert wie es zeilenweise geht aber was solls - Hauptsache es geht jetzt.
Vielen Dank und noch ein schönes Wochenende.
gruß lobby007

AW: Problem Selektion - Schleife
27.04.2007 09:04:00
ingUR
Hallo, lobby007,
Du merkst an: «Mich hätte zwar interessiert wie es zeilenweise geht ...», doch ich verstehe nun nicht, was Du damit meint.
Die Routine läuft iner WHILE-WEND-Schleife zeielnweise ab, wobe sich die Anzahl der zu untersuchenden Zeilen (Bereich der Spalte A und B) mit jedem Einschub vergrößert (maxR=maxR+1). Ein besonderer Selektionsbefehl ist hier zur Aufgabenlösung nicht notwendig.
Wenn Du jedoch auf das Sortieren verzichten willst, dann ist eine andere Logik zu entwickeln, die darauf Rücksicht nimmt, dass nach Verschüben immer in der nächte Zeile der Vergleich erneut aufgenommen wird, in der beide Spaltenzellen der Zeile belegt sind.
Gruß,
Uwe

Anzeige
AW: Problem Selektion - Schleife
27.04.2007 13:23:00
lobby007
Hi Uwe,
ich meinte damit wie es mit meiner Funktion und einem Zeilenweisen Aufruf des Ablaufes gehen würde.
Nur aus Interesse - wie gesagt mein Code ging auch wenn man ihn je zeile manuell aufgerufen hat.
Ich möchte ja etwas lernen und nicht immer auf Hilfe aus dem Forum angewiesen sein.
Gruß lobby007

AW: Problem Selektion - Schleife
28.04.2007 12:49:19
ingUR
Hallo, @lobby007,
nun, zeilenweise arbeit das Programm auch, jedach nutzt es nicht die Selektanweisung, da intern im Code eine Zelle eine Speicherstelle darstellr, deren Inhalt man allein durch Angabe der Speicherstellenbezeichnung abrufen kann.
Deine Zuweisung an eine lokal definierte Variable macht in einer Vielzahl von Anwendung durchaius sin, wenn wiederholt auf den gleichen Zelleninhalt zugegriffen werden muß, da die Adressenberechnung in der VBA-Tabelle über die Spalte-/Zeile zusätzlich Rechengänge erfordert, die bei einem Aufruf einer in einer benutzerdefinierten Variablen entfallen bzw. schneller gehen.
Der nächte Veränderungsschritt ist der, dass ich nur dann einen String-Vergleich durchführen brauch, wenn beide benachbarten Zellen eine Zeichenkette enthalten, jed Kette also eine Länge größer Null hat. Ist nur eine der beiden Zellen leer, dann ist kein Vergleich erforderlich, da es nichts zu verschieben gibt. Die Auswertung der Multiplikation der beiden Länge ist nur dann größer Null, wenn beide Zeichenketten eine Länge von mindestens 1 haben.
Nun wird, wenn beide Strings in der Zeile r vorhanden sind, der Vergleich einmal durchgeführt und das Ergebnis in eine Variable für die weitere Verwendung abgelegt. Dieses Ergebnis ist Null, wenn die Strings übereinstimmen, also keine weitere Aktion erforderlich ist. Ist das Ergebnis +1 oder aber -1 ist ein Einschub einer Zelle erforderlich. Dadurch vergrößert sich aber auch die Anzahl der zu untersuchenden Zeilen maxR gegenüber dem Stand zuvor.
Im Anschluß an die Untersuchung wird der Zeilenzähler um 1 erhöht, es wird also die nächste Zeile untersucht.
Möchtest Du nun aus "optischen" Gründen verfolgen, welche Zelle gerade aktiviert ist, dann füge einfach ein Cells(r,1).Select an die Stelle im Programm ein, die Dir für diese Darstellung richtig erscheint, denn ansonsten arbeitet das Programm sehrwohl zeilenweise, wie ich hoffe, es nachvollziehbar erläutet z haben und Du bei schrittweiser Ausührung der Prozedur feststellen wirst.
Wenn Du also den Sortieralgorithmus vorschaltet, dann kannst Du die Elemente der WHILE-WEND-Schleife mutatis mutandis um Deine Zeilenauswertung legen. Aber auch eine FOR-NEXT-Schleife wäre möglich erfordert aber eine separate Verwaltung und Berechnung von Zeilennummer und Schleifenzähler.
Gruß,
Uwe
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige