Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: hooKa am März 04, 2015, 09:59:00

Titel: Schaltfläche erstellen um Import-Modul auszuführen
Beitrag von: hooKa am März 04, 2015, 09:59:00
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
Titel: Re: Schaltfläche erstellen um Import-Modul auszuführen
Beitrag von: MaggieMay am März 04, 2015, 14:34:38
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?
Titel: Re: Schaltfläche erstellen um Import-Modul auszuführen
Beitrag von: hooKa am März 04, 2015, 15:24:22
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?
Titel: Re: Schaltfläche erstellen um Import-Modul auszuführen
Beitrag von: MaggieMay am März 04, 2015, 16:44:57
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.
Titel: Re: Schaltfläche erstellen um Import-Modul auszuführen
Beitrag von: hooKa am März 09, 2015, 14:34:31
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?
Titel: Re: Schaltfläche erstellen um Import-Modul auszuführen
Beitrag von: MaggieMay am März 09, 2015, 15:04:38
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.
Titel: Re: Schaltfläche erstellen um Import-Modul auszuführen
Beitrag von: hooKa am März 09, 2015, 15:36:59
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?
Titel: Re: Schaltfläche erstellen um Import-Modul auszuführen
Beitrag von: MaggieMay am März 09, 2015, 23:40:05
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

Titel: Re: Schaltfläche erstellen um Import-Modul auszuführen
Beitrag von: hooKa am März 10, 2015, 08:24:12
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)
Titel: Re: Schaltfläche erstellen um Import-Modul auszuführen
Beitrag von: DF6GL am März 10, 2015, 08:26:50
Hallo,

lies nochmal den Beitrag von MaggieMay  und setz den Vorschlag korrekt um.
Titel: Re: Schaltfläche erstellen um Import-Modul auszuführen
Beitrag von: hooKa am März 10, 2015, 09:42:02
@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).
Titel: Re: Schaltfläche erstellen um Import-Modul auszuführen
Beitrag von: DF6GL am März 10, 2015, 09:51:55
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.
Titel: Re: Schaltfläche erstellen um Import-Modul auszuführen
Beitrag von: hooKa am März 10, 2015, 10:08:36
@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.
Titel: Re: Schaltfläche erstellen um Import-Modul auszuführen
Beitrag von: DF6GL am März 10, 2015, 10:12:27
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.
Titel: Re: Schaltfläche erstellen um Import-Modul auszuführen
Beitrag von: hooKa am März 10, 2015, 10:24:47
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?
Titel: Re: Schaltfläche erstellen um Import-Modul auszuführen
Beitrag von: DF6GL am März 10, 2015, 10:34:27
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.
Titel: Re: Schaltfläche erstellen um Import-Modul auszuführen
Beitrag von: hooKa am März 10, 2015, 15:14:36
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.
Titel: Re: Schaltfläche erstellen um Import-Modul auszuführen
Beitrag von: MaggieMay am März 10, 2015, 15:24:48
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.