Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA - Werte suchen und Datentabelle überschreiben

VBA - Werte suchen und Datentabelle überschreiben
10.10.2016 13:56:06
SvenW
Hallo Excel-Freunde,
ich als Laie habe ein Problem, bislang konnte ich mir alles herleiten, doch das funktioniert jetzt leider nicht mehr... =(
Mein Problem:
Ich habe ein Tabellenblatt "Datenbank" und ein Tabellenblatt "Änderung". In "Änderung" werden mir unterschiedliche Informationen aus der "Datenbank" angezeigt. Ich möchte mir aus der "Datenbank" die Zeile ausgeben lassen, die auf zwei Variablen zutrifft (Zelle B2 und A5-A) und anschließend aus "Änderung" Zelle B5-B dann an entsprechenden Zeilen in der "Datenbank" Spalte C überschreiben.
Eigentlich möchte ich ausschließlich eine neue Bewertung abgeben, welche auf die Variablen zutrifft und in die Datenbank übertragen.
Sollte meine Fragestellung etwas kryptisch formuliert sein, fragt bitte einfach nach.
Hier die Datei zum Verständnis.
https://www.herber.de/bbs/user/108697.xlsx
Vielen Dank für eure Mühe!!!
SvenW

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
warum so kompliziert?
10.10.2016 14:18:27
MB12
Hallo Sven,
weder aus deiner Beschreibung noch aus der Datei erschließt sich mir, wozu du
1. diese ganzen Hilfsspalten benötigst
2. und eine VBA-Lösung haben möchtest
Mit Formel ginge es doch viel einfacher.
Gruß, Margarete
AW: warum so kompliziert?
10.10.2016 15:59:24
SvenW
Hallo Margarete,
vielleicht erschließt es sich dir nicht, da es keinerlei Bedeutung hat. Die Beispieldatei ist exemplarisch, auf Knopfdruck soll der Datensatz überschrieben werden. Der Name und die dazugehörigen Tätigkeiten können variieren und somit auch die angezeigte Bewertung.
Wenn dir eine Formel dazu einfällt, bin ich hier offen.
Aber bitte lieber konkrete Fragestellungen oder Lösungsansätze, die etwas mit der Problemstellung zu tun haben... ;-)
Gruß
Sven
Anzeige
das hatte sehr wohl damit zu tun,...
10.10.2016 16:14:18
MB12
..., denn hiermit habe ich z.B. erfahren,
- dass die Hilfsspalten außer acht gelassen werden können,
- du mit "Knopfdruck", also einem control button arbeiten möchtest,
aber bei der "freundlichen" Antwort habe ich plötzlich keine Lust mehr.
Gruß, Margarete
AW: das hatte sehr wohl damit zu tun,...
10.10.2016 16:27:26
SvenW
Sorry, habe für deine Befindlichkeiten keine Zeit. Dann halt nicht. Für Leser (vor allem Laien) von Foren ist es echt riesig schwer unqualifizierte Fragenstellungen richtig einzuordnen, da sie nichts als verwirren und das Forum unnötig vollsülzen!
Wenn du zu meiner eigentlichen Frage eine Anmerkung gehabt hättest....
Lg
Anzeige
Deine BspDatei zeigt nur Strukturen, ...
10.10.2016 18:47:10
Luc:-?
…Sven,
nicht ihr Zusammenspiel. Das lässt dann Raum für FehlInterpretationen.
Prinzipiell ist es doch so, dass eine DB, hier dann also das Blatt Datenbank, PrimärDaten enthält, die aus der DB abgerufen und extern geändert wdn können. Ist Letzteres der Fall, will man die Änderungen idR auch wieder in die DB zurück­schreiben. Daraus ergibt sich, dass eine echte DB Fmln nur unter ihren Metadaten als Merkmal von berechnet gespeicherten Kenn­ziffern führen wird. Die Rück­speicherung geänder­ter/aktuali­sierter Primär­Daten erfolgt auf einem anderen Weg, für den sich hier VBA anbieten würde, wenn zuvor geklärt ist, ob es sich beim Blatt Änderung um eine generelle Erfassungs­Maske für Datenbank handelt oder eher ein kombiniertes Aus­wer­tungs-/Kor­rek­tur­Blatt. Davon hängt ab, ob und wo Fmln zum Einsatz kommen können. Wenn außerdem noch direkt in Datenbank geändert wdn kann, hätten wir hier einen Fall von bilateraler Eingabe/Darstellung u.ggf Auswertung, der Fmln als ungünstig erscheinen ließe.
Diese Fragen sollten geklärt wdn bevor irgendwer Fmln u/o VBA-Prozeduren entwickelt. Insofern sind Margaretes Anmerkungen durchaus und verstehbar angebracht.
Gruß, Luc :-?
Besser informiert mit …
Anzeige
AW: Deine BspDatei zeigt nur Strukturen, ...
11.10.2016 14:01:32
Sven
Hi Luc,
vielen Dank für deine Bemühungen! War nicht sicher, ob du meine Frage nur kommentiert hast...
"Änderung" soll genutzt werden um Daten aus der Datenbank anzuzeigen und wenn diese nicht mehr aktuell sind mit neuen Daten (DropDown) in der "Datenbank" zu überschreiben. Da der "Name" (Drop-Down) variieren kann, verändern sich ebenfalls immer wieder die Tätigkeiten welche den Namen zugeordnet sind. Die Tätigkeiten lasse ich mir über eine Aggregat/Index Formel auflisten.
Somit sollte es sich um ein kombiniertes Auswertungs- und Korrekturfeld handeln. In der Datenbank selbst soll manuell nichts angepasst werden müssen.
Gruß Sven
Anzeige
Dann sollten in 'Datenbank' auch keine Fmln ...
11.10.2016 16:11:57
Luc:-?
…verwendet wdn, Sven,
was bedeutet, dass der Rücktransport geänderter Daten per VBA erfolgen sollte. Die Anzeige der Daten in Änderung sollte dann ebenfalls über VBA-Abruf erfolgen, weil Fmln bei Änderung über­schrieben würden, es sei denn, man rekon­struiert sie (auto­matisch) nach Über­nahme der geän­derten Daten in die DB, spätestens bei Schließen oder besser erneutem Öffnen der Datei.
Luc :-?
AW: Dann sollten in 'Datenbank' auch keine Fmln ...
11.10.2016 16:32:11
Sven
In der Datenbank sind keine Formeln vorgesehen, wenn du die Formel in der Hilfsspalte meinst: die kann vernachlässigt werden, da sie ein Relikt verzweifelter Zeiten ist.
Den Einwand, dass die Anzeige der "Änderung" ebenfalls per VBA Abruf umgesetzt werden soll verstehe ich nicht, da ich lediglich Bewertung_Neu ändern möchte und dies ein absoluter Wert ist...
Doch all deine Hilfestellungen und Überlegungen bringen mich leider nicht weiter, da ich daraus keinen Code kreieren kann...
Trotzdem vielen Dank!
Sven
Anzeige
Achso, war ja 'ne ExtraRubrik, dann können ...
11.10.2016 16:50:45
Luc:-?
…die Daten immer per Fml abgerufen wdn und du musst nur die Änderungen in die DB übertragen, Sven;
ist die DB tatsächlich das Blatt Datenbank, kannst du per Change-Ereignis oder per Button auf dem Änderungsblatt (oder auch Kurzruf-TastenKombi) die Daten dieser Spalte in die DB-Tabelle übertragen, wobei du natürlich die Position in der ÄnderungsTab und die zugehörige in der DB-Tab ermitteln und beide für die Korrektur verwenden musst.
Muss ich mir aber erst nochmal ansehen und schauen, ob die AW im Neuen Thread das schon so abdeckt.
Luc :-?
AW: Achso, war ja 'ne ExtraRubrik, dann können ...
12.10.2016 10:17:50
Sven
Also die Antwort des neuen Thread deckt das leider noch nicht ab, da unabhängig von dem Namen die Daten überschrieben werden. Die Änderungen würde ich gerne via Button ansteuern. Die "Datenbank" ist tatsächlich die Datenbank, ich habe eine Eingabemaske die mit unter anderem diese DB füllt. Was sein kann ist, dass zu Beginn noch keine Bewertung abgegeben wurde und über das Blatt "Änderung" die Bewertung initial abgegeben wird.
Ich würde mich riesig freuen, wenn du dir die anderen Antworten mal anschauen könntest und evtl. Vorschläge unterbreiten könntest. Bin jegliche Foren und Tutorials am durchforsten - erfolglos.
Danke vorab!
Sven
Anzeige
So, habe mich mal damit beschäftigt und ...
13.10.2016 01:46:39
Luc:-?
…mich anstelle eines Buttons für einen Rechtsklick auf B4, den Titel der NeuBewertung entschieden, Sven;
außerdem habe ich diese Tabelle (in Änderung) auf 4 Spalten verkürzt, denn die Hilfsspalten benötigst du ja nicht wirklich. Aber deren GrundIdee war nicht verkehrt, weshalb ich die in Fmln für die verbliebenen Spalten C (aktBewertung) und D (DB-Zeile) einge­arbeitet habe:
C5[:C8]:{=ERSETZEN(SVERWEIS(B$2&[@Tätigkeit];Tabelle15[Lieferanten]&Tabelle15[[Tätigkeit]:[Bewertung]];2;0);1;LÄNGE(B$2);"")}
D5[:D8]:{=VERGLEICH(B$2&[@Tätigkeit];Tabelle15[Lieferanten]&Tabelle15[Tätigkeit];0)+1}
Im Dokument-Klassenmodul dieses Blattes (steht für die Ereignisse desselben) muss dann nur noch nachfolgende EreignisProzedur angelegt wdn:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Const relDBfeld As Long = 3, lzETabZeile As Long = 8, relDBZeileSp As Long = 4, _
adEintragDB$ = "B4", naBlattDB$ = "Datenbank"         'ggf anpassen!
Dim relETabBer As Range, xZeile As Range
On Error GoTo fx
Cancel = Not Intersect(Target, Me.Range(adEintragDB)) Is Nothing
If Cancel Then
Set relETabBer = Me.Range(Me.Cells(Target.Row + 1, Target.Column), _
Me.Cells(lzETabZeile, relDBZeileSp))
For Each xZeile In relETabBer.Rows
If Not IsEmpty(xZeile.Cells(1)) Then
Sheets(naBlattDB).Cells(xZeile.Cells(relDBZeileSp - 1), _
relDBfeld) = xZeile.Cells(1)
xZeile.Cells(1) = Empty
End If
Next xZeile
fx:     If CBool(Err.Number) Then
MsgBox Err.Description, vbCritical, "Fehler-Abbruch"
Set xZeile = Nothing
End If
Set relETabBer = Nothing
End If
End Sub
Außerdem sollte die GültigkeitsRegel in Spalte B von Änderung Leerzellen zulassen, denn die NeuBewertungen wdn bei Übernahme in die DB gelöscht.
Bei dieser Organisation kann der Vorgang mehrfach wiederholt wdn (falls man sich mal geirrt hat, was dann in der NachbarSpalte sofort zu sehen ist).
Um das einigermaßen zufriedenstellend testen zu können, hatte ich die DB übrigens um einen weiteren Lieferanten erweitert.
Gutes Gelingen! Luc :-?
Anzeige
AW: So, habe mich mal damit beschäftigt und ...
13.10.2016 09:36:31
Sven
Vielen Dank schon mal! Leider bekomme ich es trotzdem nicht umgesetzt. Kannst du versuchen deine Anweisung etwas idiotengerechter zu formulierern? Habe eben ein Klassenmodul in der Arbeitsmappe angelegt und deinen Code übertragen und in "Änderung" habe ich in C5 und D5 die gesamte Formel kopiert (richtig?), doch leider funktioniert es nicht wie gewünscht. Besteht die Möglichkeit, dass du mir freundlicherweise deine Testdatei hochlädst?
Lese ich den Code richtig, dass die Tabelle in "Änderung" immer dem jetzigen Format entspricht? Die Daten der Tabelle erweitern sich je nach Auswahl des "Name/Lieferant".
Warum hast du dich für den Rechtsklick entschieden? Wird wahrscheinlich keine Leichtigkeit sein dies auf einen CommandButton zu ändern, oder?
Gruß
Sven
Anzeige
Lies mal in der VBE-Hilfe unter 'Ereignisse ...
13.10.2016 14:58:08
Luc:-?
des TabBlattes nach, Sven,
denn ich habe nicht geschrieben, dass du ein Klassenmodul, sondern dass du diese EreignisProzedur (im bereits vorhandenen) Dokument-Klassenmodul dieses TabBlattes (quasi seine Rückseite, erreichbar durch Klick auf das Blatt im VBE-Verzeichnisbaum) anlegen sollst (Auswahl­Möglichkeiten dann im Kopf des VBE-CodeBlattes).
Die Fmln gehören tatsächlich nach C5 bzw D5 (nur das zwischen den {} und als MatrixFml [[strg][umsch]][enter] abschließen) und sollten sich dann auch automatisch auf die Folgezeilen (angepasst) übertragen.
Eine Erweiterung der Tabelle habe ich nicht berücksichtigt, da du ein Bsp gewählt hattest, aus dem das nicht ersichtlich ist, zumal du auch nur einen Lieferanten in der DB eingetragen hattest. Du kannst den durch die Pgm-Constanten festgelegten Bereich aber (auf dein Maximum) erweitern.
Wenn du das (unnötigerweise) auf einen Button ändern willst, müssen die Me. im Code durch das StandortBlatt (Sheets("Änderung").) ersetzt wdn.
Die TestDatei müsste ich erst wieder neu anlegen, denn ich habe sie wg geringen Erhaltenswertes bereits wieder gelöscht. Aber das solltest du nun auch können…
Luc :-?
Anzeige
AW: Lies mal in der VBE-Hilfe unter 'Ereignisse ...
13.10.2016 16:20:14
Sven
Spitze es klappt. Danke! Ich wollte nun die Tabelle von A4:D8 nach D11:G15 verschieben, doch dann habe ich eine Fehlermeldung erhalten. Wie kann ich den Code anpassen, sodass dies passt? Zusätzlich würde ich eine bereits abgegebene Bewertung mit "" überschreiben wollen - müsste auch möglich sein, oder?
Liege ich damit richtig, dass das reine Umbenennen von Me. zu Sheets("Änderung"). nicht ausreichend ist? Ich habe versucht den Code an einen CmdButton zu hängen und es hat leider nicht geklappt.
LG Sven
Dann musst du die Konstanten ändern, ...
13.10.2016 23:31:42
Luc:-?
…Sven;
adEintragDB$ = "B4" muss dann adEintragDB$ = "E11" lauten und lzETabZeile As Long = 15, relDBZeileSp As Long = 7, weshalb ich ggf anpassen dahinter geschrieben hatte. Mehr ist nicht erfor­derlich, wenn sich sonst nichts ändert.
Überschreiben ist jetzt schon möglich, du musst dann nur ein Apostroph (' oder was sonst bei dir als Text­Präfix einge­stellt ist) als Neu­bewertung eingeben. Das gilt standard­mäßig als Kennzeichen für Text und wird nicht angezeigt. Die Zelle ist dann aber nicht leer (empty) und der ansonsten leere Wert wird in die DB-Tabelle über­tragen (entspräche ="").
Ja, es wäre mehr erforderlich. Die Prozedur müsste einen anderen Namen erhalten und Parameter dürfen ihr nicht übergeben wdn. Target muss also mit seiner Adresse As Range deklariert und direkt referenziert wdn → Set Target = Range("B4") bzw jetzt = Range("E11") (am PgmEnde dann Set Target = Nothing). Cancel muss eben­falls, aber As Boolean dekla­riert wdn. Das sollte es dann aber gewesen sein.
Viell verstehst du jetzt, warum ich eine Ereignis­Prozedur gewählt habe… ;-]
Gruß, Luc :-?
AW: Dann musst du die Konstanten ändern, ...
19.10.2016 09:56:54
Sven
Vielen vielen Dank, klappt alles einwandfrei! Sag mal besteht die Möglichkeit statt die Bewertung zu überschreiben die neue Bewertung einfach zu ergänzen und mit einem Semikolon zu trennen?
Bsp.:
Alt = Gut
Neu = Schlecht
Aktualisierte Bewertung = Schlecht; Gut
Wäre echt nett wenn du dir das mal anschauen könntest.
Gruß Sven

346 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige