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

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

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

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

326 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige