Access hat den Eingabevorteil über detaillierte benutzerdefinierte
Eingabeformulare bzw. Berichtswesen, sodass nur Excel auch keine
Alternative für mich ist.
Vielen Dank für die Mühe.
wBenk schrieb folgendes:
Lese Access-FAQ Punkt 7.22
--
Gruß
Gunter
_________________________________________________
Access FAQ: http://www.donkarl.com
home: http://www.avenius.com
> Ich wende Access 2003 + Excel 2003 SP 2 an und habe seit der
> Installation von SP 2 das Problem, dass Access die Daten nicht mehr in
> die als Datenquelle verknüpfte Excel-Tabelle schreibt.
> Diese Funktionalität wurde von Microsoft eingeschränkt
> (Prozessfolge).
> Kann mir jemand den Weg aufzeigen, wie man das jetzt bewerkstelligen
> kann.
Die FAQ hilft: http://www.donkarl.com/FAQ/FAQ7Bugs.htm#7.22
Servus
Winfried
--
KnowHow.mdb: http://www.freeaccess.de/knowhow.asp
Access-FAQ: http://www.donkarl.com/AccessFAQ.htm
Access-Stammtisch: http://www.access-muenchen.de/
Richtig zitieren: http://einklich.net/usenet/zitier.htm
"Es gibt keine Umgehungsmöglichkeit mit eingebundenen Tabellen.
Wenn die Funktionalität sehr wichtig ist, kannst du abwägen, ob die
entsprechenden Service Packs, die natürlich andere Probleme beheben,
installiert werden sollen.
Ansonsten bleibt nur das Importieren und Exportieren der Excel-Daten
oder die Nutzung von Excel, also Automatisierung oder komplette
Auslagerung der Funktionalität".
Wenn es so nicht mehr geht - hat jemand Erfahrung mit
benutzerdefinierten Formularen in Excel - mir ist nur die Möglichkeit
benutzerdefinierter Ansichten und Masken bekannt - diese führen jedoch
teilweise zu unbefriedigenden Ergebnissen.
Kann man Formulare über Excel in der Art von Access aufbauen?
> Ich wende Access 2003 + Excel 2003 SP 2 an und habe seit der
> Installation von SP 2 das Problem, dass Access die Daten nicht mehr in
> die als Datenquelle verknüpfte Excel-Tabelle schreibt.
mal blöd gefragt, wer zwingt dich denn, DIREKT in eingebundene
Excel-Tabellen zu schreiben ?
Wo bitte ist denn der Unterschied (für den Endbenutzer), wenn du die Daten
(aus Excel) zuerst in eine Temp-Tabelle importierst, dann den Benutzer in
einem Formular mit der Temp-Tabelle arbeiten lässt und zum Exportieren dann
eine Abfrage erzeugst, und mittels dieser Abfrage dann (ganz einfach mit
Transferspradsheet) ein Excel-Spreadsheet rausschreibst ?
<Achselzuck> Finde ich irgendwie nicht sonderlich "spannend" oder schwierig
oder so.
--
mfg
Klaus Oberdalhoff KO...@gmx.de
Ich beantworte keine NG-Fragen und -Nachfragen per Mail!
Newbie-Info: http://www.doerbandt.de/Access/Newbie.htm
KnowHow-mdb und andere Beispiele: http://www.freeaccess.de
Sofern Access 200x bitte beachten:
http://www.freeaccess.de/MS-Access-Artikel.asp?ID=99
Ich unterstütze PASS Deutschland e.V. (http://www.sqlpass.de)
Als zweiten Grund benutze ich Acces zum Drucken mittels Bericht, da
hier Steuerelemente mehrzeilig mit indiv. Größen plaziert werden
können.
Am besten wäre eine Lösung nur in Access - hier bin ich jedoch an den
rechnerischen Anforderungen gescheitert, da das Ergebnis eines
Datensatzes im nächsten Datensatz als Ausgangsbasis genommen werden
muss (was in Excel problemlos über Verknüpfungen funktioniert).
... aber vielleicht bin ich einfach nur ein zu doofer User?
-------------------------------------------------------------------
Klaus Oberdalhoff wrote:
> Hi,
... und der Herr schaute Ihn lange und andächtig an und sagte nach langem
Schweigen ....
Aha, ein Controller !
(leicht abgewandelt aus: Ein Münchner im Himmel)
a) Excel als Datenhaltung zu verwenden, wenn man als Frontend eh Access
einsetzt, finde ich pervers, um ehrlich zu sein
b) Günther Ritter ( ehemals ostfrieslandweb.de) meinte einst (so irgendwann
1997 / 98 rum) in einer FAQ zu Excel 97: <Quote>
Auf- oder abrunden in ACCESS97 mit EXCEL - Nun, eigentlich ganz einfach. Nur
bisher wenig bekannt: In A97 stehen auch die Funktionen von EXCEL zur
Verfügung. Und nicht nur in A97, es funktioniert auch in A95.
Damit es funktioniert, ist es erforderlich im Modul unter Extras/Verweise
den Verweis auf die EXCEL 8.0 Object Library anzukreuzen. Das ist übrigens
die EXCEL8.OLB! Und wie gesagt, ein Verweis darauf wird auch von A95
akzeptiert!
a=Wert, b=Anzahl Stellen </Quote>
Dass dies auch in allen neueren Excel-Versionen funktioniert, sollte klar
sein <g>
c) Nichts von dem, was hier von dir gesagt wurde, hindert dich daran, die
Daten in einer Tabelle abzuspeichern (mein heisser Tip in diesem Falle wäre
die Benutzung eines Unterformulars mit der Standardansicht "Datenblatt") und
dann via Office-Automation die Werte ggf einzeln in Excel einzustellen.
d) Der Programmieraufwand ist dann am geringsten, wenn man von vorneherein
versucht, "an den Systemen entlang" zu programmieren, und nicht auf Biegen
und Brechen versucht "seinen Kopf" durchzusetzen. (Aber das setzt natürlich
eine gewisse Systemkenntnis voraus <g>)
e) Office XP: Automation Help File (XPAutomation.exe)
--------------------------------------
Zu Klaus Oberdalhoff wrote.......
> - was bewirkt der Verweis - kann
> man dann in Access-Tabellen rechnen wie in Excel?
Ein gutes deutsches Jaein. Dieser Verweis bewirkt, dass man ALLE Funktionen,
die im Excel-Objektmodell _via VBA_ erreichbar sind, auch in jedem anderen
Programm, das diese Einbindung erlaubt, verwenden kann.
Was ich damit sagen will: alle VBA-Funktionen von Excel kann man dann in
Access (oder Word oder so) verwenden, aber nicht unbedingt so, wie sie
direkt in Excel in der =Zeile eingegeben werden (d.h. wie ein "Excelianer"
es gewohnt ist).
Die meisten (fast alle ?) Excel-Funktionen sind mW auch via VBA erreichbar
(aber ob 100%, das weiss ich nicht).
Verweis auf die jeweilige Excel-Library muss gesetzt sein (bei Excel 2003
ist es beispielsweise die "Microsoft Excel 11.0 Object Library") damit die
folgenden Beispiele funktionieren (Möglicherweise hilft auch der Text der
Access-FAQ (www.donkarl.com) unter Punkt 7.1 / 7.11 <obwohl er dort in einem
anderen Zusammenhang steht> weiter ?)
Zwei einfache Beispiele (aus der guten alten KnowHow <siehe Signatur>)
Function Abrunden(A, B)
'a=Wert, b=Anzahl Stellen
Abrunden = Excel.WorksheetFunction.RoundDown(A, B)
End Function
Function Testtage(A As Date, B As Date)
'A = Von Datum B = Bis Datum
Testtage = Excel.WorksheetFunction.Days360(A, B, True)
End Function
Walter Benkelmann <w.benk...@eislingen.de> schrieb:
> Sehr hilfreich - also doch zu doof - ich muss es auf diesem Weg wohl
> aufgeben - da hier nur Volldurchblicker vertreten sind.
Klaus macht Dir doch einen sehr konkreten Vorschlag zur Lösung Deines
Dilemmas. *Du* gehst mit Deiner Antwort jedoch in keiner weise darauf
ein.
Er schlägt vor, dass Du die Daten erst in eine temporäre Tabelle
importierst. Schau Dir hierzu in der OH mal den Befehl
TransferSpreadSheet näher an.
Die Datenquelle für das Formular zur Bearbeitung ist dann eben nicht die
verknüpfte Excel-Tabelle sondern die temporäre Tabelle.
Wenn Du die Daten am Ende wieder in Excel brauchst kannst Du sie wieder
(aus der temporären Tabelle) exportieren.
> Mir fehlen wohl etwas die Kenntnisse - was bewirkt der Verweis - kann
> man dann in Access-Tabellen rechnen wie in Excel?
Von welchem Verweis sprichst Du hier?
Verabschiede Dich bitte von dem Gedanken, das Du in Access-Tabellen
rechnen willst.
CU
--
Thomas
Homepage: www.Team-Moeller.de
Thomas sagte das ganz richtig - danke - mein Fehler -
In Tabellen kann man natürlich NICHT rechnen, dafür benötigt man schon
Formulare etc. Tabellen sind etwas, das der Endanwender bei beiner
vernünftig programmierten Lösung nie direkt zu Gesicht bekommt, IMMER nur
die Formulare.
Daher auch mein Tipp in einem meiner vorherigen Postings für
(Unter)Formulare möglichst die "Datenblattansicht" zu verwenden (wirken wie
Tabellen, sehen aus wie Tabellen, sind aber keine Tabellen - und sind mit
dem Formularwizard auch schnell erstellt).
Thomas Möller <Thomas_N_...@Team-Moeller.de> schrieb:
> Verabschiede Dich bitte von dem Gedanken, das Du in Access-Tabellen
ich spende ein "s".
Gruß
--
Ingrid
> Von welchem Verweis sprichst Du hier?
<uups>, meine Formatierung war wohl zuu gut <g>
Ich hatte, ausser meiner bissigen Bemerkung zu Controllern <g> weiter unten
(scrolling) in diesem Posting durchaus noch "brauchbare" Infos drinnen.
Einer davon war, mittels ... ach joo ... kannst es ja nachlesen, zu faul, es
zu wiederholen <g>
> Verabschiede Dich bitte von dem Gedanken, das Du in Access-Tabellen
> rechnen willst.
Jupp, das ist vollkommen richtig, in Tabellen rechnet man nicht. Danke für
den Hinweis.
Walter Benkelmann schrieb:
> kann
> man dann in Access-Tabellen rechnen wie in Excel?
nein!
Eine handgeschriebene Tabelle auf einem Blatt Karopapier,
eine Tabelle in Word,
eine Tabelle in Excel,
eine Tabelle in Access,
eine Tabelle in einem HTML-Dokument,
ein Straßenbahn-Fahrplan
- es sind zwar alles Tabellen, aber zwischen einer Textverarbeitung,
einem Tabellenkalkulationsprogramm, einem Datenbankprogramm und einem
Browser bestehen eben immense Unterschiede. Von einem Stückchen
Notizblock oder den allseits beliebten Sudoku-Rastern (auf 9 Spalten und
9 Zeilen begrenzte Tabellen) mal ganz zu schweigen.
In Access z.B. sind die Tabellen nur die Töpfchen, in denen die guten
Linsen abgelegt werden. Alles andere (also z.B. das Kochen der Linsen,
will sagen: das Aufbereiten der Daten) geschieht in einem anderen Gefäß.
In Access verwendet man dazu Formulare, Berichte und mitgelieferten oder
selbstgeschriebenen Code.
Wie bei Aschenputtel: sie sagt zwar - des Reimes willen - "Die guten ins
Töpfchen, die schlechten ins Kröpfchen", tatsächlich aber finden sich
die guten in einer Schüssel.
Merke also: nicht immer, wenn von einem Töpfchen die Rede ist, ist auch
ein solches gemeint. Nicht alles, was sich Tabelle nennt, ....
mfg,
Michel
Beim Problemsichten bin ich auf folgende Programmierung gestoßen:
Verknuepfte Excel-Tabellen in Access wieder aktualisieren
Teil 1
------------------------------------
Versionen: Access 2003 und 2002/XP
Nach der Installation des Service Pack 2 fuer Office 2003 oder des
Hotfixes KB904018 vom 18.10.2005 fuer Access 2002/XP lassen sich
verknuepfte Excel-Tabellen nicht mehr aktualisiert werden. Beim
Versuch, einen Feldinhalt zu aendern, ist lediglich ein akustischer
Hinweis zu hoeren, eine Fehler- oder Statusmeldung wird nicht
ausgegeben.
Viele Access-Anwender stehen damit vor ernsthaften Problemen, da
unzaehlige Loesungen, die auf dieser Technologie basieren, von heute
auf morgen nicht mehr funktionieren. In unserem zweiteiligen Tipp der
Woche stellen wir Ihnen eine Technik vor, mit der sich das Problem zwar
nicht komplett loesen, aber zumindest etwas kompensieren laesst.
Microsoft schlaegt in einem Knowledge Base-Artikel zu diesem Thema vor,
die betreffende Excel-Tabelle in Access zu importieren, die
gewuenschten Aenderungen vorzunehmen und die Access-Tabelle dann wieder
in eine Excel-Arbeitsmappe zu exportieren. Das mag in einigen wenigen
Faellen praktikabel sein, aber wenn Sie Aenderungen zum Beispiel
taeglich vornehmen muessen, ist dieser Weg zu umstaendlich. Wichtig
waere eine automatische Technik, um die Excel-Tabelle beim Oeffnen der
Datenbank zu importieren und die geaenderten Daten beim Verlassen der
Anwendung wieder in die Tabelle zu
exportieren:
1. Loeschen Sie zunaechst die Verknuepfung mit der Excel-
Tabelle im Bereich "Tabellen" des Datenbankfensters.
2. Legen Sie ein Modul "modExcelImpExp" an und geben Sie die
folgenden Funktionen ein:
Function ImportExcelTab(strWorkbook As String, _
strExcelTabName As String, _
strAccTabName As String)
On Error Resume Next
ImportExcelTab = False 'Vorgabe: Problem
DoCmd.SetWarnings False
DoCmd.RunSQL "DROP TABLE " & strAccTabName
DoCmd.SetWarnings True
Err = 0
DoCmd.TransferSpreadsheet acImport, _
acSpreadsheetTypeExcel8, _
strAccTabName, strWorkbook, True, _
strExcelTabName & "!"
If Err <> 0 Then
Beep
MsgBox "Fehler beim Importieren von '" & _
strWorkbook & _
"' (Tabelle: " & strExcelTabName & ")" & _
vbCrLf & vbCrLf & Err.Description, _
vbOKOnly + vbExclamation, "!!! Problem !!!"
Else
ImportExcelTab = True
End If
End Function
Function AddSlash(aPath As String) As String
AddSlash = aPath
If Trim$(aPath) = "" Then Exit Function
If Right$(aPath, 1) = "\" Then Exit Function
AddSlash = aPath + "\"
End Function
Function GetDataBasePath() As String
Dim db As DAO.Database, L As Integer, aPath As String
Set db = CurrentDb()
aPath = db.Name
L = Len(aPath)
While Mid$(aPath, L, 1) <> "\" And L > 0
L = L - 1
Wend
If L > 1 Then
aPath = Left$(aPath, L)
Else
aPath = ""
End If
GetDataBasePath = aPath
End Function
Function PathOnly(strPath As String) As String
Dim L As Integer
PathOnly = ""
If InStr(strPath, "\") = 0 Then Exit Function
L = Len(strPath)
While Mid$(strPath, L, 1) <> "\" And L > 0
L = L - 1
Wend
If L > 1 Then PathOnly = Left$(strPath, L)
End Function
3. Setzen Sie ueber EXTRAS-VERWEISE eine Referenz auf
"Microsoft DAO Object Library 3.6" und auf "Microsoft
Excel x.0 Object Library" (x.0= 11.0 fuer Excel 2003,
10.0 fuer Excel 2002/XP).
4. Legen Sie ein "AutoExec"-Makro an oder ergaenzen Sie ein
vorhandenes "AutoExec"-Makro um die folgende Aktion:
Aktion: AusfuehrenCode
Funktionsname: ImportExcelTab("<Arbeitsmappe>", "<ExcelTabelle>",
"<AccessTabelle>")
Fuer "Arbeitsmappe" geben Sie Pfad und Dateiname der Excel-
Arbeitsmappe an, aus der eine Tabelle importiert werden soll.
"ExcelTabelle" spezifiziert das zu importierende Tabellenblatt und
"AccessTabelle" ist der Name der Tabelle, in die die Daten importiert
werden. Diese Tabelle muss nicht vorhanden sein, vielmehr wird sie von
der Funktion "ImportExcelTab()" bei Vorhandensein geloescht.
5. Speichern Sie das Makro und verlassen Sie den
Makroentwurf.
Damit ist zunaechst der Mechanismus aufgebaut, der eine Excel-Tabelle
beim Oeffnen der Datenbank importiert. Das geschieht kuenftig mit Hilfe
der Funktion "ImportExcelTab()"
wie folgt: Im ersten Schritt wird die Tabelle geloescht, in die die
Daten aus der Excel-Tabelle importiert werden sollen. Andernfalls
wuerde die folgende Ausfuehrung von "DoCmd.TransferSpreadsheet"
scheitern, da es keine vorhandenen Tabellen ersetzen oder
ueberschreiben kann. Das Loeschen der Tabelle uebernimmt eine
SQL-Anweisung, die per "DoCmd.RunSQL" nicht nur schneller ausgefuehrt
wird, sondern wesentlich einfacher ist, als das uebliche Loeschen ueber
die "TableDefs"-Auflistung. Per "DoCmd.SetWarnings" schalten wir zuvor
Sicherheitsabfragen von Access aus und anschliessend wieder ein. Der
zweite Schritt besteht dann darin, per "DoCmd.TransferSpreadsheet" aus
der jeweiligen Arbeitsmappe (Parameter "strWorkbook" die gewuenschte
Excel- Tabelle (Parameter "strExcelTabName") in die Access-Tabelle
(Parameter "strAccTabName") zu uebertragen. Wichtig ist dabei, dass der
Name der Excel-Tabelle um ein Ausrufezeichen ergaenzt wird, damit Excel
erkennt, dass ein komplettes Tabellenblatt adressiert wird. Kommt es
beim Import zu einem Fehler, wird dieser entsprechend angezeigt.
Testen koennen Sie den Import bei Bedarf mit folgender
Prozedur:
Sub TestImport()
Dim strPath As String
Dim strFName As String
Dim strTabRange As String
Dim fOK As Boolean
strPath = GetDataBasePath()
strFName = AddSlash(strPath) & "Testmappe.xls"
strTabRange = "Tabelle1"
fOK = ImportExcelTab(strFName, _
strTabRange, _
"ExcelImport")
End Sub
Verknuepfte Excel-Tabellen in Access
wieder aktualisieren, Teil 2
------------------------------------
Versionen: Access 2003 und 2002/XP
Wie bereits berichtet lassen sich nach der Installation des Service
Pack 2 fuer Office 2003 oder des Hotfixes KB904018 vom 18.10.2005 fuer
Access 2002/XP verknuepfte Excel- Tabellen nicht mehr aktualisieren. In
unserem zweiteiligen Tipp der Woche stellen wir Ihnen eine Technik vor,
mit der sich das Problem zwar nicht komplett loesen, aber zumindest
etwas kompensieren laesst.
Im ersten Teil dieses Tipps der Woche ging es dabei um den
automatisierten Import einer Excel-Tabelle beim Oeffnen einer
Datenbank. Nun muss die Excel-Tabelle noch automatisch beim Schliessen
der Datenbank exportiert werden.
Access stellt mit dem "AutoExec"-Makro zwar eine Moeglichkeit bereit,
Aktionen beim Oeffnen einer Datenbank automatisch auszufuehren, aber
ein "AutoClose"-Makro bzw.
einen vergleichbaren Mechanismus, der beim Schliessen Aktionen
automatisch ausfuehrt, gibt nicht. Fuer den Export der geaenderten
Excel-Daten muessen wir also zu einem Trick
greifen: Wir setzen ein Formular ein, das beim Oeffnen der Datenbank
automatisch versteckt ueber "AutoExec" geladen wird. Beim Verlassen der
Datenbank schliesst Access der Reihe nach alle offenen Formulare und
ruft dabei die Ereignisprozedur "Beim Schliessen" des jeweiligen
Formulars und somit auch die Ereignisprozedur des unsichtbaren
Formulars auf. Hier werden dann die fuer den Export notwendigen
Anweisungen ausgefuehrt:
1. Legen Sie in der Datenbank zunaechst ein neues, leeres
Formular an.
2. Waehlen Sie das Menue ANSICHT-EIGENSCHAFTEN an.
3. Setzen Sie die Eigenschaft "Beim Schliessen" auf den
Eintrag "[Ereignisprozedur]" und klicken Sie auf die
Schaltflaeche mit den drei Punkten, um den VBA-Editor zu
oeffnen.
4. Im VBA-Editor geben Sie nun die Anweisungen ein, die beim
Schliessen der Datenbank ausgefuehrt werden sollen:
Private Sub Form_Close()
Dim strPath As String
Dim strFName As String
Dim strExcelTabName As String
Dim strAccTabName As String
Dim fOK As Boolean
strPath = GetDataBasePath()
strFName = AddSlash(strPath) & "Testmappe.xls"
strExcelTabName = "Tabelle1"
strAccTabName = "ExcelImport"
fOK = ExportExcelTab(strFName, _
strTabRange, _
strAccTabName)
End Sub
Passen Sie die Zuweisungen zu den Variablen "strPath",
strFName", "strExcelTabName" und "strAccTabName"
entsprechend an und speichern Sie das Formular unter dem
Namen "frmAutoClose".
5. Fuegen Sie im Makro "AutoExec" am Anfang eine Aktion
"OeffnenFormular" hinzu, waehlen Sie im Feld
"Formularname" den Eintrag "frmAutoClose" und im Feld
"Fenstermodus" den Eintrag "Ausgeblendet".
6. Sichern Sie die Aenderungen am Makro und verlassen Sie
den Makroentwurf.
Wir gehen hier davon aus, dass eine Excel-Arbeitsmappe "Testmappe.xls"
im gleichen Verzeichnis wie die Datenbank gespeichert ist. Die Funktion
"GetDatabasePath()" (siehe Teil 1 des Tipps der Woche) liefert den Pfad
der Datenbank (strPath), den wir dann um den Dateinamen der Excel-
Arbeitsmappe ergaenzen (strFName). Die zu exportierenden Daten sollen
in dieser Arbeitsmappe im Tabellenblatt "Tabelle1" abgelegt werden
(strExcelTabName), der Ursprung der Daten ist die Access-Tabelle
"ExcelImport"
(strAccTabNnme). Diese Parameter uebergeben wir dann an die Funktion
"ExportExcelTab()", die Sie dazu im Modul "modExcelImpExp", das in Teil
1 des Tipps der Woche angelegt wurde, eingeben:
Function ExportExcelTab(strWorkbook As String, _
strExcelTabName As String, _
strAccTabName As String)
Dim objExcel As Excel.Application
Dim wb As Excel.Workbook
Dim ws As Excel.Worksheet
Dim strNewName As String
ExportExcelTab = False 'Vorgabe: Problem
On Error GoTo ExcelError
Set objExcel = CreateObject("Excel.Application")
Set wb = objExcel.Workbooks.Open(strWorkbook)
On Error Resume Next
Err = 0
objExcel.Visible = True
Set ws = wb.Sheets(strExcelTabName)
If Err = 0 Then
'Tabellenblatt vorhanden, umbenennen mit DZ-Stempel
strNewName = ws.Name & " " & _
Format$(Now, "yyyy-mm-dd hh-nn")
ws.Name = strNewName
ws.Move After:=wb.Sheets(wb.Sheets.Count)
Set ws = wb.Sheets.Add
ws.Name = strExcelTabName
ws.Move Before:=wb.Sheets(1)
ws.Range("A1").Select
End If
wb.Close True
Err = 0
DoCmd.TransferSpreadsheet acExport, _
acSpreadsheetTypeExcel8, _
strAccTabName, strWorkbook, True, _
strExcelTabName & "!"
If Err <> 0 Then
Beep
MsgBox "Fehler beim Exportieren von Tabelle '" & _
strAccTabName & _
"' in '" & strWorkbook & "'" & _
" (Tabelle: " & strExcelTabName & ")" & _
vbCrLf & vbCrLf & Err.Description, _
vbOKOnly + vbExclamation, "!!! Problem !!!"
Else
ExportExcelTab = True
End If
ExitFunc:
On Error Resume Next
objExcel.Quit
Set ws = Nothing
Set wb = Nothing
Set objExcel = Nothing
DoEvents
Err.Clear
Exit Function
ExcelError:
Beep
MsgBox "Fehler beim Zugriff auf Excel: " & _
Err.Description, _
vbOKOnly + vbExclamation, "!!! Problem !!!"
Resume ExitFunc
End Function
Um sicherzustellen, dass Daten in der Excel-Arbeitsmappe nicht
unwiederbringlich ueberschrieben werden, legen wir vor dem Export
grundsaetzlich eine Sicherungskopie des betreffenden Tabellenblattes
unter dem urspruenglichen Namen an; ergaenzt um einen
Datums-/Zeitstempel. Dazu wird die Excel-Arbeitsmappe per Office
Automation geoeffnet, das Tabellenblatt ueber die "Sheets"-Auflistung
adressiert und wie erlaeutert umbenannt. Danach verschieben wir es mit
der Methode "Move" ans Ende der Tabellenblaetter. Anschliessend legen
wir ein neues Tabellenblatt an, benennen es wie das Tabellenblatt, in
das die Daten geschrieben werden sollen, verschieben es an den Anfang
der Tabellenblaetter und aktivieren die erste Zelle. Dann schliessen
wir die Arbeitsmappe wieder, damit es keine Konflikte mit dem gleich
folgenden "DoCmd.TransferSpreadsheet" gibt. Der Parameter "True" sorgt
dabei dafuer, dass die Arbeitsmappe ohne Rueckfrage "Aenderungen
speichern?" gesichert wird.
Der zweite Schritt besteht darin, per
"DoCmd.TransferSpreadsheet" die Access-Tabelle (Parameter
"strAccTabName") in die jeweilige Arbeitsmappe (Parameter "strWorkbook"
und dort in die gewuenschte Excel-Tabelle (Parameter "strExcelTabName")
zu uebertragen. Wichtig ist auch hier wieder, dass der Name der
Excel-Tabelle um ein Ausrufezeichen ergaenzt wird, damit Excel erkennt,
dass ein komplettes Tabellenblatt adressiert wird. Kommt es beim Export
zu einem Fehler, wird er angezeigt. Den Abschluss bilden dann nur noch
einige "Aufraeumarbeiten". Fuer die Fehlerbehandlung schalten wir
uebrigens zwischen individueller Behandlung (On Error Resume Next, If
Err<> 0
Then...) und einer zentralen Fehlerbehandlung fuer Excel- Zugriffe
(ExcelError) um.
Den Export koennen Sie bei Bedarf mit der folgenden Prozedur
testen:
Sub TestExport()
Dim strPath As String
Dim strFName As String
Dim strExcelTabName As String
Dim strAccTabName As String
Dim fOK As Boolean
strPath = GetDataBasePath()
strFName = AddSlash(strPath) & "Testmappe.xls"
strExcelTabName = "Tabelle1"
strAccTabName = "ExcelImport"
fOK = ExportExcelTab(strFName, strExcelTabName,
strAccTabName)
End Sub
---------------------------------------------------------------------------------------------------------------
Der Import funktioniert ja sehr gut - leider nützt die Exportfunktion
nichts, da die berechneten (Formelfelder) in Excel mit Werten
überschrieben werden und die Rechenintelligenz verloren geht.
Wie geht man hier vor?
[VIEL Text gelöscht]
is ja nett, was du da alles schreibst, es ist aber schlicht
falsch.
Dein Problem beginnt nämlich bereits beim EINLESEN
Ich habe es gerade getestet. Bereits der Import via Transferspreadsheet hat
die Formeln "zerstört" und korrekterweise nur das Ergebnis, d.h. die DATEN
nach Access kopiert.
Was folgt daraus ?
Auch in Excel sollte man die Uralt-Reihenfolge der "EDV" beachten, die da
heisst E-ingabe V-erarbeitung A-usgabe OK, das EVA-Prinzip mag nicht mehr
ganz taufrisch sein (ich kenne es eigentlich aus meinen EDV-Anfängen so aus
den 70-er Jahren des letzten Jahrtausends - da hat man sowas noch gelernt
<g>) aber es hat seine Gültigkeit mE bis heute nicht verloren.
Was hat das mit Excel zu tun und wenn wie mach' ich das - fragst du dich ?
OK, Ganz Einfach. In dem einen Tab stehen die Eingaben, im nächsten Tab
stehen die Berechnungen und im dritten Tab stehen die Ausgaben und im
vierten bis n.-ten Tab stehen die Grafiken. (OK, je nach Gusto können die
Tabs vertauscht werden, aber die Struktur der Tabs sollte beibehalten
werden)
Wenn man seine Excel-Sheets nach diesem einfachen Uralt-Schema strukturiert,
kann man die Daten einlesen, in Access verarbeiten, und dann wieder an Excel
ausgeben, ohne etwas "zu zerstören", da man ausschliesslich DATEN (und keine
Programmteile = Formeln) hin- und herschiebt.
Wenn du unbedingt das wilde Kuddelmuddel von Daten und Formeln in Excel
beibehalten willst, dann hast du folgende Möglichkeiten:
Du vergisst erst mal Transferspreadsheet, das kann nämlich nicht mit Formeln
sondern nur mit Daten umgehen (egal in welcher Richtung).
Du arbeiteitest direkt mit dem Objektmodell in Excel in dem du Dröppche for
Dröppche (= Zelle für Zelle) abprüfst, einliest und wieder ausgibst. (Dazu
habe ich schon einen Link genannt.
In einer englischen Newsgroup habe ich auch schonmal Beispielcode gepostet:
http://groups.google.de/group/microsoft.public.access.modulesdaovba/msg/6bc4301a60bdb86a?hl=de&
Wenn du Excel 2002 oder neuer hast, kannst du den Kram von Excel auch als
XML-Datei exportieren und in Access einlesen (und umgekehrt) - dadurch
würden deine Programmteile auch als "Daten" behandelt und blieben erhalten.
Aber ich glaube eigentlich nicht, dass XML-Programmierung prinzipiell
einfacher ist, als die Programmierung des Objektmodells <g>
Diese Tabelle wird auch erfolgreich in meine Access-Datenbank
eingelesen und kann mit darauf abgestimmten Formularen bearbeitet
werden.
(Als weitere Datenbasis habe ich die verknüpfte Excel-Tabelle mit
sämtlichen Werten -incl.Berechnungen- gewählt, auf welche nur die
Berichte zugreifen.)
Jetzt fehlen mir lediglich noch die Details um die Access-Tabelle (mit
Änderungen) auszulesen und das betreffende Excel-Tabellenblatt zu
überschreiben.
Kann mir jemand den Vorgang zukommen lassen?
>> [VIEL Text gelöscht]
> Kann mir jemand den Vorgang zukommen lassen?
<hmpf>
wie wär's mit sowas in der Art ? (In der Hilfe unter TransferSpreadsheet
nachschauen)
DoCmd.TransferSpreadsheet acExport, _
acSpreadsheetTypeExcel8, _
strAccTabName, strWorkbook, True, _
strExcelTabName & "!"
--
mfg
Klaus Oberdalhoff KO...@gmx.de
Ich setze Excel 2003 ein,
Access-Datenbank und Excel-Tabelle sind im gleichen Verzeichnis - muss
das mit angegeben werden?
Der Name der Excel-Tabelle ist: FAG2007_NEU; der Tabelle:
FAG-Berechnungen_Eingabe
Name der Datenbank FAG2007-NEU; der Tabelle: Eingabewerte
Wie lautet dann der komplette Code ?
Was muss noch veranlasst werden, damit der Code beim Schließen der
Datenbank ausgeführt wird?
... ich hab damit leider meine Problemchen ... Sorry ... brauchs aber
zur Vollendung.
"Walter Benkelmann" <w.benk...@eislingen.de> schrieb
>> wie wär's mit sowas in der Art ? (In der Hilfe unter TransferSpreadsheet
>> nachschauen)
>>
>> DoCmd.TransferSpreadsheet acExport, _
>> acSpreadsheetTypeExcel8, _
>> strAccTabName, strWorkbook, True, _
>> strExcelTabName & "!"
>Ich setze Excel 2003 ein,
>Access-Datenbank und Excel-Tabelle sind im gleichen Verzeichnis - muss
>das mit angegeben werden?
>Der Name der Excel-Tabelle ist: FAG2007_NEU; der Tabelle:
>FAG-Berechnungen_Eingabe
>Name der Datenbank FAG2007-NEU; der Tabelle: Eingabewerte
Hast Du schon mal in der OH (Online-Hilfe) nachgeschaut? Dazu einfach den
Cursor in das gewünschte Wort setzen und F1 drücken.
Hast Du es mal ausprobiert - eventuell mit und ohne Pfadangabe? Was ist
dabei passiert?
>Was muss noch veranlasst werden, damit der Code beim Schließen der
>Datenbank ausgeführt wird?
Schau mal bei www.donkarl.com in die FAQ 1.3. Diese Lösung kannst Du analog
anwenden.
>... ich hab damit leider meine Problemchen ... Sorry ... brauchs aber
>zur Vollendung.
Das verstehe ich ja - aber ein bischen Eigeninitiative darf auch schon
sein - oder?