Hallo,
ich würde gerne Wissen ob es möglich wäre ein Bericht bzw. eine Befehlsschaltfläche von Access direkt in Excel zu betätigen?
Gruß
Im Prinzip kannst Du Dein Access-Frontend von Excel aus automatiseren. Um guten Stil zu bewahren, sollte man den Code, der sich hinter dem Knopf-Klick verbirgt, in einer öffentlichen Methode zugänglich machen und den Knopf diese Methode aufrufen lassen. Mittels Automation kann diese öffentliche Methode des Formulars aufgerufen werden.
In einem Excelmodul:Sub Test()
With GetObject("c:\temp\Datenbankname.mdb") 'oder ..\Datenbankname.accdb
'Mitarbeiterformular öffnen
.DoCmd.OpenForm "frmMitarbeiter" 'Mitarbeiterformular wieder schließen
.Forms("frmMitarbeiter").SchliesseFormular 'Datenbank + Access schließen ohne Design-Änderungen abzuspeichern
.Quit 2 'SaveNone
End With
End Sub
Im Access-Formularmodul:'Diese Methode wird von Excel aufgerufen
Public Sub SchliesseFormular()
If Me.Dirty Then
MsgBox "Bearbeitete Daten vor dem Schließen des Formulars speichern?", vbExclamation
Else
DoCmd.Close acForm, Me.Name, acSaveNo
End If
End Sub
Private Sub cmdClose_Click()
SchliesseFormular
End Sub
Hallo,
das funktioniert ja schon mal sehr gut :)
jetzt fehlt nur noch die Funktion mit der ich direkt aus Excel aus dem geöffnetem Formular noch eine Befehls Schaltfläche betätigen kann.
Im Normalfall stünde der Code der öffentlichen (Public) Methode SchliesseFormular() innerhalb der privaten (Private) Methode cmdClose_Click(). Um keine Artefakte auszulösen (das ist zwar beim Knopfklick-Ereignis nicht zu erwarten), sollte man nie (auch intern intern) eine Ereignis-Prozedur direkt aus dem Code aufrufen, sondern den Code in eine entsprechende Methode auslagern, die dann sowohl von der entsprechenden Ereignis-Prozedur als auch von anderen Stellen im Code aufgerufen werden kann. Weil es sich hier um diese öffentliche Methode der Formular-Klasse handelt, kann dsiese natürlich auch extern aus einem anderen Modul und auch per Automation aufgerufen werden.
Access-Code zur Verdeutlichung mit einem fiktiven Knopf namens cmdDruckeAlleMitarbeiter:
(Ausgangslage)Private Sub cmdDruckeAlleMitarbeiter_Click()
DoCmd.OpenReport "rptMitarbeiterliste"
End Sub
(schlechter Stil - funktioniert aber)Public Sub cmdDruckeAlleMitarbeiter_Click()
DoCmd.OpenReport "rptMitarbeiterliste"
End Sub
(guter Stil - erfordert eine neue Methode)
Private Sub cmdDruckeAlleMitarbeiter_Click()
'Modifikation: Code wird umgeleitet
DruckeAlleMitarbeiter
End Sub
'neu anlegen. Weil Public, kann die Methode automatisiert werden.
Public Sub DruckeAlleMitarbeiter()
DoCmd.OpenReport "rptMitarbeiterliste"
End Sub
PS: am besten zeigst Du einmal den bisherigen Access-Code hinter dem Knopf. Vielleicht kann man sich das Öffnen des Formulars auch ganz sparen.
das habe ich aktuell in meiner Ecxel:Sub Schaltfläche1_Klicken()
With GetObject("C:\Users\mancflor\Desktop\Excel, Accses\Label_Generator_V6.accdb") 'oder ..\Datenbankname.accdb
'Mitarbeiterformular öffnen
.DoCmd.OpenForm "Tabelle" 'Mitarbeiterformular wieder schließen
End With
End Sub
und in Access Habe ich einen Makro-Generator der so aufgebaut ist
AusführenMenübefehl
Befehl Aktualisieren
ÖffnenBericht
Berichtsname Regallabel_FC
Ansicht Seitenansicht
Fenstermodus Normal
AusführenMenüBefehl
Befehl DruckenObjekt
FensterSchließen
Objekttyp Bericht
Objektname Regallabel_FC
Speichern Nachfragen
kann man in den bestehenden VBA Code nicht erweitern?
da ich für den Button bzw. für meine Befehlsschaltfläche kein VBA Code habe.
Mein Grundgedanke war, um es zu verstehen, Daten aus Excel in Access zu Importieren davor aber die Tabelle leeren und anschließend das was in der Tabelle ist aus einem Bericht drucken.
Ich wollte mir das manuelle öffnen der Access ersparen.
Zum leeren der Tabelle habe ich folgendes benutzt:
Private Sub Bild56_Click()
DoCmd.RunSQL "DELETE * from Label;", False 'Löschen aller DS
End Sub
für den Import habe ich folgendes Benutzt:
Private Sub Bild52_Click()
'Unset warnings
DoCmd.SetWarnings False
'SQL delete statement
DoCmd.RunSQL "DELETE * FROM Label"
'Import spreadsheet
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "Label", selectFile, True
DoCmd.SetWarnings True
Dim tdf As DAO.TableDef
For Each tdf In CurrentDb.TableDefs
If IsNumeric(Right(tdf.Name, 1)) Then
CurrentDb.TableDefs.Delete tdf.Name
End If
Next
DoCmd.DeleteObject acTable, "Fehler beim AutoSpeichern von Objektnamen"
DoCmd.DeleteObject acTable, "Vorlage$_Importfehler"
End Sub
ich weiss nicht ob das möglich ist alles in allem auch in der Reihenfolge mit einem Knopfdruck in Excel funktionieren zu lassen.
soweit bin ich mittlerweile
das öffnen und leere der Tabelle funktioniert auch soweit
das Importieren wird komplett übersprungen weis leider nicht warum :(
das öffnen der Tabelle geht dann aber
Fehlermeldung bekomme ich hier auch keine
Sub Schaltfläche1_Klicken()
With GetObject("C:\Users\mancflor\Desktop\Excel, Accses\Label_Generator_V6.accdb") 'oder ..\Datenbankname.accdb
'Mitarbeiterformular öffnen
'Unset warnings
.DoCmd.SetWarnings False
'SQL delete statement
.DoCmd.RunSQL "DELETE * FROM Label"
Exit Sub
On Error GoTo 0
.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "Label", _
CurrentProject.Path & "C:\Users\mancflor\Desktop\Excel, Accses\Labelvorlage_Neu.xlsx", True
.DoCmd.OpenForm "Tabelle" 'Mitarbeiterformular wieder schließen
End With
End Sub
Exit Sub, sorgt dafür, dass die Methode bedingungslos beendet wird.
Prinzipell würde ich die Geschichte neu strukturieren und auch keine Mischung von VBA- und Makro-Code vornehmen.
Vorschlag: Verknüpfe die Excel-Liste im Frontend der DB. Dann sollten immer aktuelle Daten vorliegen und es kann auf Löschen/Import verzichtet werden. Im Endeffekt sollte dann ein einfaches .DoCmd.OpenReport "DerBerichtsname"
zum Ausdrucken genügen - ein Formularhandling ist dazu nicht notwendig.
Ich habe deinen Ratschlag mal berücksichtigt
Funktioniert wunderbar!