Excel per Acces ausführen
Hi
Code:
Ich habe folgenden Code:
Sub mytests()
Dim oXcl As New Excel.Application, ws As Excel.Worksheet
With oXcl
' ab hier ist reines Excel, mit "." beginnen
.Workbooks.Open FileName:="C:\Dokumente und Einstellungen****.xlsm"
.Visible = True
.Run "Modul1.import"
.ActiveWorkbook.Save
.Quit
End With
End Sub
wie man sieht öffnet der eine excel datei, die ein makro ausführt.
aber ich möchte, das er eine neue excel datei anlegt, die ich dann mit einem späterm befehl wieder lösche.
und es würde mich auch interessieren, wie der code aussehen würde, wenn ich die excel tabelle gleich in access importieren würde
gruß, der der eine frage hat
Antwort schreiben
Antwort 1 von RalfH vom 08.08.2019, 06:59 Options
Hallo und guten Morgen Michele,
Hiermit öffnest Du eine Excel Instanz, und falls keine geöffnet ist, wird eine neue erstellt. Anschließend kannst Du mit Deinem Code weiterarbeiten. Verweiß auf Excel nicht vergessen.
Sub tr()
Dim Save As Boolean
Dim ExcelApp As Excel.Application
Dim wbNew As Excel.Workbook
Save = False '(bzw. True)
'Excel Objekt
On Error Resume Next
If Save Then
Set ExcelApp = New Excel.Application
Else
'Vorhandene Excel-Instanz nutzen
Set ExcelApp = GetObject(, "Excel.Application")
'Ansonsten neue Instanz erstellen
If Err.Number > 0 Then
Set ExcelApp = CreateObject("Excel.Application")
Err.Clear
End If
ExcelApp.Application.Visible = True
End If
'Neue Arbeitsmappe erstellen
ExcelApp.SheetsInNewWorkbook = 3
Set wbNew = ExcelApp.Workbooks.Add
If Save Then
'Arbeitsmappe speichern
wbNew.SaveAs "Output \ Datei.xls"
wbNew.Close Savechanges:=False
Set wbNew = Nothing
'Excel-Objekt freigeben
DoEvents
ExcelApp.DisplayAlerts = False
ExcelApp.Quit
ExcelApp.DisplayAlerts = True
End If
Set ExcelApp = Nothing
End Sub
Gruß Ralf
Guten morgen Ralf,
der Code hat schonmal bewirkt, das Excel eine neue Mappe öffnet.
Das wollte ich ja auch. Danke
Aber, was bewirkt das hier?
DoEvents
ExcelApp.DisplayAlerts = False
ExcelApp.Quit
ExcelApp.DisplayAlerts = True
End If
Und jetzt hab ich noch eine Frage.
In meinen ersten Code hab ich ein Makro ausführen lasssen, was jetzt ja nicht mehr geht, da ich eine neue Mappe erstellt hab.
Wie führe diesen Makro aus oder gebe ihn weite an Excel
ActiveWorkbook.XmlImport URL:= _
"http://www.ecb.int/stats/eurofxref/eurofxref-hist.xml", _
ImportMap:=Nothing, Overwrite:=True, Destination:=Range("$A$1")
Ich versteh den ganzen Code noch nicht ganz, aber bedeutet diese zeile
wbNew.Close Savechanges:=False
dass er die Mappe nicht speichert, egal, ob ich was verändert hab?
Aber ich muss diese Mappe ja speichern, damit Access sie importieren kann und später muss ich sie wieder löschen.
Nochmal Danke
Antwort 3 von RalfH vom 09.08.2019, 06:37 Options
Guten Morgen Michele zum 2. ;-)
Im Code selbst kannst Du ja angeben, das er eine bestimmte Excel instanz öffnen soll
.Workbooks.Open FileName:="C:\Dokumente und Einstellungen****.xlsm"
.Visible = True
.Run "Modul1.import"
, natürlich bevor die Überprüfung des Codes ausgeführt wird.
Sollte die Instanz nicht geöffnet sein, wird eine neue Instanz geöffnet.
Gruß Ralf
Noch mal Danke Ralf und guten Morgen, hab trotzdem noch ein Problem.
Wenn ich mein Programm woanders ausprobiere, muss ich immer erst Verweise setzten. Kann ich die irgendwie automatsch setzten?
Und wenn nicht, was muss ich am folgenden Code ändern, damit es sich nicht auf die Excel bibliothek bezieht? (Weiß das dass geht ;-) )
Da ich den Code nicht selbstgemacht ab und an manchen stellen verstehe bekomm ich das nicht selber hin.
Sub excelstart()
Dim Save As Boolean
Dim ExcelApp As Excel.Application
Dim wbNew As Excel.Workbook
Save = False '(bzw. True)
'Excel Objekt
On Error Resume Next
If Save Then
Set ExcelApp = New Excel.Application
Else
'Vorhandene Excel-Instanz nutzen
Set ExcelApp = GetObject(, "Excel.Application")
'Ansonsten neue Instanz erstellen
If Err.Number > 0 Then
Set ExcelApp = CreateObject("Excel.Application")
Err.Clear
End If
ExcelApp.Application.Visible = False
End If
'Neue Arbeitsmappe erstellen
ExcelApp.SheetsInNewWorkbook = 3
Set wbNew = ExcelApp.Workbooks.Add
ExcelApp.Run import()
'If Save Then
'Arbeitsmappe speichern
ExcelApp.ActiveWorkbook.SaveAs ("UpdateDatei.xls")
'ExcelApp.SaveWorkspace '"Output \ Datei.xls"
'wbNew.SaveAs "Output \ Datei.xls"
'wbNew.Close Savechanges:=True
Set wbNew = Nothing
'Excel-Objekt freigeben
DoEvents
ExcelApp.DisplayAlerts = False
ExcelApp.Quit
ExcelApp.DisplayAlerts = True
'End If
Set ExcelApp = Nothing
End Sub
Antwort 5 von RalfH vom 09.08.2019, 14:02 Options
Hallo,
Was meinst Du mit woanders ausprobiere?
Im Netzwerk! Standalone Rechner ?
Ralf
Na ja beides, im Netzwerk für meine Arbeitskollegen und alleine für mich oder jemand anderes. Wenns nicht anders geht, musss ich wohl jedes mal die Bibliothek freichschalten -.-
Gruß der der eine frage hat
Antwort 7 von RalfH vom 09.08.2019, 14:52 Options
Servus Michele,
Warum teilst Du nicht die Datenbank auf, und stellst das Backend auf nem Server zu verfügung?
Gruß Ralf
Hi Ralf,
also mal zur meiner Datenbank, ich habe einen Währungsumrechner gebastelt ( am 1. August hatte meine Ausbildung angefangen).
Dieser Währungsumrechner erstellt (fast) jedes mal eine Excel Mappe.
In diese Excel Mappe lädt er sich automatisch die aktuellen Währungskurse runter (aus einer xml Datei)
Die Excel Datei mit der Tabelle importiert er in Access in eine Tabelle, namens tbl_001_valuetable.
Aus diser Tabelle heraus funktionieren meine Formulare.
Zuallererst versteh ich noch nicht mal wo mein backend ist, wen ich überhaupt eins hab, da der währungsrechner bei jedem start die tbl_001_value erneuert bzw löscht und wieder erstellt.
Un selbst wenn ich einen server machen würde, hilft mir das dann weiter bei meinem Problem mit dem Verweisen?
Übrigens wegen Aufteilen, ich hatte schon mal ausprobiert, das meine Datenbank einfach die Daten aus einer Excel Tabelle holt(ohne sie in Access zu importieren.
Das Resultat war, das er knapp 2 minuten gerechnet hat.
Du musst dir vorstellen, diese DAtenbank hat währungskurse bis 1999!!!
Für jeden Tag 37 Währungen!!!
Kein wunder, das er so lange braucht wenn er die Daten woanders herruft, ist die Tabelle intern geht das so schnell wie ein Flitze-bogen^^
Gruß ichhabeinefrage
so ich hab dass mit den verweisen jetzt mal über last binding ausprobiert.
Ich verstehe aber noch nicht ganz die Last binding methode:
Was muss ich hier ändern:
Set ExcelApp = New Excel.Application
Antwort 10 von RalfH vom 10.08.2019, 09:14 Options
Guten Morgen Michele,
Grundsätzlich sollte man eine Datenbank aufteilen, wenn mehrere User daran arbeiten.
Bei MS Access ist das wirklich sehr einfach, da man dafür einen Assistenten hat ( Extras-Datenbank Dienstprogramm-Assistent zur Datenbank Aufteilung).
Die Datenbank wird in ein sogenanntes Frontend und einem Backend aufgeteilt.
Das Backend beinhaltet die Tabellen, Tabellenstrukturen.
Das Frontend beinhaltet die Formulare, Berichte, VBA Codes.
So hat man mit MS Access zum Beispiel die Möglichkeit, sehr Komfortabel sogar, auf ein anderes Datenbanksystem z.B. MS SQL, MySQL,PostgreSQL, usw. zuzugreifen, und mit Access die Frontends zu erstellen.
Das Frontend kann ich an die User verteilen, und alle greifen auf die selbe Tabelle zu.
Was hilft es Dir wenn Du z.B. 5 ganze DB`s verteilt hast, und hast 5 verschiedene Datenbestände ?
So kann man z.B. prüfen lassen, ob die Tabelle tbl_001_valuetable schon Heute aktualisiert wurde, und wenn ja, müssen die anderen das Prozedere nicht mehr machen, da sie ja mit ihrem Frontend auf dieselbe Tabelle zugreifen.
Sollte die Tabelle mal defekt sein, kannst du in Sekunden schnelle eine Sicherungs-Kopie ( die Du hoffentlich anlegen läst einspielen), und die anderen können sofort wieder darauf zugreifen.
Gruß Ralf