Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1700to1704
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
Vergleich von 2 Spalten
16.07.2019 08:01:17
2
Guten Morgen!
Ich habe ein Problem beim Vergleich von 2 Spalten und weiß nicht, wie ich das elegant lösen kann.
Ich prüfe, ob eine Fragennummer bereits in dem anderen Tabellenblatt vorkommt - nun habe ich aber das Problem, dass z.B. die Frage "5.10" schon da ist und somit die Frage "5.1" nicht mehr kopiert wird:
Option Explicit
Sub Zusammenfassung()
Dim WS1 As Worksheet
Dim WS2 As Worksheet
Dim Flag As Long
Dim Frage_Nr As Long
Dim Erste_Frage As Long
Dim iZeile As Long
Dim tempZeile As Long
Dim Frage_Nr_ZF As Long
Set WS1 = Worksheets("Tabelle1")
Set WS2 = Worksheets("Tabelle2")
Flag = Range("Flag").Column
Frage_Nr = Range("Frage_Nr").Column
Erste_Frage = Range("Erste_Frage").Row
Frage_Nr_ZF = Range("Frage_Nr_ZF").Column
For iZeile = WS1.Cells(WS1.Rows.Count, Flag).End(xlUp).Row To Erste_Frage Step -1
If WorksheetFunction.CountIf(WS2.Columns(Frage_Nr_ZF), WS1.Cells(iZeile, Frage_Nr)) = 0 And  _
_
WS1.Cells(iZeile, Flag) = "x" Then
If tempZeile = 0 Then
tempZeile = 3
Else
tempZeile = tempZeile + 1
End If
WS2.Cells(tempZeile, Frage_Nr_ZF) = WS1.Cells(iZeile, Frage_Nr)
WS2.Cells(tempZeile, Frage_Nr_ZF + 1) = WS1.Cells(iZeile, Frage_Nr + 1)
End If
Next iZeile
End Sub

Wäre super, wenn mir jemand einen Tipp geben könnte, denn ich will nicht die Fragen mit "5.01, 5.02, ..." durchnummerieren müssen...
Anbei auch noch das Testfile: https://www.herber.de/bbs/user/130923.xlsm
Danke!
Lg,
Chrisi

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

Betreff
Datum
Anwender
Anzeige
Countif als Formel vs. in VBA
16.07.2019 14:45:19
cH_rI_sI
Niemand eine Idee? Es liegt ja am Countif, welches unter VBA nicht richtig funktioniert (gibt 1 statt 0 zurück), jedoch als Formel schon...
AW: Warum sollte Countif als WorksheetFunction (VBA) …
16.07.2019 16:28:19
peterk
Hallo Luc
VBA erkennt 5.1 als Zahl (5,1) und macht dann einen Binär Vergleich (5,1 = 5,10). Im Worksheet wird aber 5.1 als Text behandelt und somit liefert die Formel das richtige Ergebnis ("5.1" ungleich "5.10"). Wenn man den Test umkehrt und die Kapitel "5,1" bzw. "5,10" benennt verhält es sich genau umgekehrt (VBA liefert 1, Formel aber 2)
AW: Warum sollte Countif als WorksheetFunction (VBA) …
16.07.2019 18:34:52
cH_rI_sI
Hi Luc,
wie von Peter angemerkt, vergleicht VBA beim Countif "5.1" als Zahl statt Text...
Lg
Das ist eine Eigenschaft dieser Fktt, weil MS ...
16.07.2019 19:46:53
Luc:-?
…HptArgument und Vglswert(e) getrennt hat, Leute,
um sich die Arbeit zu erleichtern. Dadurch kommt es schon bei ZellFmln zu Ungereimtheiten und bei der WorksheetFunction zu zusätz­lichen durch die generelle Umwandlung von Text in Zahl, wann immer möglich. Das kann man nur durch die explizite Kennzeichnung des Vglsbegriffs als Text verhindern, was aber nicht mit einem TextPräfix, sondern anscheinend nur mit (hier) vorangestelltem * mög­lich ist → Bsp: WorksheetFunction.CountIf(Selection, "*5.1")
Natürlich ist das nur sinnvoll, wenn die HptGliederung nur von 1 bis 10 läuft. Ansonsten ist man gut beraten, wenn man Gliederungs­pktt, die mehrstellig wdn können, von Anfang an mit einer entsprd Anzahl von Vornullen bildet. Hier würde man sich die ganze Nach­Pro­grammierung sparen, obwohl die ~WENNs-Fktt, auf Grund ihrer zahlreichen Anwendungseinschränkungen, die eigentlich verdient hät­ten. Aber, ob die resultierende UDF dann ebenso schnell wäre…?
Gruß, Luc :-?
Anzeige
AW: Das ist eine Eigenschaft dieser Fktt, weil MS ...
17.07.2019 07:11:01
cH_rI_sI
Danke für den Hinweis mit dem vorangestellten *
Lg
AW: Das ist eine Eigenschaft dieser Fktt, weil MS ...
17.07.2019 07:11:03
cH_rI_sI
Danke für den Hinweis mit dem vorangestellten *
Lg
AW: Das ist eine Eigenschaft dieser Fktt, weil MS ...
17.07.2019 07:12:06
cH_rI_sI
Danke für den Hinweis mit dem vorangestellten *
Lg
Bitte sehr! ;-) owT
17.07.2019 13:21:41
Luc:-?
:-?
mit dem vorangestellten "*" wär ich vorsichtig
17.07.2019 13:37:58
Daniel
denk mal daran, was passiert, wenn weitere Punkte hinzukommen wie 15.1
dann hast du mit dem "*" das gleiche Problem wieder, dass die Suche nach "*5.1" einen Treffer ergibt, wenn in der Liste schon ein "15.1" steht.
du solltest hier Application.Match verwenden, um zu prüfen ob der Wert schon in der Liste steht oder nicht.
dh ersetze dein Worksheetfunction.CountIf(...)=0
durch VarType(Application.Match(WS1.Cells(iZeile, Frage_Nr), WS2.Columns(Frage_Nr_ZF), 1)) = vbError
Gruß Daniel
Anzeige
Diese Einschränkung hatte ich genannt! :-| owT
18.07.2019 02:58:37
Luc:-?
:-?
Ja, aber keine brauchbare Lösung für das Problem
18.07.2019 06:48:01
Daniel
benannt.
Gruß Daniel
AW: 2h nach mir das gleiche - immerhin!
18.07.2019 09:52:17
GerdL
.
AW: 2h nach mir das gleiche - immerhin!
18.07.2019 11:26:31
Daniel
dann hab ich dich wohl übersehen.
Gruß Daniel
Wozu auch? War doch nur 'ne Replik ...
18.07.2019 13:09:47
Luc:-?
…auf vorhergehende AWen, Daniel,
um etwas zu zeigen, was sicher kaum bekannt war/ist und auch bei ZellFmln, falls erforderlich, eingesetzt wdn könnte. Außerdem gab's eine allgemeine Gliederungspkt-Gestaltungsempfehlung, durch die solche Fehler vermieden wdn können. Die würde ich auch bevor­zu­gen, da die ~WENNs-Fktt in ihrer simplen Konstruktion kaum mal zu überlisten sein wdn.
Alternative allgemeine Lösungen gab's ja schon und bei meiner letzten AW auch schon Gerds. Ansonsten hing die Brauchbarkeit meines Hinweises eben von den genannten Bedingungen ab — und die kennt nur Chris…
Gruß, Luc :-?
Anzeige
Countif als Formel vs. in VBA
16.07.2019 14:45:20
cH_rI_sI
Niemand eine Idee? Es liegt ja am Countif, welches unter VBA nicht richtig funktioniert (gibt 1 statt 0 zurück), jedoch als Formel schon...
AW: Countif als Formel vs. in VBA
16.07.2019 14:52:11
Andy
Option Explicit
Sub Zusammenfassung()
Dim WS1 As Worksheet
Dim WS2 As Worksheet
Dim Flag As Long
Dim Frage_Nr As Long
Dim Erste_Frage As Long
Dim iZeile As Long
Dim tempZeile As Long
Dim Frage_Nr_ZF As Long
Set WS1 = Worksheets("Tabelle1")
Set WS2 = Worksheets("Tabelle2")
Flag = Range("Flag").Column
Frage_Nr = Range("Frage_Nr").Column
Erste_Frage = Range("Erste_Frage").Row
Frage_Nr_ZF = Range("Frage_Nr_ZF").Column
'Lösche den Bereich für die Fragen
WS2.Rows("3:100").Delete
'Alle Fragen durchgehen
For iZeile = Erste_Frage To WS1.Cells(Rows.Count, Frage_Nr).End(xlUp).Row
'Prüfen ob Flag gesetzt ist
If WS1.Cells(iZeile, Flag) = "x" Then
'Erste freie Zeile in WS2 bestimmen
tempZeile = WS2.Cells(Rows.Count, 1).End(xlUp).Row + 1
'Fragen eintragen
WS2.Cells(tempZeile, Frage_Nr_ZF) = WS1.Cells(iZeile, Frage_Nr)
WS2.Cells(tempZeile, Frage_Nr_ZF + 1) = WS1.Cells(iZeile, Frage_Nr + 1)
End If
Next iZeile
End Sub

Anzeige
AW: Countif als Formel vs. in VBA
16.07.2019 18:32:20
cH_rI_sI
Ist in der Beispieldatei drinnen und ändert leider auch nichts...
Wie ohne Countif lösen?
16.07.2019 18:39:27
cH_rI_sI
Jemand eine Idee wie man das ohne Countif lösen könnte? Brauche ich ja nur um nicht doppelt zu kopieren falls das Marko nochmals läuft...
AW: Wie ohne Countif lösen?
16.07.2019 23:56:39
Andy
Hast Du meine Antwort von heute Nachmittag probiert? Das ist eine Lösung ohne Countif, die Du so oft laufen lassen kannst wie Du möchtest. Einfach Dein "x" Flag setzen, Code kaufen lassen,fertig.
AW: Vergleich von 2 Spalten
17.07.2019 11:43:52
2
Moin
Sub Zusammenfassung_3()
Dim WS1 As Worksheet
Dim WS2 As Worksheet
Dim Flag As Long
Dim Frage_Nr As Long
Dim Erste_Frage As Long
Dim iZeile As Long
Dim tempZeile As Long
Dim Frage_Nr_ZF As Long
Set WS1 = Worksheets("Tabelle1")
Set WS2 = Worksheets("Tabelle2")
Flag = Range("Flag").Column
Frage_Nr = Range("Frage_Nr").Column
Erste_Frage = Range("Erste_Frage").Row
Frage_Nr_ZF = Range("Frage_Nr_ZF").Column
For iZeile = WS1.Cells(WS1.Rows.Count, Flag).End(xlUp).Row To Erste_Frage Step -1
If IsError(Application.Match(WS1.Cells(iZeile, Frage_Nr), WS2.Columns(Frage_Nr_ZF), 0)) And  _
_
WS1.Cells(iZeile, Flag) = "x" Then
tempZeile = WS2.Cells(WS2.Rows.Count, Frage_Nr_ZF).End(xlUp).Row + 2
WS2.Cells(tempZeile, Frage_Nr_ZF) = WS1.Cells(iZeile, Frage_Nr)
WS2.Cells(tempZeile, Frage_Nr_ZF + 1) = WS1.Cells(iZeile, Frage_Nr + 1)
End If
Next iZeile
End Sub

Gruß Gerd
Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige