Zeilen vergleichen in Excel - Macro

anubis2002

Grünschnabel
hallo,
habe mir ein macro geschrieben, dass mir in meiner exceltabelle jeweils zwei zeilen miteinander vergleicht. wenn die zeilen 100 % uebereinstimmen funktionert das programm einwandfrei. (wenn die zeilen uebereinstimmen, koennen beide zeilen geloescht werden)
z.b. in diesem fall gehts .

Zeile1 : C110
Zeile2 : C110

ich vergeliche die zeilen mit einer einfachen if schleife...

If Component1 = Component2 Then

so mein problem ist jetzt, wenn folgender fall auftritt

Zeile1: C110
Zeile2: C110, A123

die componente in zeile 1 ist in zeile 2 enthalten somit ist es auch okay wenn beide geloescht werden, aber in diesem fall funktionert meine
if schleife nicht mehr, da sie ja die zwei zeilen auf 100% genauigkeit ueberprueft.
wie kann ich dieses prob loesen.
vielen dank
 
Hi,

ich würde den Zelleninhalt mit der "Split"-Funktion in ein Array übernehmen.

Anschließend machst du in einer Schleife den Vergleich zwischen dem zu suchenden String und den einzelnen Arrayeinträgen.
- Ist der Vergleich negativ, kannst du den entsprechenden Wert aus dem Array wieder in die Zelle eintragen.
- Ist der Wert vorhanden, findet kein Eintrag statt.
Bei dem Vergleich solltest du auch die "Trim"-Funktion verwenden, um eventuelle Leerzeichen zu entfernen.
 
Geht viel Einfacher:

Für solche Fälle gibts die INSTR-Funktion. Damit kannst du prüfen ob ein String als Teilstring in einem anderen String enthalten ist!

In deinem Fall

Instr("C110, A123", "C110") gibt 1 zurück
Instr("A123, C110", "C110") gibt 7 zurück
Instr("A123, C110", "B110") gibt 0 zurück

Das heißt du musst nur mit ner If Prüfen ob dein Instr ne Zahl > 0 zurück gibt dann kannst du den Rest deines Codes einsetzen der die Zeilen löscht!

Also wie man oben erkennt gibt instr die Stelle im String zurück wo der gesuchte String in deinem zu durchsuchenden String beginnt!

Jetzt hab ich verdammt oft String gesagt! Jetzt schwirren mir nur noch Unterhosen im Kopf rum! :confused:
 
danke fuer eure antworten
@dignsag
das problem hierbei ist, dass sich die zeilen immer aendern.

zeile1: C110, R604
zeile2: C110, D601, Q601, R604, C605

diese zwei zeilen waeren okay, wobei

zeile3:C338 (10K), C421 (10K)
zeile4:C1222, C338, C421 (10K)

dies hier nicht gehen wuerde, da der C338 in Zeile 3 ein Wiederstand mit 10 K ist und in zeile 4 NICHT enthalten ist.

oder funktioniert dass dann auch mit dieser Instr funktion


@Merlin
wie nutze ich diese Splitfunktion ?


vielen dank fuer eure tipps.
 
Hi,

@dignsag:
Also an die InStr-Funktion hab ich auch gedacht. Nur was machst du, wenn z.B. folgende Werte hast:
Zelle 1: C112
Zelle 2: C1120

In Zelle 2 findet InStr den Wert aus Zelle 1. Also sagt InStr, daß der Wert vorhanden ist.
 
Ach so, die Split-Funktion:

Du mußt ein Array deklarieren:
Code:
Dim data() As String

Dann kannst du mit der Split-Funktion einen String aufteilen. z.B.
Code:
Dim text1 As String
 
text1="Rot, Gelb, Grün"
data=Split(text1,",")

Der erste Parameter der Split-Funktion ist der String, der aufgeteilt werden soll.
Im zweiten Parameter wird das Trennzeichen (im Beispiel das ",") angegeben

Im Array steht dann:
data(0)="Rot"
data(1)=" Gelb"
data(2)=" Grün"

Wenn du jetzt Strings vergleichen möchtest, mußt du noch die Trim-Funktion benutzen, damit die Leerzeichen in data(1) und data(2) unbeachtet bleiben.
 
hey, okay soweit geht es schon mal. habe mir ein kleines prog geschrieben zum testen der split funktion nur ein probleme habe ich noch...

data1 = Split(Component1, ",")
data2 = Split(Component2, ",")

For i = 0 To 5
If data1(i) <> "" Then 'hier moechte ich pruefen ob ein wert drinn steht oder nicht
'aber sobald kein wert mehr drinsteht bekomm ich schon die
'die fehleremeldung out of range

Worksheets(Source2).Cells(NewLine1, Column) = data1(i)
Else
End If

If data2(i) <> "" Then
Worksheets(Source2).Cells(NewLine2, Column) = data2(i)
Else
End If
Column = Column + 1
Next i

NewLine1 = NewLine1 + 2
NewLine2 = NewLine2 + 2



ich habe meine schleife mal auf 5 eingestellt, das prob das ich jetzt habe, wenn ich in meiner ersten zeile nur 2 componenten drin habe, dann bekomm ich bei meinem dritten durchlauf der schleife bei data1(2) den wert "out of range", weil ja keine daten mehr drin stehen...
wie kann ich die schleife nur solange laufen lassen bis ich keine daten mehr in der zeile haben..
z.b. bei
D110, R345
brauche ich ja nur 2 durchlaufe, da ja der dritte durchlauf einen leeren wert geben wuerde
bei
D110, R345, R232
braeuchte ich aber 3 durchlaeufe...
 
Ihr zwei habt mit den Problemen natürlich vollkommen recht, ich ging nur von dem oben genannten einen Fall aus.

Dein Problem mit den Schleifendurchgängen löst du mit der UBound-Funktion

Ubound gibt dir die Anzahl der Elemente eines Arrays zurück! So kannst du also machen

For i = 0 to Ubound(Array)

^^
 
Hi,

verwende die UBound-Funktion:
Code:
For x = 0 To UBound(data)
    Debug.Print data(x)
Next

Du übergibst der UBound-Funktion ein Array und erhältst den höchsten Index im Array.
 
Hi,

@dignsag: zwei Dumme - ein Gedanke. Warst mal wieder schneller als ich :)
 

Neue Beiträge

Zurück