{"id":55000230,"date":"2014-02-01T00:00:00","date_gmt":"2020-01-24T15:59:06","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=230"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Datensaetze_per_VBA_kopieren","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Datensaetze_per_VBA_kopieren.html","title":{"rendered":"Datens&auml;tze per VBA kopieren"},"content":{"rendered":"<p class='introduction'>Im Artikel <b>Datens&auml;tze kopieren <\/b>haben Sie bereits erfahren, wie Sie Datens&auml;tze ohne eine einzige selbstgeschriebene Zeile VBA-Code kopieren k&ouml;nnen. Der vorliegende Artikel zeigt, wie Sie dies mit VBA erledigen und damit einige Flexibilit&auml;t gewinnen. Wir st&uuml;rzen uns dabei zun&auml;chst auf die Datens&auml;tze, die in einem Unterformular angezeigt werden und schauen uns danach die &uuml;brigen Methoden von VBA zum Kopieren von Datens&auml;tzen an.<\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels finden Sie in der Datenbank <b>1401_DatensaetzeKopierenVBA.mdb<\/b>.<\/p>\n<h2>Datens&auml;tze im Unterformular kopieren<\/h2>\n<p>Im Artikel <b>Datens&auml;tze kopieren <\/b>haben  wir zuletzt per Schaltfl&auml;chen-Assistent eine Schaltfl&auml;che mit einer Prozedur erstellt, die f&uuml;nf <b>DoCmd.RunCommand<\/b>-Befehle mit verschiedenen Parametern aufruft, um den im aktuellen Formular angezeigten Datensatz zu kopieren und als neuen Datensatz in die Tabelle einzuf&uuml;gen.<\/p>\n<p>Eigentlich, so nimmt man naiverweise an, sollte dies doch genau in dieser Form auch funktionieren, wenn wir den Datensatz in einem Unterformular, das seine Daten in der Datenblattansicht anzeigt, kopieren wollen. Wenn wir also ein Hauptformular erstellen und in dieses ein Unterformular einf&uuml;gen, dass die Tabelle <b>tblArtikel <\/b>als Datenherkunft verwendet, alle Felder dieser Tabelle anzeigt und den Wert <b>Datenblatt <\/b>als <b>Standardansicht <\/b>nutzt, brauchen wir nur noch eine Schaltfl&auml;che im Hauptformular, die den Kopiervorgang durchf&uuml;hrt (siehe Bild 1).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_230_003.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_230_003.png\" alt=\"Haupt- und Unterformular mit der Schaltfl&auml;che zum Kopieren im Hauptformular und den Daten im Unterformular\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: Haupt- und Unterformular mit der Schaltfl&auml;che zum Kopieren im Hauptformular und den Daten im Unterformular<\/p>\n<p>Diese nennen wir <b>cmdDatensatzKopierenUF <\/b>und legen daf&uuml;r, wieder mit dem Schaltfl&auml;chen-Assistent, die Prozedur zum Duplizieren des aktuellen Datensatzes an. Die Prozedur erleichtern wir noch um die Fehlerbehandlung, um direkt zu erkennen, welche Zeile einen eventuellen Fehler ausl&ouml;st (siehe Listing 1).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdDatensatzKopierenUF_Click()\r\n     'Fehlerbehandlung entfernt\r\n     DoCmd.RunCommand acCmdSelectRecord\r\n     DoCmd.RunCommand acCmdCopy\r\n     DoCmd.RunCommand acCmdRecordsGoTo<span style=\"color:blue;\">New<\/span>\r\n     DoCmd.RunCommand acCmdSelectRecord\r\n     DoCmd.RunCommand acCmdPaste\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p class='imagetext'>Listing 1: Kopieren des Datensatzes im Unterformular<\/p>\n<p>Anschlie&szlig;end starten Sie die Prozedur mit einem Mausklick auf die Schaltfl&auml;che <b>cmd-Daten-satz-ko-pieren-UF<\/b> und erhalten die Fehlermeldung aus Bild 2. Anscheinend findet Access also nichts, was es aktuell kopieren k&ouml;nnte &#8211; was bei genauerer Betrachtung auch logisch ist: Immerhin sollte das zu kopierende Objekt auch den Fokus besitzen oder in einer anderen Form markiert sein. Aber selbst wenn Sie noch vor dem Mausklick auf die Schaltfl&auml;che <b>cmdDatensatzKopieren-UF <\/b>den zu kopierenden Datensatz im Unterformular markiert haben, so verliert das Unterformular doch zum Zeitpunkt des Mausklicks auf die Schaltfl&auml;che den Fokus. Das ist jedoch kein gro&szlig;es Problem: Es gibt n&auml;mlich ebenfalls Befehle, um den Fokus auf die meisten Elemente der benutzerdefinierten Formulare zu verschieben &#8211; in diesem Fall auf das Unterformular-Steuerelement. Damit die Prozedur ihren Dienst tut, m&uuml;ssen Sie einfach nur die folgende Anweisung als erste Zeile der Prozedur einf&uuml;gen:<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_230_002.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_230_002.png\" alt=\"Fehler, der beim Versuch, den Datensatz im Unterformular zu kopieren, ausgel&ouml;st wird.\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 2: Fehler, der beim Versuch, den Datensatz im Unterformular zu kopieren, ausgel&ouml;st wird.<\/p>\n<pre>Me!sfmDatensatzKopieren.SetFocus<\/pre>\n<p>Nun erh&auml;lt das Unterformular nach dem Anklicken der Schaltfl&auml;che den Fokus und die folgenden f&uuml;nf <b>DoCmd.RunCommand<\/b>-Befehle k&ouml;nnen ihren Dienst verrichten. Der kopierte Datensatz landet dann am Ende des Datenblatts und wird gleich markiert (siehe Bild 3).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_230_001.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_230_001.png\" alt=\"Kopieren und Einf&uuml;gen eines Datensatzes im Unterformular per Schaltfl&auml;che\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 3: Kopieren und Einf&uuml;gen eines Datensatzes im Unterformular per Schaltfl&auml;che<\/p>\n<h2>Datensatz per DAO kopieren<\/h2>\n<p>Im n&auml;chsten Beispiel wollen wir eine Variante vorstellen, die per direktem Zugriff auf die zu kopierenden Daten in der Tabelle erfolgt. Das Datenblatt im Unterformular dient nur noch der Auswahl des zu kopierenden Datensatzes und der Anzeige des Duplikats.<\/p>\n<p>Das Beispiel finden Sie im Formular <b>frmDatensatzKopierenDAO<\/b>. Die Prozedur, die durch die Schaltfl&auml;che <b>cmdDatensatzKopierenDAO <\/b>ausgel&ouml;st wird, finden Sie in Listing 2. Die Prozedur verwendet die Recordset-Methoden der DAO-Bibliothek zum Kopieren des aktuell markierten Datensatzes der Tabelle <b>tblArtikel <\/b>im Unterformular <b>sfmDatensatzKopieren<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdDatensatzKopierenDAO_Click()\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>rstOriginal<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>rstDuplikat<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>lngOriginalID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngDuplikatID<span style=\"color:blue;\"> As Long<\/span>\r\n     lngOriginalID = Me!sfmDatensatzKopieren.Form!ArtikelID\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rstOriginal = db.OpenRecordset(\"SELECT * FROM tblArtikel WHERE ArtikelID = \" & lngOriginalID, dbOpenDynaset)\r\n     <span style=\"color:blue;\">Set<\/span> rstDuplikat = db.OpenRecordset(\"SELECT * FROM tblArtikel WHERE 1 = 2\", dbOpenDynaset)\r\n     rstDuplikat.Add<span style=\"color:blue;\">New<\/span>\r\n     rstDuplikat!Artikelname = rstOriginal!Artikelname\r\n     rstDuplikat!LieferantID = rstOriginal!LieferantID\r\n     rstDuplikat!KategorieID = rstOriginal!KategorieID\r\n     rstDuplikat!Liefereinheit = rstOriginal!Liefereinheit\r\n     rstDuplikat!Einzelpreis = rstOriginal!Einzelpreis\r\n     rstDuplikat!Lagerbestand = rstOriginal!Lagerbestand\r\n     rstDuplikat!BestellteEinheiten = rstOriginal!BestellteEinheiten\r\n     rstDuplikat!Mindestbestand = rstOriginal!Mindestbestand\r\n     rstDuplikat!Auslaufartikel = rstOriginal!Auslaufartikel\r\n     rstDuplikat!AusgelaufenAm = rstOriginal!AusgelaufenAm\r\n     lngDuplikatID = rstDuplikat!ArtikelID\r\n     rstDuplikat.Update\r\n     Me!sfmDatensatzKopieren.Form.Recordset.Requery\r\n     Me!sfmDatensatzKopieren.Form.Recordset.FindFirst \"ArtikelID = \" & lngDuplikatID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p class='imagetext'>Listing 2: Kopieren eines Datensatzes per DAO<\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Access &#091;basics&#093;<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/282\/access-basics?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 400 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000230\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/index.php\/data\/wp\/v2\/posts\/55000230?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000230\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"8d63f6cbe9\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Artikel <b>Datens&auml;tze kopieren <\/b>haben Sie bereits erfahren, wie Sie Datens&auml;tze ohne eine einzige selbstgeschriebene Zeile VBA-Code kopieren k&ouml;nnen. Der vorliegende Artikel zeigt, wie Sie dies mit VBA erledigen und damit einige Flexibilit&auml;t gewinnen. Wir st&uuml;rzen uns dabei zun&auml;chst auf die Datens&auml;tze, die in einem Unterformular angezeigt werden und schauen uns danach die &uuml;brigen Methoden von VBA zum Kopieren von Datens&auml;tzen an.<\/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":[66012014,662014,44000018,44000004],"tags":[],"class_list":["post-55000230","post","type-post","status-publish","format-standard","hentry","category-66012014","category-662014","category-Datenzugriff_programmieren","category-Formulare_fuer_die_Dateneingabe"],"aioseo_notices":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v15.9.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Datens&auml;tze per VBA kopieren - Access [basics]<\/title>\n<meta name=\"description\" content=\"Im Artikel Datens\u00e4tze kopieren haben Sie bereits erfahren, wie Sie Datens\u00e4tze ohne eine einzige selbstgeschriebene Zeile VBA-Code kopieren k\u00f6nnen. Der vorliegende Artikel zeigt, wie Sie dies mit VBA erledigen und damit einige Flexibilit\u00e4t gewinnen. Wir st\u00fcrzen uns dabei zun\u00e4chst auf die Datens\u00e4tze, die in einem Unterformular angezeigt werden und schauen uns danach die \u00fcbrigen Methoden von VBA zum Kopieren von Datens\u00e4tzen an.\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Datensaetze_per_VBA_kopieren.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Datens&auml;tze per VBA kopieren - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Im Artikel Datens\u00e4tze kopieren haben Sie bereits erfahren, wie Sie Datens\u00e4tze ohne eine einzige selbstgeschriebene Zeile VBA-Code kopieren k\u00f6nnen. Der vorliegende Artikel zeigt, wie Sie dies mit VBA erledigen und damit einige Flexibilit\u00e4t gewinnen. Wir st\u00fcrzen uns dabei zun\u00e4chst auf die Datens\u00e4tze, die in einem Unterformular angezeigt werden und schauen uns danach die \u00fcbrigen Methoden von VBA zum Kopieren von Datens\u00e4tzen an.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Datensaetze_per_VBA_kopieren.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-24T15:59:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"-0001-11-30T00:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/..\/tl_files\/images\/pic_230_003.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\">\n\t<meta name=\"twitter:data1\" content=\"12\u00a0Minuten\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/access-basics.de\/#website\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Access [basics]\",\"description\":\"DAS ACCESS-MAGAZIN F\\u00dcR ALLE, DIE VON 0 AUF 100 WOLLEN\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/access-basics.de\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Datensaetze_per_VBA_kopieren.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"..\/tl_files\/images\/pic_230_003.png\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Datensaetze_per_VBA_kopieren.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Datensaetze_per_VBA_kopieren.html\",\"name\":\"Datens&auml;tze per VBA kopieren - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Datensaetze_per_VBA_kopieren.html#primaryimage\"},\"datePublished\":\"2020-01-24T15:59:06+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"description\":\"Im Artikel Datens\\u00e4tze kopieren haben Sie bereits erfahren, wie Sie Datens\\u00e4tze ohne eine einzige selbstgeschriebene Zeile VBA-Code kopieren k\\u00f6nnen. Der vorliegende Artikel zeigt, wie Sie dies mit VBA erledigen und damit einige Flexibilit\\u00e4t gewinnen. Wir st\\u00fcrzen uns dabei zun\\u00e4chst auf die Datens\\u00e4tze, die in einem Unterformular angezeigt werden und schauen uns danach die \\u00fcbrigen Methoden von VBA zum Kopieren von Datens\\u00e4tzen an.\",\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Datensaetze_per_VBA_kopieren.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Datensaetze_per_VBA_kopieren.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Datensaetze_per_VBA_kopieren.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Datensaetze_per_VBA_kopieren.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Datensaetze_per_VBA_kopieren.html\",\"name\":\"Datens&auml;tze per VBA kopieren\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","_links":{"self":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000230","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/comments?post=55000230"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000230\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000230"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000230"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000230"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}