Hallo Leute,
ich bin neu hier im Forum und auch neu bei Access 2010 und brauche mal Eure Hilfe für ein Problem, das ich habe.
Ich möchte gerne eine Schaltfläche erstellen, die ein VBA-Modul ausführt, welches Daten aus einer Excel-Tabelle in meine Datenbank importiert.
Bis jetzt habe ich es geschafft, ein neues Formular zu erstellen und eine Schaltfläche hinzuzufügen. Aber jetzt weiß ich z.B. nicht, wie ich es mache, dass der Button zum einen das (noch nicht vorhandene) VBA-Script ausführt. Oder gibt es eine einfachere Variante, die mir den Code erspart?
Eine Tabelle namens tblEinlesenAusExcel habe ich auch schon erstellt und auch schon die gleichen Werte bzw. Spalten, die die Excel-Tabelle hat. Die Excel-Tabelle liegt im selben Order wie die Datenbank-Datei.
Ein bisschen Code habe ich jetzt auch schon eingebaut:
Private Sub Befehl3_Click()
Dim fd As FileDialog
Dim vrtSelectedItems As Variant
Dim blnSave As Boolean
Set fd = Application.FileDialog(msoFileDialogOpen)
fd.InitialFileName = Application.CurrentProject.Path & "\"
blnSave = fd.Show
For Each vrtSelectedItem In fd.SelectedItems
MsgBox "Der Pfad der Excel-Datei ist folgender: " & vrtSelectedItem
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel97, "tblEinlesenAusExcel", vrtSelectedItem, True, Pivot
Next vrtSelectedItem
Set fd = Nothing
End Sub
Ich würde mich riesig freuen, wenn ihr mir hierbei helfen könnt.
Viele Grüße,
hooKa
Hallo,
was genau ist deine Frage, was läuft falsch an dem Code?
So wie es aussieht hast du ein Formular und eine Schaltfläche und eine Ereignisprozedur zum Klick-Ereignis. Was fehlt da noch?
Wenn ich den Button für die Prozedur klicke, kommt einmal dieser Fehler:
(http://up.picr.de/21178592ha.png)
Beim Klick auf Debuggen kommt liegt der Fehler hier:
(http://up.picr.de/21178602es.jpg)
Ich habe schonmal eine Sache geschafft: Wenn ich "Pivot!A5:K" & letzteZeile setze, kopiert er mir die ganze Excel-Tabelle in eine neue Tabelle in Access mit dynamischem Ende. Toll!
Wie kann ich jetzt aber angeben, dass er alles in eine schon vorhandene Tabelle speichern soll?
Und zwar bei 1 angefangen und nicht als Zeilentitel?
Die Fehlermeldung spricht ja wohl für sich, da musst du halt die Spalte noch hinzufügen.
Bei der Schreibweise kräuseln sich mir allerdings die Nackenhaare... ;-)
ZitatWie kann ich jetzt aber angeben, dass er alles in eine schon vorhandene Tabelle speichern soll?
Dann musst du halt die Datensätze der Tabelle vor dem Import mit einer Löschabfrage entfernen.
ZitatUnd zwar bei 1 angefangen und nicht als Zeilentitel?
Was meinst du damit, die Spaltenüberschriften?
Schau dir die Syntax der Transferspreadsheet-Methode in der Access-Hilfe an.
Hallo MaggieMay, vielen Dank für deine Hilfe.
Erstmal kurz vorweg die Frage, warum sich bei dir die Nackenhaare kräuseln. Wie würde denn eine bessere Schreibweise deiner Meinung nach aussehen?
Auf jeden Fall hab ich's soweit geschafft, die Daten zu importieren. Jetzt habe ich noch eine andere Frage und hoffe, dass du mir die auch beantworten kannst. Ich habe jetzt Tabelle1, in der die Excel-Daten liegen und Tabelle2, wo diese Daten reinkopiert werden sollen. Nun soll er die Daten aus der Spalte mit dem Namen "F1" der Tabelle1 einfach in die Spalte "Verkaufsbeleg" der Tabelle2 kopieren.
Mein Code sieht zur Zeit so aus:
Sub Kopieren()
Dim db As DAO.Database
Dim sqlDelete As String
Dim sqlInsert As String
Set db = CurrentDb
sqlDelete = "DELETE * FROM tblDatenAusExcelNeu;"
db.Execute sqlDelete, dbFailOnError
sqlInsert = "INSERT INTO tblDatenAusExcelNeu (Kalendertag, Verkaufsbeleg, Endkundenadresse) " & _
"SELECT (F1, F2, F3) " & _
"FROM tblDatenAusExcelNeu1;"
db.Execute sqlInsert, dbFailOnError
sqlDelete = "DELETE * FROM tblDatenAusExcelNeu1;"
db.Execute sqlDelete, dbFailOnError
Set db = Nothing
End Sub
Das Problem ist, dass er mir jetzt folgende Meldung rauswirft:
(http://up.picr.de/21231687zr.png)
Markieren tut er mir das:
(http://up.picr.de/21231695mz.png)
Ist irgendwas am Code falsch?
Hi,
ZitatNun soll er die Daten aus der Spalte mit dem Namen "F1" der Tabelle1 einfach in die Spalte "Verkaufsbeleg" der Tabelle2 kopieren.
Tatsächlich kopierst du aber die Spalte "F1" in das Datenfeld "Kalendertag". ;-)
ZitatIst irgendwas am Code falsch?
Entferne die Klammern um die Select-Felder.
Danke für den Tip, jetzt hat's geklappt. Eine Winzigkeit habe ich noch, aber ich weiß nicht,
ob das möglich ist mit VBA (hab dazu noch nichts gefunden).
Wie kann ich mit VBA den Spaltennamen auf die optimale Größe anpassen? Du weißt ja, man kann
das mit Mausklick machen, wenn man auf den Trennstrich doppelklickt:
(http://up.picr.de/21232182ur.png)
Weißt du, wie man das mit VBA löst?
Hallo,
Zitat von: hooKa am März 09, 2015, 14:34:31Wie würde denn eine bessere Schreibweise deiner Meinung nach aussehen?
Auf jeden Fall würde ich auf Sonderzeichen verzichten und anstelle von "KMAT-AX_KP-Ware(neu)" lieber "KMAT_AX_KP_Ware_neu" schreiben, noch lieber wäre mir allerdings ein noch kürzerer Feldname.
Zitat von: hooKa am März 09, 2015, 15:36:59Wie kann ich mit VBA den Spaltennamen auf die optimale Größe anpassen?
Bedingt funktioniert bei der Anzeige als Datenblatt folgendes, bspw. im Formularereignis "Beim Anzeigen":
Private Sub Form_Current()
Dim ctl As Control
For Each ctl In Me.Controls
If ctl.ControlType = acTextBox Then
ctl.ColumnWidth = -1
End If
Next
End Sub
Danke für den Code Maggie, aber er gibt mir eine Fehlermeldung aus:
(http://up.picr.de/21238574lw.png)
Das streicht er mir an:
(http://up.picr.de/21238579wt.png)
Hallo,
lies nochmal den Beitrag von MaggieMay und setz den Vorschlag korrekt um.
@DF6GL:
Ich habe mir den Beitrag einige Male durchgelesen, um ihn zu verstehen.
Die Sache ist nur die, dass ich das Datenblatt bzw. die Tabelle jedes Mal mit einem Button neu erstelle.
Deswegen bin ich gerade etwas überfragt, wo ich den Code hinpacken soll, da er ihn ja ausführen soll, wenn die Tabelle erzeugt wird. Ich habe ihn jetzt ins Formular nach der Klickoperation gelegt, aber es passiert nichts (obwohl er funktioniert).
Hallo,
ok, dann frag halt danach... ;)
Der Code gehört in die Ereignisprozedur "Beim Anzeigen" des Forms.
Dazu:
Formular in Formularentwurf öffnen und markieren (linkes oberes graues Quadrat anklicken,) das Eigenschaftenfenster aktivieren und dort "Ereignisse" klicken. In der Eigenschaftenzeile "Beim Anzeigen" auf die rechts stehenden 3 Pünktchen klicken, so dass sich der VBA-Editor (nach "Code"-Auswahl) öffnet. Dort steht schon das Prozedurgerüst ( Private Sub Form_Current() ) und kann mit dem eigentlichen Code "gefüllt" werden.
Zitat
Ich habe ihn jetzt ins Formular nach der Klickoperation gelegt, aber es passiert nichts (obwohl er funktioniert).
Ich habe jetzt nicht den gesamten Thread durchgelesen und kann zur Logik, bzw. dem eigentlichen Problem nichts sagen.
@DF6GL:
Habe es gemacht, wie du gesagt hast. Nach dem Klick auf die 3 Pünktchen wurde die Form_Current() Prozedur selbstständig im Formular erstellt und ich habe den Code reingeschoben. Aber nach dem Klick ist nichts passiert, die erstellte Tabelle hat immer noch die nicht optimierten Spaltennamen.
Hallo,
es geht doch hier um die Spaltenbreiten... Was willst Du da mit einem Klick auf eine Schaltfläche?
Was steht "hinter" dem Klicken auf den Button (Code in der Ereignisprozedur "beim Klicken" der Schaltfläche)?
Wie gesagt, habe nicht den ganzen Thread hier gelesen.
Naja, also mein Gedanke war halt (da es ja eine Prozedur ist und diese aufgerufen wird), dass, nachdem die Tabelle erstellt und mit Inhalt gefüllt wurde, die Spaltennamen optimiert dargestellt werden.
Ich hatte es bis jetzt so:
Private Sub Befehl2_Click()
Form_Current
End Sub
Dann wird eben auf die Prozedur verwiesen, die dann ausgeführt wird, um die Spaltennamen besser darzustellen.
Oder verstehe ich das falsch mit der Ereignisprozedur?
Hallo,
wenn Du Form_Current benutzt, wird die Einstellung jedesmal beim Anzeigen eines Datensatzes ausgeführt. Dann braucht Du nicht eine extra Schaltfläche. Willst Du die Prozedur nur ausführen, wenn die Schaltfläche geklickt wird, dann schreib den Code in die Click-Ereignisprozedur des Buttons.
Private Sub Befehl2_Click()
Dim ctl As Control
For Each ctl In Me.Controls
If ctl.ControlType = acTextBox Then
ctl.ColumnWidth = -1
End If
Next
End Sub
Die vorherige Fehlermeldung kam daher, dass "Me" als Verweis auf das aktuelle Form in der Prozedur (die keine Ereignis-Prozedur ist) nicht bekannt ist. Vermutlich steht die Prozedur (Sub Current () ) in einem Standardmodul und nicht im Formular-Klassenmodul.
Hi,
ich habe jetzt mal den Code in die Click-Ereignisprozedur des Buttons eingefügt. Nur leider tut sich nicht viel, die Spalten haben immer noch die ursprüngliche Breite und man muss sie manuell durch Klicken anpassen. Auch, wenn ich eine Private Sub Prozedur erstelle und auf sie verweise, passiert nichts.
Hi,
Zitatdie erstellte Tabelle hat immer noch die nicht optimierten Spaltennamen
es geht hier darum, dass du die Tabelle mit Hilfe eines Formulares zur Ansicht bringen musst, Tabellen und Abfragen werden niemals direkt geöffnet, dann da hast du ja keinerlei Kontrolle darüber.
Und in dieses Anzeigeformular gehört dann auch der Code.