crinax
Goto Top

VBA: Überprüfung ob Daten in Excel bereits vorhanden sind

Guten Morgen,

zur Situation:
Es existiert eine MS Access Datenbank. Zusätzlich gibt es noch eine Excel Tabelle welche teilweise mit den selben Daten der Access Datenbank gefüllt ist.
Die Excel Tabelle hat einige Spalten mehr, welche von Hand beschrieben werden (z.B. mit aktuellem Stand, Zusatzinfos oder ähnlichem).

Beispiel:

MS Access DB:
Nachname Vorname
Mustermann Max
Musterfrau Maxi

MS Excel Tabelle:
Nachname Zusatz Vorname ~ Zusatz2
Mustermann Toller Max Max Ganz Toll

--> Nun soll per Knopfdruck/Skriptausführung die Excel Tabelle erweitert werden und dann so aussehen:
Nachname Zusatz Vorname ~ Zusatz2
Mustermann Toller Max Max Ganz toll
Musterfrau (NULL) Maxi Bleib stehen
Der Inhalt bei Maxi Musterfrau: "Bleib stehen" wird dann von Hand in der Excel Tabelle hinzugefügt.


--> Bis hierhin habe ich es auch alles erledigt... Nun stehe ich aber vor dem Problem, dass mein Modul durch folgenden Befehl
With wb.Sheets("Tabelle1")  
.UsedRange.ClearComments
die komplette Excel Tabelle löscht (bis auf die Überschriften, was auch gewollt ist). Allerdings werden nun auch die Spalten "Zusatz" und "Zusatz2" geleert. Diese stehen ja allerdings nicht in der Access DB und sollen somit auch wirklich nur gelöscht werden, wenn der passende Datensatz auch aus der DB gelöscht wird. Heißt wenn Max Mustermann aus der DB gelöscht wird, so soll die ganze Zeile entfernt werden, bei Maxi Musterfrau hingegen sollen die Spalten "Zusatz" und "Zusatz2" (soweit da auch was eingetragen ist) nicht gelöscht werden.

@colinardo habe die mal hier verlinkt, da du schon einiges an VBA Tipps gegeben hast.

Lg
Pascal

Content-ID: 284709

Url: https://administrator.de/contentid/284709

Ausgedruckt am: 22.11.2024 um 19:11 Uhr

colinardo
Lösung colinardo 09.10.2015, aktualisiert am 12.10.2015 um 11:14:29 Uhr
Goto Top
Hallo Pascal,
hab dir mal ein Paket zusammengestellt
sync_excel_table_284709.zip
Darin findest du eine Access-Datenbank und ein Excel-Sheet. Die Synchronisierungsroutine findest du im Excel-Sheet welches sich die Daten aus der Access-DB zieht.

Also beide Dateien in ein Verzeichnis entpacken, das Excel-Sheet öffnen und dort die Routine ausführen.

Grüße Uwe

@colinardo habe die mal hier verlinkt, da du schon einiges an VBA Tipps gegeben hast.
Zur Info: Das bekomme ich nicht automatisch mit, da musst du mir schon eine PM schreiben wenn du mich "triggern" willst face-wink. Hab das hier nur durch Zufall noch entdeckt. Viel am Hut im Moment X-/
crinaX
crinaX 12.10.2015 um 07:14:06 Uhr
Goto Top
Guten Morgen Uwe,

vielen Dank für deine Mühe und Hilfe. Werde mir das ganze jetzt mal genauer anschauen und auf meine Bedürfnisse anpassen.
Sollten sich dabei noch Fragen ergeben, so melde ich mich nochmal. Falls nicht, werde ich die Frage als gelöst markieren.

Zur Info: Das bekomme ich nicht automatisch mit, da musst du mir schon eine PM schreiben wenn du mich "triggern" willst. Hab das hier nur durch Zufall noch entdeckt. Viel am Hut im Moment X-/
Oh das wusste ich nicht, nochmal was gelernt face-smile

Lg
Pascal
crinaX
crinaX 12.10.2015 um 07:58:04 Uhr
Goto Top
Guten Morgen zum zweiten,

habe es gerade mal getestet und deine Lösung klappt auch soweit. Nun wollte ich mir das ganze auch mal komplett neu aufbauen und scheitere da gerade. Habe mir selbst eine neue Accdb erstellt, dann eine Neue Excel Tabelle.

In der Excel Tabelle dann deinen Code eingefügt, Button aufs Sheet gesetzt und die "Sub SynchronizeData()" damit angetriggert.
Nun bekomme ich beim Compilieren folgenden Fehler:
Laufzeitfehler '3001': Anwendungs- oder objektdefinierter Fehler

Benutze ich deine Excel Tabelle und ändere dort den Pfad zu meiner neu erstellen Accdb und passe den Namen der Tabelle in der select Anweisung an, dann funktioniert dies. Somit kann ich doch nur einen Fehler bei der Erstellung der Excel Tabelle gemacht haben?!

Lg
Pascal
colinardo
colinardo 12.10.2015 aktualisiert um 10:03:13 Uhr
Goto Top
Das Makro mit dem Debugger Schrittweise ausführen (F8) dann siehst du in welcher Zeile es bei dir austickt. Vermutlich ist deine Tabellenstruktur anders als meine, ohne Anpassung kann das dann natürlich nicht laufen.
crinaX
crinaX 12.10.2015 um 10:52:32 Uhr
Goto Top
Habe an die Anpassungen gedacht, aber auch wenn ich die selbe Tabellenstruktur nehme kommt der oben genannte Fehler und zwar beim Sprung von
rs.Open "Select * From Kunden", con, adOpenStatic, adLockReadOnly
nach
With ActiveSheet

Habe meine Tabelle Testweise auch in "Kunden" umbenannt. Aber auch schon andere Namen probiert. Datenbankpfad ist auch korrekt hinterlegt.

Benutze ich nun deine Beispiel Excel Tabelle und änder diese ab, so funktioniert alles auch auf der neuen DB.

Lg
Pascal
colinardo
colinardo 12.10.2015 aktualisiert um 11:13:27 Uhr
Goto Top
Setz mal in den Verweisen, einen Verweis auf die Microsoft ActiveX Data Objects Library das sollte dein Problem lösen face-wink

b6e38046016cecbec5ea13e8b6105e02

Die Konstanten (adOpenStatic, adLockReadOnly,adSearchForward) für die DB sind nur darin enthalten.
crinaX
crinaX 12.10.2015 um 11:14:15 Uhr
Goto Top
Vielen Dank. Der Verweis fehlte einfach. Sonst funktioniert alles und ich hab das ganze auf meine Bedürfnisse angepasst.

Lg
Pascal