Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA Wert suchen - dann anderen Wert einfügen

VBA Wert suchen - dann anderen Wert einfügen
15.07.2014 09:34:52
Josef
Hallo Liebe Gemeinde,
ich habe mal wieder ein Problem, das ich gerne über einen VBA lösen möchte, da diese Formel die meiste Zeit an Berechnung in Anspruch nimmt.
Ich habe zwar eine Lösung per WENN-Formel, allerdings dauert die Berechnung ewig, da die Excel tausende von Zeilen hat und es bereits schon viele Formeln zu berechnen gibt.
Der VBA-Code sollte folgendes lösen:
Es soll geprüft werden, ob die Zahl in "Spalte C" in der "Spalte A" vorkommt. Wenn das so ist, dann soll in der "Spalte E" in jeder Zeile wo die Zahl aus "Spalte C" in der "Spalte A" vorkommt eine 1 eingetragen werden. Danach soll geprüft werden, ob die Zahl in "Spalte D" in der "Spalte A" vorkommmt. Erneut soll dann in der "Spalte E" in jeder Zeile wo die Zahl aus "Spalte D" in der "Spalte A" vorkommt eine 2 eintragen. Wenn die Zahl aus "Spalte A" weder in der "Spalte C" oder "Spalte D" vorkommt, dann soll überall eine 3 stehen.
Wäre super wenn Ihr mir helfen könnt. Anbei ein Muster:
https://www.herber.de/bbs/user/91506.xlsx

Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Wert suchen - dann anderen Wert einfügen
15.07.2014 10:17:01
B.Simpson
Hallo Josef,
ein Ansatz:
Sub zahlenspalte()
Dim wks As Worksheet
Set wks = ActiveWorkbook.ActiveSheet
Dim x As Long, y As Long
x = wks.Cells(Rows.Count, 2).End(xlUp).Row
Application.ScreenUpdating = False
With wks
For y = 3 To x
If Application.CountIf(.Columns(3), .Cells(y, 1)) > 0 Then
wks.Cells(y, 5) = 1
ElseIf Application.CountIf(.Columns(4), .Cells(y, 1)) > 0 Then
wks.Cells(y, 5) = 2
ElseIf Application.CountIf(.Columns(3), .Cells(y, 1)) = 0 And Application.CountIf(.Columns(4),  _
.Cells(y, 1)) = 0 Then
wks.Cells(y, 5) = 3
End If
Next y
End With
Application.ScreenUpdating = True
End Sub
MfG Christian

Anzeige
AW: VBA Wert suchen - dann anderen Wert einfügen
15.07.2014 10:29:37
Josef
Hallo Christian,
sowas nennst du Ansatz? Das ist ja schon perfekt. Werde es gleich mal an meine große Excel-Tabelle anpassen (vorausgesetzt ich bekomme das hin).
Jedenfalls bedanke ich mich schon mal. Gebe später noch ein Feedback.

AW: VBA Wert suchen - dann anderen Wert einfügen
15.07.2014 11:24:28
Josef
Hallo Christian,
es funktioniert tadellos. Allerdings sind die Berechnungen nicht viel schneller geworden. Dann muss es wohl noch eine weitere Formel geben die meinen Rechner kpl. auslastet (an der Hardware kann es nicht liegen. Ich habe einen Intel I7 3,5 Ghz und 16 GB Ram).
Trotzdem danke für deine Hilfe. Es ist zwar nur minimal schneller geworden, aber immerhin etwas :-)

Anzeige
Vielleicht ist das schneller?
15.07.2014 12:23:25
EtoPHG
Hallo Josef,
Probier mal, ob das schneller ist:
Sub Pruefung()
Dim lRow As Long, l As Long
With ThisWorkbook.Worksheets("Tabelle1")
With .Range(.Cells(3, 5), .Cells(.Rows.Count, 2).End(xlUp).Offset(0, 3))
.Formula = "=3-IFERROR((MATCH(A3,D:D,0)>0)*1,0)-IFERROR((MATCH(A3,C:C,0)>0)*2,0)"
.Value = .Value
End With
End With
End Sub
Gruess Hansueli

Anzeige
AW: Vielleicht ist das schneller?
15.07.2014 12:32:07
Nepumuk
Hallo Hansueli,
vielleicht bringt es was wenn du vorher die automatische Berechnung in Excel ausschaltest, dann nur die Zellen mit der Formel berechnest bevor du sie durch ihre Werte ersetzt? Nur mal so in den Raum gestellt:
Sub Pruefung()
With Application
.Calculation = xlCalculationManual
.EnableEvents = False
.ScreenUpdating = False
End With
With ThisWorkbook.Worksheets("Tabelle1")
With .Range(.Cells(3, 5), .Cells(.Rows.Count, 2).End(xlUp).Offset(0, 3))
.Formula = "=3-IFERROR((MATCH(A3,D:D,0)>0)*1,0)-IFERROR((MATCH(A3,C:C,0)>0)*2,0)"
.Calculate
.Value = .Value
End With
End With
With Application
.Calculation = xlCalculationAutomatic
.EnableEvents = True
.ScreenUpdating = True
End With
End Sub

Gruß
Nepumuk

Anzeige
AW: Vielleicht, vielleicht auch nicht ;-)
15.07.2014 13:35:36
EtoPHG
Hallo Max,
Ich hab mir das beim Schreiben des Codes auch überlegt, bin dann aber davon abgekommen.
Die MATCH-Funktion sollte zudem schneller sein, als die COUNTIF's vom vorherigen Vorschlag und das Setzen der Formel für die ganze Range müsste schon wesentlich schneller sein, als jede einzelnen Zelle anzufassen. Es könnte natürlich durchaus sein, dass noch Dependicies zur Spalte E (in die die Formel geschrieben wird) dann würde nach dem Ablauf des Codes ev. ein Recalulate der ganzen Mappe ausgelöst werden und vielleicht liegt ja dort der vom Anfrager erwähnte Hund begraben.
Gruess hansueli

Anzeige
AW: Vielleicht, vielleicht auch nicht ;-)
15.07.2014 14:06:31
Nepumuk
Hallo Hansueli,
es ist wie immer. Ohne die Mappe schwer zu sagen wo er verbuddelt ist.
Gruß
Nepumuk

AW: Wenn schnell, dann Sortieren und mit SVerweis
16.07.2014 00:48:45
Daniel
Hi
ich tippe mal auf grosse Datenmengen, dann ist Match mit 3. Parameter = 0 recht langsam, vorallem wenn es wenig fundstellen gibt und dann immer die ganze Spalte durchsucht werden muss.
ich würde ihr erstmal die Spalten C und D an eine freie Stelle der Tabelle kopieren, um sie dort zu sortieren und dann die Prüfung mit der schnellen Variante des SVerweises durchführen (4. Parameter = 1)
(man könnte zwar auch in der Tabelle sortieren, aber ich vermute, das ist nicht erwünscht):
ich kopiere hier die Werte in die Spalten AA und AB (27 und 28), die sollten frei sein, falls nicht, hierfür im Code andere Spalten verwenden (Anpassung bei den Formeln nicht vergessen)
Sub Test()
Dim letzteZeile As Long
letzteZeile = Cells(Rows.Count, 1).End(xlUp).Row
Range("C3:D" & letzteZeile).Copy
Cells(2, 27).PasteSpecial xlPasteValues
Cells(1, 27) = WorksheetFunction.Min(Range("A3:A" & letzteZeile)) - 1
Cells(1, 28) = Cells(1, 27)
Columns(27).Sort key1:=Cells(1, 27), order1:=xlAscending, Header:=xlNo
Columns(28).Sort key1:=Cells(1, 28), order1:=xlAscending, Header:=xlNo
With Range("E3:E" & letzteZeile)
.FormulaR1C1 = "=3-2*(VLookUp(RC1,C27,1,1)=RC1)-1*(VLookUp(RC1,C28,1,1)=RC1)"
.Formula = .Value
End With
Columns(27).Resize(, 2).ClearContents
End Sub
Gruß Daniel

Anzeige
AW: Vielleicht, vielleicht auch nicht ;-)
17.07.2014 10:02:29
Josef
Hallo Zusammen,
so Viele Möglichkeiten. Ich habe nun alle ausprobiert und die Lösung von Nepumuk war am besten. Es ist dennoch nicht erheblich schneller geworden. An der großen Datenmenge kann es nicht liegen. Ich vermute eher, dass es an der Anzahl aller Formeln liegt. Ich hätte das ja gerne alles über VBA gesteuert, allerdings bin ich absoluter VBA Anfänger und die Liste ist wirklich komplex. Ich würde am liebsten die Liste hier mal hochladen, allerdings ist es möglich, da die Datei über 10MB groß ist. Und selbst wenn ich eine abgespeckte Version hochladen würde, dann müsste sich einer von euch sehr viel Zeit investieren um alles über VBA abzuwickeln und das möchte ich keinem antun. Trotzdem bedanke ich mich bei allen die sich die Zeit dafür genommen.

Anzeige
AW: Vielleicht, vielleicht auch nicht ;-)
17.07.2014 16:02:56
Daniel
da müsstest du erstmal prüfen, ob die lange Laufzeit durch die Aktion selbst erzeugt wird oder dadurch, dass auf dem Blatt noch viele Formeln vorhanden sind, die sich auf die Ergebniszellen beziehen und dann jedesmal neu berechnet werden.
Gruß Daniel
;

Forumthreads zu verwandten Themen

Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

VBA zur Wertsuche und Ergebniszuweisung in Excel


Schritt-für-Schritt-Anleitung

  1. Öffne Excel und öffne das VBA-Editor-Fenster mit ALT + F11.

  2. Füge ein neues Modul hinzu:

    • Klicke mit der rechten Maustaste auf einen Eintrag im Projektfenster und wähle Einfügen > Modul.
  3. Kopiere den VBA-Code in das Modul. Hier ist ein Beispiel, das die Anforderungen von Josef erfüllt:

    Sub zahlenspalte()
       Dim wks As Worksheet
       Set wks = ActiveWorkbook.ActiveSheet
       Dim x As Long, y As Long
       x = wks.Cells(Rows.Count, 2).End(xlUp).Row
       Application.ScreenUpdating = False
       With wks
           For y = 3 To x
               If Application.CountIf(.Columns(3), .Cells(y, 1)) > 0 Then
                   wks.Cells(y, 5) = 1
               ElseIf Application.CountIf(.Columns(4), .Cells(y, 1)) > 0 Then
                   wks.Cells(y, 5) = 2
               Else
                   wks.Cells(y, 5) = 3
               End If
           Next y
       End With
       Application.ScreenUpdating = True
    End Sub
  4. Führe das Skript aus:

    • Drücke F5 oder gehe zu Run > Run Sub/UserForm.

Häufige Fehler und Lösungen

  • Fehler: "Laufzeitfehler 1004"
    Lösung: Überprüfe, ob die Spalten C und D Daten enthalten. Dieser Fehler tritt auf, wenn auf leere Zellen zugegriffen wird.

  • Fehler: Keine Werte in Spalte E
    Lösung: Stelle sicher, dass die Zahlen in Spalte A korrekt sind und überprüfe die Datentypen. Zahlen sollten als solche formatiert sein, nicht als Text.


Alternative Methoden

Eine alternative Methode zur Wertzuweisung könnte die Verwendung von WorksheetFunction sein, um die Geschwindigkeit zu verbessern. Hier ein Beispiel:

Sub Pruefung()
    Dim lRow As Long
    With ThisWorkbook.Worksheets("Tabelle1")
        lRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        .Range("E3:E" & lRow).Formula = "=IF(ISNUMBER(MATCH(A3,C:C,0)),1,IF(ISNUMBER(MATCH(A3,D:D,0)),2,3))"
        .Range("E3:E" & lRow).Value = .Range("E3:E" & lRow).Value
    End With
End Sub

Diese Methode könnte besonders effektiv sein, wenn Du in einer großen Tabelle arbeitest.


Praktische Beispiele

Hier ist ein Beispiel, das Du für Deine Excel-Tabelle verwenden kannst:

  1. Tabelle anlegen mit den folgenden Spalten:

    • A: Werte zur Prüfung
    • C: Vergleichswerte
    • D: Zweiter Vergleich
    • E: Ergebnis
  2. Füge den oben genannten VBA-Code in das Modul ein und führe es aus, um die Ergebnisse in Spalte E zu populieren.


Tipps für Profis

  • Automatische Berechnung deaktivieren: Wenn Du mit großen Datenmengen arbeitest, deaktiviere die automatische Berechnung vor der Ausführung des Codes, um die Leistung zu verbessern:

    Application.Calculation = xlCalculationManual
  • Verwende Range effizient: Arbeite mit gesamten Bereichen anstelle von einzelnen Zellen, um die Ausführungsgeschwindigkeit zu erhöhen.


FAQ: Häufige Fragen

1. Wie kann ich den VBA-Code anpassen, um mehr Spalten zu prüfen?
Du kannst zusätzliche ElseIf-Bedingungen hinzufügen, um mehr Spalten zu berücksichtigen.

2. Warum läuft mein Code langsam?
Das kann an der Anzahl der Formeln in deiner Excel-Datei liegen. Versuche, die Berechnung auf einen bestimmten Bereich zu beschränken und unnötige Formeln zu entfernen.

3. Wie speichere ich meine Arbeit?
Speichere Deine Excel-Datei als .xlsm, um den VBA-Code zu behalten.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige