Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Schaltfläche erstellen um Import-Modul auszuführen

Begonnen von hooKa, März 04, 2015, 09:59:00

⏪ vorheriges - nächstes ⏩

hooKa

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

MaggieMay

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?
Freundliche Grüße
MaggieMay

hooKa

#2
Wenn ich den Button für die Prozedur klicke, kommt einmal dieser Fehler:



Beim Klick auf Debuggen kommt liegt der Fehler hier:



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?

MaggieMay

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.
Freundliche Grüße
MaggieMay

hooKa

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:


Markieren tut er mir das:


Ist irgendwas am Code falsch?

MaggieMay

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.
Freundliche Grüße
MaggieMay

hooKa

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:


Weißt du, wie man das mit VBA löst?

MaggieMay

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

Freundliche Grüße
MaggieMay

hooKa

Danke für den Code Maggie, aber er gibt mir eine Fehlermeldung aus:



Das streicht er mir an:


DF6GL

Hallo,

lies nochmal den Beitrag von MaggieMay  und setz den Vorschlag korrekt um.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

hooKa

@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).

DF6GL

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.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

hooKa

@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.

DF6GL

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.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

hooKa

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?