{"id":55001025,"date":"2016-04-01T00:00:00","date_gmt":"2020-05-22T19:01:32","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1025"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"CSVVerknuepfungen_pflegen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/CSVVerknuepfungen_pflegen\/","title":{"rendered":"CSV-Verkn&uuml;pfungen pflegen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/cf7b2f12b4d74e8d9d41010bfbc97eaa\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn Sie Dateien im .csv-Format in Ihre Datenbank eingebunden haben, kommt es gelegentlich vor, dass diese verschoben, umbenannt oder gel&ouml;scht werden. Dieser Beitrag zeigt nicht nur, wie Sie .csv-Dateien per VBA einbinden k&ouml;nnen, sondern auch, wie Sie erkennen, ob die Dateien noch an Ort und Stelle sind und diese gegebenenfalls mithilfe des Benutzers wieder einbinden.<\/b><\/p>\n<p>Als Beispiel-Datei zum Verkn&uuml;pfen verwenden wir einfach eine im <b>.csv<\/b>-Format exportierte Tabelle der S&uuml;dsturm-Datenbank, in diesem Fall <b>tblArtikel<\/b>. Dazu nutzen wir den Export-Assistenten, den Sie &uuml;ber den Ribbon-Eintrag <b>Externe Daten|Exportieren|Textdatei <\/b>aufrufen. Hier stellen Sie beispielsweise ein, dass die Datei mit Spalten&uuml;berschriften gespeichert werden soll. Au&szlig;erdem &ouml;ffnen Sie mit einem Klick auf die Schaltfl&auml;che <b>Erweitert&#8230; <\/b>den Dialog mit den Exportspezifikationen.<\/p>\n<p>Speichern Sie diese per Mausklick auf die Schaltfl&auml;che <b>Speichern unter&#8230; <\/b>und geben Sie im Dialog <b>Import\/Export-Spezifikation speichern <\/b>den Namen <b>tblArtikel_CSV <\/b>ein (s. Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1025_001.png\" alt=\"Export der Beispieltabelle, die sp&auml;ter verkn&uuml;pft werden soll\" width=\"700\" height=\"469,874\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Export der Beispieltabelle, die sp&auml;ter verkn&uuml;pft werden soll<\/span><\/b><\/p>\n<p>Nun wollen wir eine Verkn&uuml;pfung zu der soeben in eine CSV-Datei exportierten Tabelle mit dem daf&uuml;r vorgesehenen Assistenten erstellen (Ribbon-Eintrag <b>Externe Daten|Importieren und Verkn&uuml;pfen|Textdatei<\/b>). Egal, ob wir dies mit Access 2013 oder 2016 erledigen wollten: Es gab immer eine Fehlermeldung wie die aus Bild 2.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1025_002.png\" alt=\"Fehlermeldung beim Versuch, eine Verkn&uuml;pfung zu erstellen\" width=\"500\" height=\"106,0886\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Fehlermeldung beim Versuch, eine Verkn&uuml;pfung zu erstellen<\/span><\/b><\/p>\n<p>Diese erscheint auch unabh&auml;ngig davon, ob wir beim Verkn&uuml;pfen die Textdateispezifikation ausw&auml;hlen oder nicht. In beiden F&auml;llen legte Access jedoch die Verkn&uuml;pfung in der Liste der Tabellen an (s. Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1025_004.png\" alt=\"Access erstellt die Verkn&uuml;pfungen trotz Fehlermeldung.\" width=\"425\" height=\"274,9507\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Access erstellt die Verkn&uuml;pfungen trotz Fehlermeldung.<\/span><\/b><\/p>\n<p>Wenn Sie keine Textdateispezifikation ausw&auml;hlen, liefert Access jedoch noch zus&auml;tzlich die Fehlermeldung aus Bild 4. Anscheinend sucht Access hier nach der Textdateispezifikation, deren Name standardm&auml;&szlig;ig beim Anlegen einer solchen vorgeschlagen wird &#8211; diese ist aber nicht in der Datenbank gespeichert (die Textdateispezfikationen finden Sie &uuml;brigens in den Systemtabellen <b>MSysIMEXSpecs <\/b>und <b>MSysIMEXColumns<\/b>).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1025_003.png\" alt=\"Fehlermeldung wegen einer fehlenden Textdateispezifikation\" width=\"700\" height=\"84,55884\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Fehlermeldung wegen einer fehlenden Textdateispezifikation<\/span><\/b><\/p>\n<p>In einer weiteren Systemtabelle namens <b>MSysObjects <\/b>entdecken wir, dass auch beim Verkn&uuml;pfen ohne Textdateispezifikation eine solche angegeben wird &#8211; in diesem Fall als Wert der Eigenschaft <b>DSN <\/b>mit dem Wert <b>TblArtikel Verkn&uuml;pfungsspezifikation <\/b>(s. Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1025_005.png\" alt=\"Die Importspezifikation wird in der Systemtabelle MSysObjects als Teil der Connect-Zeichenfolge angegeben.\" width=\"700\" height=\"108,6886\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Die Importspezifikation wird in der Systemtabelle MSysObjects als Teil der Connect-Zeichenfolge angegeben.<\/span><\/b><\/p>\n<p>Es scheint sich hier also um einen Fehler des Import-Assistenten zu handeln. Das ist aber kein Problem, denn wir streben ja in diesem Beitrag ohnehin eine VBA-gesteuerte Methode zum Verkn&uuml;pfen der CSV-Dateien an.<\/p>\n<h2>Verschieben der CSV-Datei<\/h2>\n<p>Wenn Sie nun einmal die CSV-Datei verschieben und die darauf basierende Verkn&uuml;pfung &ouml;ffnen m&ouml;chten, findet Access die angegebene Datei nat&uuml;rlich nicht mehr und gibt eine entsprechende Fehlermeldung aus. Es gibt auch keine einfache M&ouml;glichkeit, den Speicherort der verkn&uuml;pften Datei an die ver&auml;nderten Gegebenheiten anzupassen &#8211; Sie m&uuml;ssen die Verkn&uuml;pfung erneuern.<\/p>\n<p>Dazu k&ouml;nnen Sie diese entweder l&ouml;schen und komplett neu erstellen oder Sie nutzen den <b>Tabellenverkn&uuml;pfungs-Manager<\/b>. Diesen &ouml;ffnen Sie &uuml;ber den Ribbon-Eintrag <b>Externe Daten|Importieren und Verkn&uuml;pfen|Verkn&uuml;pfungs-Manager<\/b>. Hier w&auml;hlen Sie die zu aktualisierende Verkn&uuml;pfung aus (s. Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1025_007.png\" alt=\"Der Tabellenverkn&uuml;pfungs-Manager\" width=\"600\" height=\"250,9246\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Der Tabellenverkn&uuml;pfungs-Manager<\/span><\/b><\/p>\n<p>Nach einem Klick auf die Schaltfl&auml;che <b>OK <\/b>bietet Access mit einem <b>Datei ausw&auml;hlen<\/b>-Dialog die M&ouml;glichkeit, die Quelldatei der Verkn&uuml;pfung erneut auszuw&auml;hlen (s. Bild 7). Nach einer Erfolgsmeldung k&ouml;nnen Sie nun wieder auf die aktualisierte Verkn&uuml;pfung zugreifen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1025_008.png\" alt=\"Auswahl des neuen Speicherorts der Quelldatei einer Verkn&uuml;pfung\" width=\"500\" height=\"310,687\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Auswahl des neuen Speicherorts der Quelldatei einer Verkn&uuml;pfung<\/span><\/b><\/p>\n<p>Dies funktioniert &uuml;brigens nur, wenn sich der Speicherort der Datei ge&auml;ndert hat. Sollten Sie den Dateinamen oder die Dateiendung angepasst haben, k&ouml;nnen Sie mit der bereits angelegten Verkn&uuml;pfung nicht mehr auf diese Datei zugreifen &#8211; der Dateiname ist fest verankert, lediglich der Pfad ist &auml;nderbar.<\/p>\n<p>&uuml;brigens: Die Option <b>Immer zur Eingabe eines neuen Speicherort auffordern <\/b>im <b>Tabellenverkn&uuml;pfungs-Manager <\/b>ist etwas ungeschickt benannt: Man k&ouml;nnte meinen, dass bei folgenden Problemen, die durch das Fehlen der Datei am angegebenen Ort auftreten, direkt ein <b>Datei ausw&auml;hlen<\/b>-Dialog erscheint.<\/p>\n<p>Das ist aber nicht so: Die Option ist vielmehr so gemeint, dass Sie, wenn Sie mehr als eine Verkn&uuml;pfung aktualisieren wollen, f&uuml;r jede einzelne den Speicherort angeben m&uuml;ssen.<\/p>\n<p>Wie auch immer: Sie m&ouml;chten die Verkn&uuml;pfung, wenn Sie beispielsweise abwechselnd an Ihrem Arbeitsplatz oder am heimischen Rechner eine Anwendung entwickeln, nicht immer manuell aktualisieren. Das Gleiche gilt nat&uuml;rlich f&uuml;r den Kunden, der meist originelle Ideen hat, um den Speicherort der verkn&uuml;pften Dateien zu variieren.<\/p>\n<p>Au&szlig;erdem wollen wir so flexibel sein, auch einmal eine Datei mit einer anderen Bezeichnung als beim erstmaligen Erstellen der Verkn&uuml;pfung angegeben zu verwenden. Also pr&uuml;fen wir nun die M&ouml;glichkeiten, die Verkn&uuml;pfung m&ouml;glichst automatisch zu aktualisieren.<\/p>\n<h2>Verkn&uuml;pfung per VBA herstellen<\/h2>\n<p>Nun schauen wir uns an, wie wir die Verkn&uuml;pfung per VBA herstellen und ob auch hier die Probleme mit der Textdateispezifikation auftreten. Dazu nutzen wir den VBA-Befehl <b>DoCmd.TransferText<\/b>.<\/p>\n<p>Der erste Aufruf sieht wie folgt aus:<\/p>\n<pre>DoCmd.TransferText acLinkDelim, , \"tblArtikel_CSV_VBA\", CurrentProject.Path & \"\\tblArtikel.csv\", <span style=\"color:blue;\">True<\/span><\/pre>\n<p>Die Parameter haben dabei die folgenden Bedeutung:<\/p>\n<ul>\n<li><b>TransferType<\/b>: Der Wert <b>acLinkDelim <\/b>legt fest, dass eine Verkn&uuml;pfung einer Textdatei mit einem festgelegten Delimiter zum Einsatz kommt.<\/li>\n<li><b>SpecificationName<\/b>: Bleibt im ersten Anlauf leer, da wir zun&auml;chst keine Textdateispezifikation verwenden m&ouml;chten.<\/li>\n<li><b>TableName<\/b>: Legt den Namen der Tabelle fest, hier <b>&#8222;tblArtikel_CSV_VBA&#8220;<\/b><\/li>\n<li><b>FileName<\/b>: Gibt den Dateinamen der zu verkn&uuml;pfenden Datei an, in diesem Fall mit <b>CurrentProject.Path &#038; &#8222;\\tblArtikel.csv&#8220;<\/b> die Datei <b>tblArtikel.csv <\/b>im Verzeichnis der Datenbankdatei.<\/li>\n<li><b>HasFieldNames<\/b>: Legt mit dem Wert <b>True <\/b>fest, dass die erste Zeile beim Verkn&uuml;pfen als Spalten&uuml;berschriften interpretiert wird und nicht als Werte.<\/li>\n<\/ul>\n<p>Das Ergebnis in der Tabelle <b>MSysObjects <\/b>sieht zun&auml;chst gut aus: Hier finden wir nun keine Angabe einer Textdateispezifikation mehr unter dem Wert <b>DSN <\/b>des Feldes <b>Connect <\/b>vor:<\/p>\n<pre><span style=\"color:blue;\">Text<\/span>;DSN=;FMT=Delimited;HDR=YES;IMEX=2;ACCDB=YES;<\/pre>\n<p>Dummerweise wirkt sich dies negativ auf die Erstellung der Verkn&uuml;pfung aus. Wenn Sie den neuen Eintrag <b>tblArtikel_CSV_VBA <\/b>per Doppelklick &ouml;ffnen, erscheint zwar keine Fehlermeldung, aber die angezeigte Tabelle liefert nur die erste Spalte mit den Werten des Feldes <b>ArtikelID<\/b> (s. Bild 8) &#8211; und diese auch noch jeweils mit abschlie&szlig;endem Semikolon.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_1025_006.png\" alt=\"Das Ergebnis eines Imports ohne Textdateispezifikation\" width=\"425\" height=\"287,9033\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Das Ergebnis eines Imports ohne Textdateispezifikation<\/span><\/b><\/p>\n<p>Es sieht also so aus, als ob wir doch eine Textdateispezifikation angeben m&uuml;ssen. Da die Methode <b>TransferText <\/b>aber einen Parameter zur &uuml;bergabe des Namens einer solchen anbietet, probieren wir dies gleich einmal aus:<\/p>\n<pre>DoCmd.TransferText acLinkDelim, \"tblArtikel_CSV\", \"tblArtikel_CSV_VBA_MitSpezifikation\", CurrentProject.Path & \"\\tblArtikel.txt\", <span style=\"color:blue;\">True<\/span><\/pre>\n<p>Diese Variante gelingt auf Anhieb &#8211; die Verkn&uuml;pfung landet unter dem Namen <b>tblArtikel_CSV_VBA_MitSpezifikation <\/b>im Navigationsbereich der Datenbank. Wir k&ouml;nnen die Arbeit, die wir vorher manuell durch Durchlaufen des Assistenten erledigt haben, auch per VBA ausf&uuml;hren. Mit einem Unterschied: Die Textdateispezifikation m&uuml;ssen wir zun&auml;chst einmal mit dem Assistenten erstellen.<\/p>\n<h2>Verkn&uuml;pfung per VBA aktualisieren<\/h2>\n<p>Was geschieht nun mit der Verkn&uuml;pfung, wenn wir diese erneut mit dem gleichen VBA-Befehl anlegen In diesem Fall erstellt die Methode die gleiche Verkn&uuml;pfung nochmals, aber beh&auml;lt die bereits vorhandene Verkn&uuml;pfung bei. Dazu &auml;ndert sie die Bezeichnung des neuen Exemplars, indem sie hinten eine laufende Nummer anh&auml;ngt (also etwa <b>tblArtikel_CSV_VBA_MitSpezifikation1<\/b>).<\/p>\n<p>Wenn wir die Verkn&uuml;pfung aktualisieren wollen, weil diese nicht mehr aktuell ist, sollten wir also die bestehende Verkn&uuml;pfung zuvor l&ouml;schen, damit die neue wieder mit dem gew&uuml;nschten Namen angelegt wird.<\/p>\n<p>Dazu sollten wir zun&auml;chst pr&uuml;fen, ob die Verkn&uuml;pfung noch funktioniert. Dies gelingt per VBA, indem wir ein Recordset auf Basis dieser Verkn&uuml;pfung erstellen. Sollte die zugrunde liegende Datei nicht mehr vorhanden sein, l&ouml;st dies einen Fehler aus. In diesem Fall wollen wir erstens die Verkn&uuml;pfung l&ouml;schen und zweitens per <b>Datei ausw&auml;hlen<\/b>-Dialog den neuen Speicherort der Verkn&uuml;pfung abfragen.<\/p>\n<p>Die Verkn&uuml;pfung erstellen wir dann wie bereits weiter oben beschrieben neu. In diesem Fall ist es uns dann auch m&ouml;glich, nicht nur ein anderes Dateiverzeichnis, sondern auch einen anderen Dateinamen anzugeben. Beim Wechseln des Verzeichnisses &uuml;ber den Tabellenverkn&uuml;pfungs-Manager war das ja nicht m&ouml;glich.<\/p>\n<p><!--30percent--><\/p>\n<p>Schauen wir uns nun an, wie Sie die Verkn&uuml;pfung per VBA wiederherstellen k&ouml;nnen.<\/p>\n<h2>Testf&auml;lle<\/h2>\n<p>Wenn man eine solche Funktion wie die nachfolgend vorgestellte programmieren m&ouml;chte, testet man normalerweise die verschiedenen Konstellationen. Dabei ist es nat&uuml;rlich m&uuml;hselig, immer wieder die Konstellation herzustellen und dann die Funktion mit den gew&uuml;nschten Parametern aufzurufen, um dann die Ergebnisse und R&uuml;ckgabewerte mit den erwarteten Werten abzugleichen.<\/p>\n<p>Etwas mehr Arbeit zu Beginn, aber wesentlich schnellere Tests erhalten Sie, wenn Sie die Tests automatisieren. Dazu braucht man gar nicht unbedingt ein spezielles Framework, wie es beispielsweise beim Unit-Testing verwendet wird, sondern  man kann auch einfach ein paar kleine Prozeduren schreiben, welche die Ausgangssituation herstellen, die Funktionen testen und dann die hervorgerufene Situation und die R&uuml;ckgabewerte der Funktion testen.<\/p>\n<p>In unserem Fall wollen wir die folgenden Konstellationen testen:<\/p>\n<ul>\n<li>Die Verkn&uuml;pfung ist noch gar nicht vorhanden (Verkn&uuml;pfung l&ouml;schen, danach pr&uuml;fen, ob die Verkn&uuml;pfung vorhanden und funktionst&uuml;chtig ist und ob die Funktion <b>Verkn&uuml;pfungAktualisieren <\/b>den Wert <b>True <\/b>zur&uuml;ckliefert).<\/li>\n<li>Die Verkn&uuml;pfung ist vorhanden, aber die verkn&uuml;pfte Datei fehlt (Datei l&ouml;schen oder umbenennen, danach pr&uuml;fen, ob die Verkn&uuml;pfung funktioniert und die Funktion den Wert <b>True<\/b> zur&uuml;ckliefert).<\/li>\n<li>Die angegebene Importspezifikation fehlt (Funktion soll abbrechen und den Wert <b>False <\/b>zur&uuml;ckliefern).<\/li>\n<\/ul>\n<p>Dazu haben wir zum Beispiel die vier Testf&auml;lle aus Listing 1 programmiert. Wann immer Sie etwas am Code &auml;ndern, k&ouml;nnen Sie mit diesen und anderen, auf den &auml;nderungen basierenden Testf&auml;llen schnell pr&uuml;fen, ob die Funktionen noch wie gew&uuml;nscht funktionieren. Wir haben die Testf&auml;lle so konfiguriert, dass bei optimalem Ablauf alle Tests den Wert <b>True<\/b> im Direktfenster ausgeben:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Testfaelle()\r\n     <span style=\"color:blue;\">Dim <\/span>strVerknuepfung<span style=\"color:blue;\"> As String<\/span>\r\n     ''*****Test 1: Verkn&uuml;pfung fehlt\r\n     strVerknuepfung = \"tblArtikel_Test1\"\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     CurrentDb.Execute \"DROP TABLE \" & strVerknuepfung\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Test 1.1: \" & (VerknuepfungAktualisieren(strVerknuepfung, \"tblArtikel_CSV\") = <span style=\"color:blue;\">True<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Test 1.2: \" & VerknuepfungVorhanden(strVerknuepfung)\r\n     ''*****Test 2: .csv-Datei fehlt\r\n     FileCopy CurrentProject.Path & \"\\tblArtikel.txt\", CurrentProject.Path & \"\\tblArtikel_Test2.txt\"\r\n     strVerknuepfung = \"tblArtikel_Test2\"\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     CurrentDb.Execute \"DROP TABLE \" & strVerknuepfung\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     VerknuepfungErstellen strVerknuepfung, \"tblArtikel_CSV\", CurrentProject.Path & \"\\tblArtikel_Test2.txt\", <span style=\"color:blue;\">True<\/span>\r\n     Kill CurrentProject.Path & \"\\tblArtikel_Test2.txt\"\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Test 2.1: \" & (VerknuepfungAktualisieren(strVerknuepfung, \"tblArtikel_CSV\") = <span style=\"color:blue;\">True<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Test 2.2: \" & VerknuepfungVorhanden(strVerknuepfung)\r\n     ''*****Test 3: Importspezifikation fehlt, aber wird nicht ben&ouml;tigt, da Verkn&uuml;pfung vorhanden\r\n     strVerknuepfung = \"tblArtikel_Test3\"\r\n     VerknuepfungErstellen strVerknuepfung, \"tblArtikel_CSV\", CurrentProject.Path & \"\\tblArtikel.txt\", <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Test 3.1: \" & (VerknuepfungAktualisieren(strVerknuepfung, \"tblArtikel_CSV_NichtVorhanden\") = <span style=\"color:blue;\">True<\/span>)\r\n     ''*****Test 4: Importspezifikation fehlt beim Aktualisieren\r\n     strVerknuepfung = \"tblArtikel_Test4\"\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Test 4.1: \" & (VerknuepfungAktualisieren(strVerknuepfung, \"tblArtikel_CSV_NichtVorhanden\") = <span style=\"color:blue;\">True<\/span>)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Testf&auml;lle f&uuml;r die Funktionen der Beispieldatenbank<\/span><\/b><\/p>\n<pre>Test 1.1: Wahr\r\nTest 1.2: Wahr\r\nTest 2.1: Wahr\r\nTest 2.2: Wahr\r\nTest 3.1: Wahr\r\nTest 4.1: Wahr<\/pre>\n<h2>Verkn&uuml;pfung per VBA aktualisieren<\/h2>\n<p>Die Aktualisierung startet mit der Funktion <b>Verknuep-fungAktualisieren<\/b> aus Listing 2, die Sie in einem Standardmodul unterbringen. Die Funktion erwartet zwei Parameter:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>VerknuepfungAktualisieren(strTabellenname<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> strSpezifikation<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strPfad<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strStartverzeichnis<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolVerknuepfungsquelleVorhanden<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolVerknuepfungVorhanden<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strTabellenname) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Kein Tabellenname angegeben.\"\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     bolVerknuepfungVorhanden = VerknuepfungVorhanden(strTabellenname)\r\n     <span style=\"color:blue;\">If <\/span>bolVerknuepfungVorhanden<span style=\"color:blue;\"> Then<\/span>\r\n         bolVerknuepfungsquelleVorhanden = VerknuepfungsquelleVorhanden(strTabellenname)\r\n         strPfad = PfadVerknuepfungErmitteln(strTabellenname)\r\n         strStartverzeichnis = <span style=\"color:blue;\">Mid<\/span>(strPfad, 1, <span style=\"color:blue;\">InStrRev<\/span>(strPfad, \"\\\"))\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Dir(strStartverzeichnis, vbDirectory)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             strStartverzeichnis = CurrentProject.Path\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> bolVerknuepfungsquelleVorhanden<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Die Verkn&uuml;pfung ''\" & strTabellenname & \"'' muss aktualisiert werden, da die Datei ''\" _\r\n                 & strPfad & \"'' nicht gefunden werden konnte.\"\r\n             strPfad = OpenFileName(strStartverzeichnis, \"Textdatei ausw&auml;hlen\", \"Textdatei (*.txt;*.csv)|\" _\r\n                 & \"Alle Dateien (*.*)\")\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Dir(strPfad)) &gt; 0 And <span style=\"color:blue;\">Len<\/span>(strPfad) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                 VerknuepfungAktualisieren = VerknuepfungErstellen(strTabellenname, strSpezifikation, _\r\n                     strPfad, bolVerknuepfungVorhanden, <span style=\"color:blue;\">True<\/span>)\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Die Verkn&uuml;pfung ''\" & strTabellenname & \"'' ist nicht vorhanden und wird nun erstellt. W&auml;hlen Sie die \"_\r\n             \"Quelldatei aus.\"\r\n         strPfad = OpenFileName(strStartverzeichnis, \"Textdatei ausw&auml;hlen\", \"Textdatei (*.txt;*.csv)|\" _\r\n             \"Alle Dateien (*.*)\")\r\n         VerknuepfungAktualisieren = VerknuepfungErstellen(strTabellenname, strSpezifikation, strPfad, _\r\n             bolVerknuepfungVorhanden, <span style=\"color:blue;\">True<\/span>)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Startfunktion zum Aktualisieren einer Verkn&uuml;pfung mit einer .csv-Datei<\/span><\/b><\/p>\n<ul>\n<li><b>strTabellenname<\/b>: Name der Tabelle, deren Verkn&uuml;pfung aktualisiert werden soll<\/li>\n<li><b>strSpezifikation<\/b>: Optionaler Parameter, der den Namen der Importspezifikation entgegennimmt<\/li>\n<\/ul>\n<p>Die Prozedur ruft zun&auml;chst eine weitere Funktion namens <b>VerknuepfungsquelleVorhanden<\/b> auf (s. Listing 3). Diese erwartet den Namen der zu untersuchenden Verkn&uuml;pfung, wie er auch im dem Navigationsbereich zu finden ist, als Parameter. Sie erstellt ein <b>Database<\/b>-Objekt mit einem Verweis auf die aktuelle Datenbank und dann ein <b>Recordset<\/b>-Objekt, das versucht, auf die Tabelle aus dem Parameter <b>strTabellenname <\/b>zuzugreifen.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>VerknuepfungsquelleVorhanden(strVerknuepfung<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(strVerknuepfung)\r\n     VerknuepfungsquelleVorhanden = Err.Number = 0\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Funktion zur Pr&uuml;fung, ob die Verkn&uuml;pfungsquelle vorhanden ist<\/span><\/b><\/p>\n<p>Dieser Schritt erfolgt unter Deaktivierung der eingebauten Fehlerbehandlung, sodass beispielsweise das Fehlen des gesuchten <b>TableDef<\/b>-Objekts keinen Laufzeitfehler ausl&ouml;st.  Die Eigenschaft Number des <b>Err<\/b>-Objekts enth&auml;lt danach, sofern kein Fehler ausgel&ouml;st wurde, den Wert <b>0<\/b>.<\/p>\n<p>Das hei&szlig;t, dass die Tabellendefinition gefunden werden konnte &#8211; die Funktion <b>VerknuepfungsquelleVorhanden <\/b>liefert den Wert <b>True <\/b>zur&uuml;ck. Anderenfalls, zum Beispiel, wenn die Verkn&uuml;pfung gar nicht vorhanden ist (Fehlernummer <b>3078<\/b>), liefert die Funktion den Wert <b>False <\/b>zur&uuml;ck.<\/p>\n<h2>Name der verkn&uuml;pften Datei ermitteln<\/h2>\n<p>Sollte die gesuchte Verkn&uuml;pfung als Tabellendefinition vorliegen, ruft die Funktion <b>VerknuepfungAktualisieren <\/b>eine weitere Funktion namens <b>PfadVerknuepfung-Ermitteln <\/b>auf (s. Listing 4). Diese soll untersuchen, ob die als Datenquelle f&uuml;r die Verkn&uuml;pfung angegebene Datei &uuml;berhaupt vorhanden ist. Sie erwartet mit dem Parameter <b>strTabellenname <\/b>lediglich den Namen der zu untersuchenden Tabelle. Sie liest ebenfalls das <b>TableDef<\/b>-Objekt zu dieser Verkn&uuml;pfung ein und speichert die Referenz in der Variablen <b>tdf<\/b>. Dann ermittelt sie f&uuml;r dieses Objekt den Wert der Variablen <b>Connect<\/b>, der beispielsweise so aussieht, und speichert diesen in der Variablen <b>strConnect<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>PfadVerknuepfungErmitteln(strTabellenname<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>tdf<span style=\"color:blue;\"> As <\/span>DAO.TableDef\r\n     <span style=\"color:blue;\">Dim <\/span>strConnect<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strDateiname<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strVerzeichnis<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> tdf = db.TableDefs(strTabellenname)\r\n     strConnect = tdf.Connect\r\n     strDateiname = tdf.SourceTableName\r\n     strVerzeichnis = ParameterErmitteln(strConnect, \"DATABASE\")\r\n     PfadVerknuepfungErmitteln = strVerzeichnis & \"\\\" & strDateiname\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Diese Funktion ermittelt den Namen einer verkn&uuml;pften Datei.<\/span><\/b><\/p>\n<p>Text;DSN=tblArtikel_CSV;FMT=Delimited;HDR=NO;IMEX=2;ACCDB=YES;DATABASE=C:\\&#8230;\\CSVVerknuepfungenPflegen<\/p>\n<p>Beachten Sie, dass der Dateiname der verkn&uuml;pften Daten hier nicht angegeben wird! Diesen liefert n&auml;mlich erst die Eigenschaft <b>SourceTableName<\/b>, wonach er in der Variablen <b>strDateiname <\/b>landet. Das Verzeichnis ist ja im <b>Connect<\/b>-String enthalten, muss aber von dort noch extrahiert werden.<\/p>\n<h2>Name-Wert-Paare parsen<\/h2>\n<p>Dies erledigt die Hilfsfunktion <b>ParameterErmitteln <\/b>aus Listing 5. Die Funktion erwartet die Name-Wert-Liste und den Namen des zu ermittelnden Parameters. Sie ermittelt die Position des ersten Auftretens des gesuchten Wertnamens, die in der Variablen <b>intStart <\/b>landet, und, von dort aus gesehen, die Position des ersten Semikolons, das hier als Trennzeichen zwischen den Name-Wert-Paaren genutzt wird.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ParameterErmitteln(strNameWert<span style=\"color:blue;\"> As String<\/span>, strParameter<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intStart<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intEnde<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strWert<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intLaengeName<span style=\"color:blue;\"> As Integer<\/span>\r\n     intStart = <span style=\"color:blue;\">InStr<\/span>(1, strNameWert, strParameter)\r\n     intEnde = <span style=\"color:blue;\">InStr<\/span>(intStart + 1, strNameWert, \";\") - 1\r\n     intLaengeName = <span style=\"color:blue;\">Len<\/span>(strParameter)\r\n     <span style=\"color:blue;\">If <\/span>intEnde = -1<span style=\"color:blue;\"> Then<\/span>\r\n         intEnde = <span style=\"color:blue;\">Len<\/span>(strNameWert)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strWert = <span style=\"color:blue;\">Mid<\/span>(strNameWert, intStart + intLaengeName + 1, intEnde - intStart - intLaengeName)\r\n     ParameterErmitteln = strWert\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Diese Funktion ermittelt den Wert eines Parameters einer Name-Wert-Liste.<\/span><\/b><\/p>\n<p>Die Position landet in der Variablen <b>intEnde<\/b>. Gegebenenfalls ist nach dem Namen kein Semikolon mehr zu finden, dann handelt es sich um das letzte Name-Wert-Paar des Ausdrucks. In diesem Fall erh&auml;lt <b>intEnde <\/b>die Gesamtzahl der Zeichen der Name-Wert-Liste. Den Wert des Name-Wert-Paares ermittelt die Funktion dann mithilfe der <b>Mid<\/b>-Funktion und den Werten aus <b>intStart<\/b>, <b>intEnde <\/b>und der L&auml;nge des Namens des Name-Wert-Paares, die in der Variablen <b>intLaengeName <\/b>steckt. Der Name ist auch gleichzeitig der R&uuml;ckgabewert der Funktion <b>ParameterErmitteln<\/b>.<\/p>\n<p>Die Funktion <b>PfadVerknuepfungErmitteln <\/b>schlie&szlig;lich hat nun alle Informationen zusammen, um den aus <b>strVerzeichnis <\/b>und <b>strDateiname <\/b>bestehenden Pfad als Funktionsergebnis zur&uuml;ckzuliefern.<\/p>\n<p>Damit kehren wir zur&uuml;ck zur urspr&uuml;nglichen Funktion <b>VerknuepfungAktualisieren<\/b>. Diese ermittelt aus dem Pfad nun noch das Startverzeichnis. L&auml;sst sich hieraus kein g&uuml;ltiges Verzeichnis ermitteln, stellt die Prozedur die Variable <b>strStartverzeichnis<\/b>, das sp&auml;ter als Ausgangsverzeichnis bei der Anzeige des Dateiauswahl-Dialogs zum Einsatz kommt, mit <b>CurrentProject.Path <\/b>auf das Verzeichnis der aktuellen Datenbankdatei ein.<\/p>\n<p>Sofern weiter oben die Quelldatei f&uuml;r die Verkn&uuml;pfung nicht gefunden wurde und die Variable <b>bolVerknuepfungsquelleVorhanden <\/b>dementsprechend noch den Wert <b>False <\/b>aufweist, erscheint eine Meldung, dass die Datei erneut ausgew&auml;hlt werden muss &#8211; dies nur als Vorbereitung des Benutzers auf die nachfolgende Anzeige eines Dateiauswahl-Dialogs. Mit diesem w&auml;hlt der Benutzer die Quelldatei erneut aus, die dann in der Variablen <b>strPfad <\/b>gespeichert wird. Enth&auml;lt <b>strPfad<\/b> dann nicht nur einen Wert, sondern auch noch einen, den wir mit der <b>Dir<\/b>-Funktion als g&uuml;ltigen Dateinamen erkennen k&ouml;nnen, ruft die Funktion eine weitere Funktion namens <b>Verknuep-fungErstellen <\/b>auf.<\/p>\n<h2>Verkn&uuml;pfung erstellen<\/h2>\n<p>Diese Funktion (s. Listing 6) erwartet als Parameter den Tabellennamen, den Namen der Spezifikation, den Dateinamen, die Angabe, ob die Verkn&uuml;pfung bereits vorhanden ist, sowie optional einen <b>Boolean<\/b>-Parameter, der angibt, ob eine gleichnamige bestehende Verkn&uuml;pfung ohne R&uuml;ckfrage &uuml;berschrieben werden soll.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>VerknuepfungErstellen(strTabellenname<span style=\"color:blue;\"> As String<\/span>, strSpezifikation<span style=\"color:blue;\"> As String<\/span>, strDateiname<span style=\"color:blue;\"> As String<\/span>, _\r\n         bolVerknuepfungVorhanden<span style=\"color:blue;\"> As Boolean<\/span>, <span style=\"color:blue;\">Optional<\/span> bolOhneRueckfrageUeberschreiben<span style=\"color:blue;\"> As Boolean<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngError<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">If <\/span>bolVerknuepfungVorhanden And <span style=\"color:blue;\">Not<\/span> bolOhneRueckfrageUeberschreiben<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">MsgBox<\/span>(\"Die Verknuepfung ist bereits vorhanden. L&ouml;schen und neu erstellen\", vbYesNo) = vbNo<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Exit Function<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     DoCmd.DeleteObject acTable, strTabellenname\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     DoCmd.TransferText acLinkDelim, strSpezifikation, strTabellenname, strDateiname\r\n     lngError = Err.Number\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     Select Case lngError\r\n         <span style=\"color:blue;\">Case <\/span>3625\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Die Importspezifikation ''\" & strSpezifikation & \"'' ist nicht vorhanden.\"\r\n             VerknuepfungErstellen = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">Case <\/span>0\r\n             VerknuepfungErstellen = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Fehler \" & lngError & \" in ''VerknuepfungErstellen''.\"\r\n             VerknuepfungErstellen = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Funktion zum Anlegen einer neuen Verkn&uuml;pfung<\/span><\/b><\/p>\n<p>Wenn die Verkn&uuml;pfung bereits vorhanden ist und die Variable <b>bolOhneRueckfrageUeberschreiben <\/b>den Wert <b>False<\/b> liefert, fragt die Funktion den Benutzer, ob die vorhandene Verkn&uuml;pfung &uuml;berschrieben werden soll. Falls nicht, endet die Funktion hier.<\/p>\n<p>Anderenfalls l&ouml;scht die Funktion eine eventuell vorhandene Verkn&uuml;pfung gleichen Namens und erstellt diese mit der <b>TransferText<\/b>-Methode des <b>DoCmd<\/b>-Objekts neu. Dabei k&ouml;nnten verschiedene Fehler auftreten.<\/p>\n<p>Einer ist, dass die angegebene Importspezifikation nicht vorhanden ist. Dar&uuml;ber informatiert die Funktion den Benutzer und bricht den Vorgang ab. Sollte kein Fehler aufgetreten sein, wurde die Verkn&uuml;pfung erfolgreich erstellt und die Funktion liefert den Wert <b>True <\/b>zur&uuml;ck.<\/p>\n<p>Damit w&auml;re der Fall der Funktion <b>VerknuepfungAktualisieren <\/b>abgeschlossen, das die Verkn&uuml;pfung bereits vorhanden ist. Ist noch keine Verkn&uuml;pfung vorhanden, fallen eine Reihe Pr&uuml;fungen weg und die Verkn&uuml;pfung kann direkt neu erstellt werden.<\/p>\n<p>Dazu k&uuml;ndigt die Funktion die Anzeige des Dateiauswahl-Dialogs an, der dem Benutzer direkt im Anschluss die M&ouml;glichkeit bietet, die Quelldatei f&uuml;r die Verkn&uuml;pfung auszuw&auml;hlen.<\/p>\n<p>Nachdem dies geschehen ist, ruft die Funktion wieder die Funktion <b>VerknuepfungErstellen <\/b>auf. Das Ergebnis dieser Funktion wird auch von der Funktion <b>VerknuepfungAktualisieren <\/b>als Ergebnis zur&uuml;ckgegeben.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>In diesem Beitrag haben Sie die Grundlagen der Verkn&uuml;pfung mit <b>.csv<\/b>-Dateien kennen gelernt. Dabei haben wir die Methode &uuml;ber die Benutzeroberfl&auml;che sowie die mit der VBA-Methode <b>TransferText <\/b>des <b>DoCmd<\/b>-Objekts vorgestellt.<\/p>\n<p>Au&szlig;erdem haben wir Ihnen einige Funktionen gezeigt, mit denen Sie den Zustand von Verkn&uuml;pfungen pr&uuml;fen und diese wieder herstellen k&ouml;nnen, die Sie in eigene Anwendungen einbauen k&ouml;nnen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>CSVVerknuepfungenPflegen.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{6614E4F8-6C90-4C17-A514-F090D6A3F611}\/aiu_1025.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie Dateien im .csv-Format in Ihre Datenbank eingebunden haben, kommt es gelegentlich vor, dass diese verschoben, umbenannt oder gel&ouml;scht werden. Dieser Beitrag zeigt nicht nur, wie Sie .csv-Dateien per VBA einbinden k&ouml;nnen, sondern auch, wie Sie erkennen, ob die Dateien noch an Ort und Stelle sind und diese gegebenenfalls mithilfe des Benutzers wieder einbinden.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022016,662016,44000021],"tags":[],"class_list":["post-55001025","post","type-post","status-publish","format-standard","hentry","category-66022016","category-662016","category-Tabellen_und_Datenmodellierung"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>CSV-Verkn&uuml;pfungen pflegen - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/CSVVerknuepfungen_pflegen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"CSV-Verkn&uuml;pfungen pflegen\" \/>\n<meta property=\"og:description\" content=\"Wenn Sie Dateien im .csv-Format in Ihre Datenbank eingebunden haben, kommt es gelegentlich vor, dass diese verschoben, umbenannt oder gel&ouml;scht werden. Dieser Beitrag zeigt nicht nur, wie Sie .csv-Dateien per VBA einbinden k&ouml;nnen, sondern auch, wie Sie erkennen, ob die Dateien noch an Ort und Stelle sind und diese gegebenenfalls mithilfe des Benutzers wieder einbinden.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/CSVVerknuepfungen_pflegen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T19:01:32+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/cf7b2f12b4d74e8d9d41010bfbc97eaa\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"17\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CSVVerknuepfungen_pflegen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CSVVerknuepfungen_pflegen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"CSV-Verkn&uuml;pfungen pflegen\",\"datePublished\":\"2020-05-22T19:01:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CSVVerknuepfungen_pflegen\\\/\"},\"wordCount\":2839,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CSVVerknuepfungen_pflegen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/cf7b2f12b4d74e8d9d41010bfbc97eaa\",\"articleSection\":[\"2\\\/2016\",\"2016\",\"Tabellen und Datenmodellierung\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/CSVVerknuepfungen_pflegen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CSVVerknuepfungen_pflegen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CSVVerknuepfungen_pflegen\\\/\",\"name\":\"CSV-Verkn&uuml;pfungen pflegen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CSVVerknuepfungen_pflegen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CSVVerknuepfungen_pflegen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/cf7b2f12b4d74e8d9d41010bfbc97eaa\",\"datePublished\":\"2020-05-22T19:01:32+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CSVVerknuepfungen_pflegen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/CSVVerknuepfungen_pflegen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CSVVerknuepfungen_pflegen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/cf7b2f12b4d74e8d9d41010bfbc97eaa\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/cf7b2f12b4d74e8d9d41010bfbc97eaa\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CSVVerknuepfungen_pflegen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"CSV-Verkn&uuml;pfungen pflegen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"CSV-Verkn&uuml;pfungen pflegen - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/CSVVerknuepfungen_pflegen\/","og_locale":"de_DE","og_type":"article","og_title":"CSV-Verkn&uuml;pfungen pflegen","og_description":"Wenn Sie Dateien im .csv-Format in Ihre Datenbank eingebunden haben, kommt es gelegentlich vor, dass diese verschoben, umbenannt oder gel&ouml;scht werden. Dieser Beitrag zeigt nicht nur, wie Sie .csv-Dateien per VBA einbinden k&ouml;nnen, sondern auch, wie Sie erkennen, ob die Dateien noch an Ort und Stelle sind und diese gegebenenfalls mithilfe des Benutzers wieder einbinden.","og_url":"https:\/\/access-im-unternehmen.de\/CSVVerknuepfungen_pflegen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T19:01:32+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/cf7b2f12b4d74e8d9d41010bfbc97eaa","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/CSVVerknuepfungen_pflegen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/CSVVerknuepfungen_pflegen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"CSV-Verkn&uuml;pfungen pflegen","datePublished":"2020-05-22T19:01:32+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/CSVVerknuepfungen_pflegen\/"},"wordCount":2839,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/CSVVerknuepfungen_pflegen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/cf7b2f12b4d74e8d9d41010bfbc97eaa","articleSection":["2\/2016","2016","Tabellen und Datenmodellierung"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/CSVVerknuepfungen_pflegen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/CSVVerknuepfungen_pflegen\/","url":"https:\/\/access-im-unternehmen.de\/CSVVerknuepfungen_pflegen\/","name":"CSV-Verkn&uuml;pfungen pflegen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/CSVVerknuepfungen_pflegen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/CSVVerknuepfungen_pflegen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/cf7b2f12b4d74e8d9d41010bfbc97eaa","datePublished":"2020-05-22T19:01:32+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/CSVVerknuepfungen_pflegen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/CSVVerknuepfungen_pflegen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/CSVVerknuepfungen_pflegen\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/cf7b2f12b4d74e8d9d41010bfbc97eaa","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/cf7b2f12b4d74e8d9d41010bfbc97eaa"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/CSVVerknuepfungen_pflegen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"CSV-Verkn&uuml;pfungen pflegen"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001025","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001025"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001025\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001025"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001025"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001025"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}