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

Excel per makro eine Spalte vergleichen

Excel per makro eine Spalte vergleichen
17.12.2014 17:28:19
Marv
Hallo zusammen,
ich habe schon viel zu dem Thema gelesen, aber meine Antwort war leider noch nicht dabei.
Ich bin Anfänger mit vba und wurschtel mich da irgendwie durch ;)
Ich habe nach einigen Auswertungen mit verschiedenen Makros nun eine Liste die 2 Spalten enthätl,in der einen steht der Name einer Software in der Spalte danach steht eine Kategorisierung "Erlaubt","nicht Erlaubt", "Weiter prüfen"....es kann vorkommen das eine Software auf 2 Kategorien erscheint. Ich möchte Sie dann von der Kategorie "Weiter prüfen" entfernen und zB nur auf der "nicht Erlaubt" stehen haben.
Ich wollte das eigentlich ohne Hilfsspalte machen, finde allerdings keinen Ansatz der mir hilft.
Ich weiss nicht ob das verständlich genug war ;D
Vielen Dank für Eure Zeit
https://www.herber.de/bbs/user/94469.xlsx

21
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Ist das alles an Liste?
18.12.2014 04:40:32
Frank
Hallo,
aus Deinem Posting entnehme ich, dass Du da eine VBA-Lösung möchtest. Geht natürlich. Die Frage ist nur: Ist das nötig?
Ganz schnell geht das z.B. indem man die ganze Liste alphabetisch nach Programmnamen sortiert. Dann stehen die identischen Programmnamen untereinander und man muss nur die unerwünschten Einträge als ganze Zeile löschen.
Für so wenige Einträge und eine Arbeit, die man vielleicht ein...zweimal im halben Jahr macht, lohnt sich der Aufwand (zumal mit Level Kaum Excel/VBA-Kenntnisse kaum.
Grüsse,
Frank

AW: Ist das alles an Liste?
18.12.2014 08:59:55
Marv
Hallo,
das ist nur ein Beispiel...ausgewertet werden damit mehrere 100 Listen und die letzte ist quasi das Endergebnis.
In Natura ist die Ergebnisliste natürlich um einiges länger.
Mein Level bezieht sich auf die Leute die sich in so einem Forum als Antwortgeber rumtreiben, ich bekomme schon einige Sachen hin aber ich würde nie behaupten ich kann es. Ich komme eigentlich aus der Java Programmierung und habe da erweiterte Basickenntnisse. Es ist mir also nicht fremd, ich will nur nicht so tun als verstehe ich alles und kann alles ;)

Anzeige
Dann so
18.12.2014 14:50:16
Frank
Hallo,
ich würde das dann so machen
lZ=Sheets(1).UsedRange.Row
for i=1 to lZ
SWN=Sheets(1).cells(i,2).value
Status=Sheets(1).cells(i,3).value
Z1=2
do while not Sheets(1).cells(Z1,2).value=SWN
Z1=Z1+1
Loop
if not Status="nicht Erlaubt" then
Sheets(1).cells(Z1,1).value = "löschen"
else
Sheets(1).cells(i,1).value = "löschen"
end if
next
for i=lZ to 1 step -1
if Sheets(1).cells(i,1).value = "löschen" then
Sheets(1).cells(i,1).EntireRow.Delete
end if
next

Hier wird für jede Software geprüft, ob der Name noch einmal vorkommt. Wenn ja, wird in der Zeile von beiden, wo nicht "nicht Erlaubt" (hier musst Du nochmal Deine Schreibweise prüfen - auch hat's in der Beispieldatei keine Einträge "nicht Erlaubt" gegeben...) steht in Spalte A "löschen eingetragen, und im Nachgang werden diese Zeilen dann gelöscht.
Grüsse,
Frank

Anzeige
AW: Dann so
18.12.2014 16:21:26
Marv
Vielen Dank schonmal, ich probiere es jetzt aus. Ich gebe Rückmeldung wie es lief :)

AW: Dann so
18.12.2014 16:37:47
Marv
Das klappt irgendwie nicht. Ich verstehe es so:
lZ ist die Länge, also die Anzahl der beschriebenen Spalten.?
(War es bei Sheets(1) so, dass das Erste Tabellenblatt gemeint ist und Worksheets("Name") es namentlich anspricht?)
Dann nimmst du einen Counter der so lange hochgezählt wird bis die Anzahl der benutzen Spalten erreicht ist.
Mir ist leider nicht klar was SWN ist, du speicherst auf jeden Fall die Zellenwerte aus der 1 Zeile in der 2ten Spalte drin.
In Status machst du das gleiche nur für die 3te Spalte.
Jetzt setzt du Z1 auf 2 was bedeutet er soll in der 2ten Zeile anfangen zu suchen.
Die Do While Schleife prüft ob an der 2ten Stelle in der 2 Spalte nicht das gleiche wie in der 2 Spalte an 1ter Stelle steht, solange wird z1 inkrementiert.
Die Schleife prüft ob der der Status ungleich dem "nicht Erlaubt" ist und wenn ja soll er an die Stelle Z1 in der Ersten Spalte einen Vermerk "löschen" schreiben. Die Else Bedingung macht das gleiche nur an der Stelle i. Am Ende wird geguckt welche Zeilen in Spalte 1 eine Markierung "löschen" haben und dann wird an der Stelle die komplette Zeile gelöscht.
Hab ich das soweit richtig verstanden ?
Unklar ist mir irgendwie auf welcher Spalte die Loop Anweisung sucht...

Anzeige
AW: Dann so
18.12.2014 16:56:50
Marv
Sorry das ich hier 3mal hintereinander poste..Also ich hab es jetzt mal mit dem Worksheets("name") abgeändert. Jetzt hab ich die Funktion hinter einen Button gepackt und in der Theorie sollte nach dem Knopfdruck automatisch aussortiert werden. Bei mir löscht er aber bei jedem Knopfdruck nun die oberste Zeile, das Ganze geht solange bis die Tabelle leer ist.

Erklärungen
18.12.2014 17:27:51
Frank
Hallo,
1) ja, statt Sheets(1) kann man auch Sheets("DeinName") schreiben. Wenn Du nur auf diesem Blatt arbeitest, kannst Du das auch komplett weglassen.
2)lZ steht für 'letzte Zeile'
3)SWN steht für SoftWareName. Ich gucke in der ersten Zeile nach dem Softwarenamen und suche dann solange nach unten, bis der wieder auftritt. Dann wird in die erste Spalte (in Deinem Beispiel leer) vor den Eintrag, der nicht "nicht Erlaubt" als Status hat der Tag "löschen" geschrieben.
4) Der Schleifenzähler (i) wird eins hochgesetzt, das heisst, ich mache die gleiche Prozedur jetzt mit dem Softwarenamen aus der zweiten Zeile.
5) Nachdem alle Zeilen abgearbeitet sind, werden die Zeilen gelöscht, in denen in Spalte 1 "löschen" vermerkt ist.
6) i sthet während des Programmablaufs für die Zeile, aus der der Vergleichswert genommen wird (For...Next). Z1 ist die Zeile mit der aktuell verglichen wird (Do...Loop). Dementsprechend wird "löschen" entweder in die Zeile mit dem Vergleichswert geschrieben, oder in die aktuell verglichene. Verglichen werden die Einträge inSpalte 2 (Softwarename), erkenn bar an cells(Zeile,Spalte).value.
Der von mir gepostete Code war einfach im Antwortformular eingetippt und nicht getestet. Deinem Post hatte ich entnommen, dass Dir Programmierung und Debugging nicht komplett fremd sind und demzufolge gehofft, dass Du damit und eventuellen Bugs zurechtkommst. Ich schau mir's aber jetzt nochmal dahingehend an und teste es evtl. mit Deiner Beispieltabelle - wobei da eben kein Status "nicht Erlaubt" drin vorkommt, was die Sache etwas schwierig macht.
Grüsse,
Frank

Anzeige
AW: Erklärungen
18.12.2014 17:33:38
Marv
Vielen Dank schonmal, ich habe den Code für meine Tabelle angepasst.

lZ = Worksheets("Results").Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To lZ
SWN = Worksheets("Results").Cells(i, 2).Value
Status = Worksheets("Results").Cells(i, 3).Value
Z1 = 1
Do While Not Worksheets("Results").Cells(Z1, 2).Value = SWN
Z1 = Z1 + 1
Loop
If Not Status = "checked by PeacyPackages" Then
Worksheets("Results").Cells(Z1, 1).Value = "löschen"
Else
Worksheets("Results").Cells(i, 1).Value = "löschen"
End If
Next
For i = lZ To 1 Step -1
If Worksheets("Results").Cells(i, 1).Value = "löschen" Then
Worksheets("Results").Cells(i, 1).EntireRow.Delete
End If
Next
Ich lade jetzt nochmal eine Tabelle hoch, damit wir an der gleichen arbeiten, diese ist jetzt 1 zu 1 an meine reale Situation angepasst.
https://www.herber.de/bbs/user/94489.xlsx

Anzeige
Neue Version
18.12.2014 18:03:25
Frank
... ja, das konnte so nicht funktionieren.
Hier jetzt eine Version, die mit Deiner ersten Mappe für mich plausible Ergebnisse liefert:
Sub test()
lZ = Sheets(1).UsedRange.Rows.Count
For i = 1 To lZ
SWN = Sheets(1).Cells(i, 2).Value
Z1 = i + 1
Do While Z1 

Mit Deiner neuen Mappe kann ich leider nichts anfangenda dort weder ein Blatt "Results" drin vorkommt, noch ein Status "checked by PeacyPackages".
Grüsse,
Frank

AW: Neue Version
19.12.2014 09:07:25
Marv
Hallo Frank,
vielen Dank für dein Mühe, ich habe versehntlich das falsche Blatt hochgeladen. Damit du es auch hast lade ich es nochmal hoch. Ich versuche das jetzt mal auf meine Mappe anzupassen, bin auch zuversichtlich ;)
Danke nochmal
https://www.herber.de/bbs/user/94499.xlsx

Anzeige
AW: Neue Version
19.12.2014 10:07:56
Marv
Also es funktioniert fast richtig, mir ist nur aufgefallen das der Suchstring für Status keine Rolle spielt. Ich bekomme immer die gleichen Ergebnisse wenn ich "weiter prüfen" ab ändere, werden immer die gleichen SWN markiert. Leider fehlt oft ein SWN bei der Markierung. Ich probiere es weiter :)
Auf dem Bild fehlt die Markierung für den Eintrag "Engineering Client Viewer 7.0" mit dem Status "Pending..." (In dem Versuch habe ich den Status für den Suchstring auf "checked by PeacyPackages" gesetzt)
Userbild
Danke :)

Anzeige
Status verlorengegangen...
19.12.2014 10:30:38
Frank
Hallo,
irgendwie ist bei der neuen Version der Status verlorengegangen. Hier ein neuer Versuch:
Sub test()
lZ = Sheets("Results").UsedRange.Rows.Count
For i = 1 To lZ
SWN = Sheets("Results").Cells(i, 2).Value
Z1 = i + 1
Do While Z1 
Grüsse,
Frank

AW: Status verlorengegangen...
19.12.2014 10:39:33
Marv
Das macht im Ersten Anlauf leider gar nichts...es markiert auch nichts.

Bei mir schon...
19.12.2014 11:36:18
Frank
Zum Vergleich meine Datei
https://www.herber.de/bbs/user/94508.xls
Makro ausführen - die Positionen mit 'Rejected' und 'Need2BChecked' sind gelöscht. Letzteres, wie in anderen Beitrag beschrieben, müsste ggf. noch angepasst werden.
Die Codestruktur sollte aber nicht so kompliziert sein, dass Du die nicht durchschaust. Ist ja doch recht ähnlich zu Java, für jemanden, der eigentlich aus der Java Programmierung kommt.
Trotzdem nochmal der grundlegende Ablauf:
    Do While Z1 

Der i-te Eintrag der Liste wird mit den folgenden verglichen. Stimmt der Softwarename überein, wird dieSchleife verlassen, in Z1 steht die Zeilennummer.
    If Z1 

Ist nach Verlassen des Loops Z1 kleiner als die maximale Zeilennummer, wurde der Loop vorzeitig beendet, das heisst, ein doppelt auftretender SWN wurde gefunden. Diejenige Zeile, deren Status nicht "checked by PeacyPackages" ist, wird mit 'löschen' in Spalte 1 markiert (das können auch beide sein).
Anschliessend werden alle markierten Zeilen gelöscht.
Grüsse,
Frank

Anzeige
Unklarer Status 'Pending' vs. Need2BChecked
19.12.2014 10:37:45
Frank
In meiner Version wird allerdings für 'FinalSecure Secure Mail x64' der Eintrag 'Need2BChecked' gelöscht (dito bei 'Quality Center Client Side'). Was ist da der Unterschied zu 'Pending...'? Nach meinem Verständnis ist das das Gleiche.
Das warauch so nicht aus dem Ursprungsposting erkennbar. Da muss der Code noch weiter angepasst werden.
Grüsse,
Frank

AW: Unklarer Status 'Pending' vs. Need2BChecked
19.12.2014 10:44:27
Marv
Need2BChecked ist ein visierter Status der auf einer anderen "Liste" steht. Pending bedeutet es gibt keinen Standardvergleichswert...es ist also der Bezeichnung geschuldet das es ähnlich wirkt. Es ist aber ein Unterschied, Pending muss immer weiter "per Hand" unterucht werden.

Anzeige
AW: Unklarer Status 'Pending' vs. Need2BChecked
19.12.2014 11:21:35
Marv

Sub Peacy()
lZ = Sheets("Results").UsedRange.Rows.Count
For i = 1 To lZ
SWN = Sheets("Results").Cells(i, 2).Value
Z1 = i + 1
Do While Z1 
Mit dem Effekt das er leider nicht bei Pending löscht sonder bei Need2BChecked :/
Userbild

Ergebnis unklarer anfänglicher Fragestellung
19.12.2014 11:41:40
Frank
Hallo,
tja, wenn man die Tabelle mit Deiner ursprünglich geposteten vergleicht, sind die ja doch recht unterschiedlich... Dein ursprünglicher Post sprach von 3 möglichen Kategorien, hier sind es jetzt 4. Das muss natürlich Auswirkungen auf den Code bzw. die Funktionalität haben. Aber wie in meinem anderen Post geschrieben, kriegst Du das sicher hin, weil das ja nichts mit XL zu tun hat, sondern mit der Programmstruktur.
Grüsse,
Frank

AW: Ergebnis unklarer anfänglicher Fragestellung
19.12.2014 12:55:33
Marv

Hey, danke für deine Geduld...
Ich verstehe schon was es macht, ich verstehe nur nicht wie ich zum Beispiel eine Art Switch  _
Case einbauen kann. Das war meine Idee, ich wollte halt durchlaufen mir merken welche aus der Liste doppelt zu "checked by PeacyPackages" sind und dann mit switch Case entscheiden was passieren soll.
Case Status = "Rejected"
-> löschen
Case Status = "Need2BChecked"
-> löschen
Aber das scheint der falsche Ansatz zu sein.
Ich gebe dir Recht ich habe die Grundfrage geändert. Aber bei deinem Programmcode löscht er mir  _
eben auch nicht aus Pending...sondern aus Rejected.
Am Ende muss ich doch jetzt noch eine Schleife einbauen die überprüft ob da jetzt noch " _
Rejected" oder "Pending..:" oder sonst was steht.
Bin ich auf dem falschen Weg? 

SELECT CASE ist auch gut
19.12.2014 13:49:18
Frank
...speziell bei mehr als 3 Auswahlmöglichkeiten.
Hallo nochmal (bin dann weg bis nächstes Jahr),
https://www.herber.de/bbs/user/94514.xls
Aber ich glaube, das ist prinzipiell kein guter Ansatz. Besser wäre, für jede Kategorie ein extra Blatt anzulegen und die Zeilen entsprechend in das jeweilige Blatt zu kopieren. Danach wahlweise im Blatt 'Results' alskopiert markieren oder ganz löschen.
Der Vorteil: Du hast eine 'History'. Du weisst also, was schonmal gecheckt wurde. Da können dann auch noch zusätzliche Infos erfasst werden. Am Ende hat man fast sowas wie eine Datenbank.
Grüsse,
Frank

AW: SELECT CASE ist auch gut
19.12.2014 14:01:23
Marv
Ok, vielen Dank und Guten Rutsch.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige