sverweis oder vba
Hallo an alle,
ich habe ein Blatt "Stammdaten" in dem alle Daten gesammelt sind. Nunmöchte ich in einer separaten Tabelle nach Eingabe der Artikel-Nr. die Bezeichnung, Preis usw. erscheint. Ich spreche hier von ca. 2000 Artikeln, also jede Menge "sverweise". Mit "sverweis" ist das kein Problem, nur ich finde, zu viele "sverweise" machen die Datei langsam, deshalb meine Frage, geht es per vba vielleicht schneller? Wenn ja, gibt es vielleicht schon Vorlagen oder Beispiele die man verwenden könnte?
Mit dem "Macrorecorder" habe ich schon experimentiert, doch leider mache ich da was falsch, der Erfolg bleibt aus.
Vielleicht interessiert jemand, wie ich meinen Befehl geschrieben habe:
SVERWEIS(A4;Stamm!$K:$L;2;0)
Diesen Befehl hätte ich dann für jede, benötigte Information eingegeben.
Vielleicht hat aber jemand eine bessere Idee.
Vielen Dank schon mal.
Gruß
Karlheinz
Antwort schreiben
Antwort 1 von rainberg vom 28.12.2019, 19:10 Options
HalloKarl-Heinz,
Du kannst auch in VBA mit der Worksheetfunction Vlookup (entspricht SVERWEIS() )arbeiten.
Ein Makro auf Deine Angaben zugeschnitten, könnte so aussehen.
Option Explicit
Sub Preis_holen()
Dim ws1 As Worksheet, ws2 As Worksheet
Dim intI As Integer
Set ws1 = Worksheets("Stamm")
Set ws2 = Worksheets("Auswertung")
Application.ScreenUpdating = False
For intI = 4 To ws2.Range("A65536").End(xlUp).Row
ws2.Cells(intI, 2).Value = _
WorksheetFunction.VLookup(ws2.Cells(intI, 1), ws1.Range("K:L"), 2, 0)
Next
Application.ScreenUpdating = True
End Sub
Habe die Testdatei hier verlinkt.
http://www.netupload.de/detail.php?img=ad3fbd0ae1cc426ac447ce9c878b...Gruß
Rainer
Antwort 2 von Kalmi vom 28.12.2019, 19:51 Options
Hallo Rainer,
vielen Dank für deinen schnellen Vorschlag, funktioniert super. Nur für meine speziellen Zwecke, wäre es wichtig, dass nach jeder Eingabe einer Artikel-Nr. die jeweiligen Daten erscheinen. Dies dient der Kontrolle. Das ganze läuft auf eine Art Inventur ab. Kann man dies in deinem Vorschlag einbinden? Das wäre super, weil ich habe schon Versuche gemacht, mehrere Daten anzeigen zu lassen und siehe da, es klappt wunderbar, obwohl ich null Ahnung von vba habe. Sowas gefällt mir sehr.
Gruß
Karlheinz
Antwort 3 von rainberg vom 28.12.2019, 20:06 Options
Hallo Karl-Heinz,
anbei das geänderte Makro und die Testdatei
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws1 As Worksheet
Set ws1 = Worksheets("Stamm")
If Not Intersect(Target, Range("A:A")) Is Nothing Then
Target.Offset(0, 1).Value = _
WorksheetFunction.VLookup(Target.Value, ws1.Range("K:L"), 2, 0)
End If
End Sub
http://www.netupload.de/detail.php?img=69e902d16b661a11a52d14191346...Gruß
Rainer
Antwort 4 von Kalmi vom 28.12.2019, 21:12 Options
Hallo Rainer,
du bist der Größte. Jetzt funktioniert es genau so, wie ich es haben wollte. Vielen, vielen DANK.
Ich wünsche dir und deiner Familie einen guten Rutsch ins neue Jahr.
Viele Grüße aus Bayern
Karlheinz
Antwort 5 von Kalmi vom 29.12.2019, 22:22 Options
Hallo Rainer,
jetzt habe ich das nächste Problem, wenn ich die Daten, die automatisch hinzu gefügt worden sind, löschen will, geht er in den DEBUGGEN-Modus, wenn ich dann auf ABBRECHEN klicke, werden viele Zellen ausgefüllt mit #NV, die ich wieder löschen kann. Kann man den DEBUGGEN-Modus verhindern oder eine Option einbauen, daß man bestimmte Zellen bzw. Zeilen löschen kann? Ich weiß, ich bin nervig, doch an wen soll ich mich sonst richten, für dieses Problem gibt es bestimmt keinen anderen, der sich damit auskennt.
Grüße aus Bayern
Karlheinz
Antwort 6 von rainberg vom 30.12.2019, 00:07 Options
Hallo Karlheinz,
Zitat:
du bist der Größte
... das möchte ich mit Nachdruck zurück weisen.
Zitat:
Ich weiß, ich bin nervig
... nervig bist Du mit Sicherheit nicht, denn Foren sind zum Fragen da.
Zitat:
...für dieses Problem gibt es bestimmt keinen anderen, der sich damit auskennt.
... mit solchen Aussagen solltest Du vorsichtig sein, andere Hilfswillige könntest Du damit beleidigen.
Nun zum Problem, probier's mal damit.
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws1 As Worksheet
Set ws1 = Worksheets("Stamm")
On Error Resume Next
If Not Intersect(Target, Range("A:A")) Is Nothing Then
If Target.Value = "" Then Exit Sub
Target.Offset(0, 1).Value = _
WorksheetFunction.VLookup(Target.Value, ws1.Range("K:L"), 2, 0)
End If
End Sub
[/quote]
Gruß
Rainer[/quote]
Antwort 7 von Kalmi vom 30.12.2019, 10:24 Options
Hallo Rainer,
es liegt mir fern jemand zu beleidigen, ich dachte nur, ein Außenstehender weiß ja nicht alle Vorgänge somit der Gesamt-Überblick. Es war bestimmt nicht böse gemeint. Ich bin ja froh, wenn ich Hilfe bekomme.
Vielen Dank für die schnelle Hilfe, ich habe es getestet und es funktioniert, klasse. Vielen vielen Dank.
Gruß
Karlheinz
Antwort 8 von geek vom 14.04.2020, 01:19 Options
Hallo,
ich stehe vor demselben Problem. Leider funktionieren die Links zu den Testdateien nicht mehr.
Ich wäre euch sehr dankbar, wenn Ihr uns die Testdatei noch mal zur Verfügung stellen könntet.
Mit freundlichen Grüßen
geek
Antwort 9 von rainberg vom 14.04.2020, 13:46 Options
Hallo geek,
tut mit Leid, aber ich lösche alle selbst erstellten Testdateien von meinem Rechner, sobald das Problem des Fragestellers gelöst ist.
Eröffne doch bitte eine eigenen Thread mit unmissverständlicher Fragestellung oder einer Beispiel Deinerseits.
Gruss
Rainer
Antwort 10 von geek vom 14.04.2020, 23:55 Options
Hallo Rainberg,
leider führt die Suche bei google.de zu etlichen Seiten auf denen mein Problem geschildert, aber nicht behoben wird. Ein neuer Thread löst das Problem nicht.
Kalmi´s Anliegen trifft nun mal genau auf mich zu. Ich suche eine Beispieldatei in der eine Liste aus externen Daten (Preislisten im CSV oder Text Format) durch Eingabe der Artikelnummer Erstellt wird. Bei 60000 SVERWEISEN ist Excel 2007 nicht mehr zu gebrauchen. Deshalb suche ich nach einer Lösung in VBA, die mir die Datensätze zu der eingetragenen Artikelnummer liefert und den Wert einträgt, so dass ich mit dem Wert weiter arbeiten kann.
Ich denke mal, das Problem ist weit verbreitet. Mit einer entsprechenden Beispieldatei wäre mir und vermutlich auch vielen anderen schon geholfen, da mir der Umgang mit VBA sehr schwer fällt. Das Muster soll eine Hilfestellung sein, um zu sehen wie es auszusehen hat damit es überhaupt irgendwie funktioniert.
Folgende Dateien kommen bei mir dabei zum Einsatz:
- Preisliste vom Lieferanten (Quelldaten - wahlweise mit und ohne Spaltenüberschrift)
- Preisliste vom Shop-System mit vorgegebenen Spaltenüberschriften (soll per VBA mit den Daten aus der Quelldatei gefüllt werden)
- Kategorie-Produktzuweisung vom Shop-System (hierfür werden die Werte Der Spalte ‚ID‘ aus der Preisliste vom Shop-System benötigt, um die Produktzuweisung zur entsprechenden Kategorie zu realisieren.)
Mein SVERWEIS:
=WENN(ISTFEHLER(SVERWEIS('Preisliste\SVERWEIS\[Kategorie Produktzuweisung.csv]Kategorie Produktzuweisung'!B3;'Preisliste\SVERWEIS\[Quelldaten.csv]Quelldaten'!$1:$1048576;31;FALSCH));"";SVERWEIS('Preisliste\SVERWEIS\[Kategorie Produktzuweisung.csv]Kategorie Produktzuweisung'!B3;'Preisliste\SVERWEIS\[Quelldaten.csv]Quelldaten'!$1:$1048576;31;FALSCH))
Hoffentlich habe ich nix vergessen und es kann jemand helfen.
Vielen Dank schon mal!
Mit freundlichen Grüßen,
geek
Antwort 11 von rainberg vom 15.04.2020, 07:18 Options
Hallo geek,
Zitat:
Ein neuer Thread löst das Problem nicht.
...... ist aber erforderlich, da der alte Thread bereits abgeschlossen war und neue Fragen in neue Threads gehören.
Sicher ist auch Dein Problem per VBA lösbar, aber nicht jeder hat Lust und Zeit irgendwelche Testdateien zu simulieren um das Makro auch testen zu können.
Im Übrigen handelt es sich bei Dir um eien SVERWEIS zwischen mehreren Mappen, während obiger SVERWEIS nur mehrere Arbeitsblätter betrifft.
Gruss
Rainer
Antwort 12 von geek vom 15.04.2020, 07:22 Options
jo passt schon..
noch klarer kann ich mich nicht ausdrücken..
tschö