PDA

Vollständige Version anzeigen : accesdaten zu excel exportieren....


darkfire
06.05.2004, 18:10
hi forum,

ich versuche daten aus einer abfrage zu einem bestehenden exceldokument zu exportieren. ich versuche den folgenden code auf meine bedürfnisse an zupassen, nur leider komme ich nicht ganz ans ziel...!

bei click auf die schaltfläche Rapportset
soll es die datei Rapport.xls öffnen Blatt1 (.xls befindet sich im gleichen verzeichnis wie die DB)
anschliessend sollen die felder aus der tabelle tabObjekt [Objekt1] ins feld A6 exportieren
und aus der abfrage abfRapport sollen alle ds vom feld [tag] in die felder D5:AH5 exportieren


Private Sub Rapportset_Click()
Dim oExcel As Excel.Application, DB As DAO.Database, RS As DAO.Recordset, I As Long
On Error Resume Next
Err.Clear
Set oExcel = GetObject(, "Excel.Application ")
If Err.Number <> 0 Then Set oExcel = CreateObject("Excel.Application")
On Error GoTo 0
With oExcel
.Visible = True
.Workbooks.Add
.ActiveSheet.Name = CStr(Me!Blatt)
Set DB = CurrentDb
Set RS = DB.OpenRecordset("abfRapport", dbOpenSnapshot)
If Me!Spaltenk Then
For I = 0 To RS.Fields.Count - 1
.Cells(1, I + 1) = RS.Fields(I).Name
Next I
.Range("A2").Select
Else
.Range("A1").Select
End If
.Selection.CopyFromRecordset RS
If MsgBox("Speichern?", vbYesNo + vbQuestion) = vbYes Then
.ActiveWorkbook.SaveAs Me!FName
Else
.ActiveWorkbook.Close SaveChanges:=False
End If
.Quit
End With
End Sub

besten dank im voraus!

greets
darkfire

jmc
06.05.2004, 20:15
Hi

...die felder aus der tabelle tabObjekt [Objekt1] ins feld A6 ...Du sprichst in Mehrzahl, gibst aber nur eine Zelle (A6) an ?
Wie soll das gehen, bzw. wie ist das gemeint ?

Dann willst du die Daten aus der Abfrage, welche ja horizontal dargestellt werden, in die Vertikale bringen ??

Kannst du das ganze etwas anschaulier erklären, möglichst mit einem Beispiel !

darkfire
06.05.2004, 21:34
hmm....

hab mich da wohl irgendwie verschrieben, gemeint war

das feld aus der tabelle tabObjekt [Objekt1] ins feld A6

und mit der abfrage ist genau so wie du es dargestellt hast.

die felder werden doch in der abfrage horizontal dargestellt und die datensätze vertikal.


bespiel:
meine abfrage

Mo |Tag|Wo |

04 | 01 | MO
04 | 02 | DI
04 | 03 | MI
04 | 04 | DO
....


nun möcht ich das sämtliche datensätze aus dieser abfrage nur vom feld [Tag] in die felder D5:AH5 exportiert werden.



01 | 02 | 03 | 04 | 05 | ..... usw.

sofern das möglich ist!?


ich hoffe ich konnte mich diesmal verständlicher ausdrücken!?


greets
darkfire

jmc
07.05.2004, 05:50
Hi

EIN Wert aus der Tabelle "tabObjekt" in A6?
Wieviele Datensätze hat denn diese Tabelle ?
Wenn mehr als einer, welcher soll's denn sein ?

Und noch ne schüchterne Frage:
Ist das mit der Abfrage nur ein Beispiel, oder willst du tatsächlich
01 | 02 | 03 | .... etc.
in die Zellen schreiben lassen ? Das geht doch mit Excel ganz einfach von Hand - erste 2 Werte schreiben und dann mit der Maus rüberziehen ...

darkfire
07.05.2004, 11:24
hi,

tab Objekt hat nur 1 ds


ich habes es mir wohl zu eifach gemacht, die 01, 02, 03 ... sind nur beispiele, damit ich nicht zuviel schreiben muss!


greets
darkfire

jmc
07.05.2004, 12:40
Hi darkfire

ok - jetzt ist alles klar, dann sieht das Ganze relativ einfach aus:

Private Sub RapportSet_Click()
On Error GoTo Err_RapportSet_Click

Dim oExcel As Excel.Application
Dim DB As DAO.Database, RS As DAO.Recordset
Dim I As Long

Set oExcel = GetObject(, "Excel.Application ")

With oExcel
.Visible = True
.Workbooks.Add
.ActiveSheet.Name = CStr(Me!Blatt)
.Range("A6").Select
.Selection = DLookup("Objekt1", "tabObjekt")

Set DB = CurrentDb
Set RS = DB.OpenRecordset("abfRapport", dbOpenSnapshot)
With RS
I = 3
Do While Not .EOF
I = I + 1
oExcel.Cells(5, I) = !Tag
.MoveNext
Loop
End With

If MsgBox("Speichern?", vbYesNo + vbQuestion) = vbYes Then
.ActiveWorkbook.SaveAs Me!FName
Else
.ActiveWorkbook.Close SaveChanges:=False
End If
.Quit
End With

Exit_RapportSet_Click:
Set RS = Nothing
Set DB = Nothing
Set oExcel = Nothing
Exit Sub

Err_RapportSet_Click:
If Err.Number = 429 Then
Set oExcel = CreateObject("Excel.Application")
Resume Next
End If
MsgBox Err.Description
Resume Exit_RapportSet_Click

End Sub

darkfire
07.05.2004, 17:50
hi jean,

hey danke für deine bemühungen.

ein problem habe ich noch wenn ich den code wie du ihn geschrieben hast verwende öffnet es mir zwar eine leere exceltabelle, nicht die vorhande Rapport.xls, die im gleichen verzeichnis ist wie die datenbank

anschliessend folgt eine Meldung im access: (mache aber nichts dabei)

sie haben die vorherige operation abgebrochen


die daten werden aber nicht exportiert.


kann es sein, dass ich was falsch gemacht habe oder kann es am code liegen?


greets
darkfire

darkfire
07.05.2004, 18:02
hmm sorry!

habe das problem mit der meldung behoben, habe mich beim anpassen des codes vertippt.

grundsätzlich sollte es mir nicht eine neue exceltabelle erstellen, sondern wäre es gut wenn es die vorhandene rapport.xls öffnet und dort die daten exportiert. sofern das möglich ist?


greets
darkfire

jmc
07.05.2004, 19:31
Hi

Ist halt schlecht, wenn man mehr oder weniger kommentarlos ein Stück Code reinstellt, das man dann als Basis annimmt ...
Solltest eben deine konkreten Anforderungen in Zukunft besser von Anfang an erklären !

...habe mich beim anpassen des codes vertippt...
Was soll denn das heissen ? Hast du den Code nicht 1:1 übernehmen können ? Das heisst, dass die diversen Angaben auch nicht der Realität entsprechen :( :(

Da ich nichts anderes weiss, dann halt so: in Rot die Aenderungen gegenüber jetzt.

Private Sub RapportSet_Click()
On Error GoTo Err_RapportSet_Click

Dim oExcel As Excel.Application
Dim DB As DAO.Database, RS As DAO.Recordset
Dim I As Long

Set oExcel = GetObject(, "Excel.Application ")

With oExcel
.Visible = True
.Workbooks.Open Me!FName
.ActiveSheet.Name = CStr(Me!Blatt)
.Range("A6").Select
.Selection = DLookup("Objekt1", "tabObjekt")

Set DB = CurrentDb
Set RS = DB.OpenRecordset("abfRapport", dbOpenSnapshot)
With RS
I = 3
Do While Not .EOF
I = I + 1
oExcel.Cells(5, I) = !Tag
.MoveNext
Loop
End With

If MsgBox("Speichern?", vbYesNo + vbQuestion) = vbYes Then
.ActiveWorkbook.Save
Else
.ActiveWorkbook.Close SaveChanges:=False
End If
.Quit
End With

Exit_RapportSet_Click:
Set RS = Nothing
Set DB = Nothing
Set oExcel = Nothing
Exit Sub

Err_RapportSet_Click:
If Err.Number = 429 Then
Set oExcel = CreateObject("Excel.Application")
Resume Next
End If
MsgBox Err.Description
Resume Exit_RapportSet_Click

End Sub

darkfire
07.05.2004, 19:57
besten dank!


jetzt ist es genau wie ich es mir vorgestellt habe!
und es funktioniert einwandfrei.

ganz am anfang schrieb ich doch:


bei click auf die schaltfläche Rapportset
soll es die datei Rapport.xls öffnen Blatt1 (.xls befindet sich im gleichen verzeichnis wie die DB)
anschliessend sollen die felder aus der tabelle tabObjekt [Objekt1] ins feld A6 exportieren
und aus der abfrage abfRapport sollen alle ds vom feld [tag] in die felder D5:AH5 exportieren

sicher konnte ich deinen code 1:1 übernehmen, ich habe nur noch mehrere felder zum exportieren angefügt, ich dachte mir wenn man 1 feld exportieren kann, kann ich den rest selber machen, denn sonst hätte ich dir 8 weitere felder und tabellen angeben müssen!


greets und danke nochmal!

darkfire

darkfire
08.05.2004, 10:47
hi,

kann man auch felder in der exceltabelle mittels code formatieren ?

im code übergebe ich das feld [Wochentag] (die werte sind MO, DI , MI...) jetzt sollte es im excel die spalten wo SA oder SO steht mit einer füllfarbe z.b. grau 40% ab zeile 4 bis 39 versehen.


<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Private Sub</span> RapportSet_Click()
<span class="TOKEN">On Error GoTo</span> Err_RapportSet_Click
&nbsp;
<span class="TOKEN">Dim</span> oExcel <span class="TOKEN">As</span> Excel.Application
<span class="TOKEN">Dim</span> DB <span class="TOKEN">As</span> DAO.Database, RS <span class="TOKEN">As</span> DAO.Recordset
<span class="TOKEN">Dim</span> I <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">Dim</span> vtab <span class="TOKEN">As</span> <span class="TOKEN">String</span>
vtab = &quot;tabObjekte&quot;
&nbsp;
<span class="TOKEN">Set</span> oExcel = GetObject(, &quot;Excel.Application &quot;)
&nbsp;
<span class="TOKEN">With</span> oExcel
.Visible = <span class="TOKEN">True</span>
.Workbooks.Open Me!FName
.ActiveSheet.Name = <span class="TOKEN">CStr</span>(Me!Blatt)
&nbsp;
.Range(&quot;G3&quot;).Select
.Selection = DLookup(&quot;MonatJahr&quot;, &quot;abfRapport&quot;)
.Range(&quot;A6&quot;).Select
.Selection = DLookup(&quot;Objekt1&quot;, vtab)
.Range(&quot;A8&quot;).Select
&nbsp;
&nbsp;
&nbsp;
&nbsp;
<span class="TOKEN">Set</span> DB = CurrentDb
<span class="TOKEN">Set</span> RS = DB.OpenRecordset(&quot;abfRapport&quot;, dbOpenSnapshot)
<span class="TOKEN">With</span> RS
I = 3
<span class="TOKEN">Do</span> <span class="TOKEN">While</span> <span class="TOKEN">Not</span> .EOF
I = I + 1
oExcel.Cells(5, I) = !Tag
oExcel.Cells(4, I) = !Wochentag
.MoveNext
<span class="TOKEN">Loop</span>
<span class="TOKEN">End</span> <span class="TOKEN">With</span>
<span class="TOKEN">End</span> <span class="TOKEN">With</span>
&nbsp;
Exit_RapportSet_Click:
<span class="TOKEN">Set</span> RS = <span class="TOKEN">Nothing</span>
<span class="TOKEN">Set</span> DB = <span class="TOKEN">Nothing</span>
<span class="TOKEN">Set</span> oExcel = <span class="TOKEN">Nothing</span>
<span class="TOKEN">Exit Sub</span>
&nbsp;
Err_RapportSet_Click:
<span class="TOKEN">If</span> Err.Number = 429 <span class="TOKEN">Then</span>
<span class="TOKEN">Set</span> oExcel = CreateObject(&quot;Excel.Application&quot;)
<span class="TOKEN">Resume</span> <span class="TOKEN">Next</span>
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
MsgBox Err.Description
<span class="TOKEN">Resume</span> Exit_RapportSet_Click
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span></pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

besten dank im voraus

greets
darkfire

jmc
08.05.2004, 11:36
Hi

die genaue Formatierungsanweisung findest du am besten so raus, indem du ein Makro in Excel aufzeichnest, während du die Formatierung machst.

Einbauen musst du das natürlich dann im Code etwa wie folgt:

.
.
Do While Not .EOF
I = I + 1
oExcel.Cells(5, I) = !Tag
oExcel.Cells(4, I) = !Wochentag
If !Wochentag = "SA" Or !Wochentag = "SO" Then
oExcel.Cells(4, I).Select
oExcel.Selection.Interior.ColorIndex = 6
End If
.MoveNext
Loop
.
Das gibt dann einen gelben Hintergrund

darkfire
08.05.2004, 12:03
hi jean,

das ist genial, danke!

das makro ergab folgendes:

Range("L4:L39").Select
Selection.Interior.ColorIndex = 48

die farbe habe ich jetzt auch

mit deinem code habe ich die füllung nur in zeile 4

wie müsste ich den code noch anpassen, dass es mir die füllung von 4 bis 39 macht?


greets
darkfire

jmc
08.05.2004, 15:46
Hi

also wenn ich deinen Code anschaue, dann gehst du ja durch alle Datensätze der "abfRapport" und füllst diese von links nach rechts in ZWEI ZEILEN, nämlich die Zeilen 4 und 5, beginnend in der SPALTE "D" (= 4.Spalte)

Nun sprichst du von "Zeile" und L4 bis L39, das ist aber EINE Spalte!
In den Zeilen 6 und folgende hast du ja gar nichts ...

Was willst du nun genau ? Am besten machst du mal von Hand ein solches Excel-Sheet wie es AM SCHLUSS aussehen soll und hängst es hier rein, dann sieht man vermutlich etwas klarer ...

darkfire
08.05.2004, 18:05
so ich habe mal das excel-sheet zum downloaden bereit gestellt


mein excel-sheet (http://www.futurefun.ch/download/Stundenrapport1.xls)

ich hoffe es bringt dir was.

greets
darkfire

jmc
09.05.2004, 10:38
Mein lieber Scholli

ich hoffe es bringt dir was
Es bringt mir schon etwas! Wenn ich dieses Excel anschaue und deinen Code dazu, dann stellen sich mir aber spontan 2 Fragen:

1) Hast du tatsächlich eine Tabelle erstellt, welche alle Tage des Jahres (wie weit in die Zukunft?) enthält und dazu den Wochentag ? Brauchst du die nur für diesen Zweck oder gibt es darin noch andere Angaben ? (kann ich mir zwar fast nicht vorstellen, denn dann wäre das Datenmodell ziemlich schlecht ...)
Nur für diesen Zweck, damit du alle Tage eines Monats in dieses Excel schreiben kannst, wäre das völlig überflüssig !

2) du hast in der Spalte A Texte drin: "Test1", "Test2", "Test3" etc. Im Code schreibst du in A6 (also anstelle von "Test1") dann den Wert aus einer Tabelle "tabObjekte" - kann mir nicht vorstellen, dass die nur EINEN Datensatz enthält?
Dann steht noch
.Range("A8").Select
und dann eine grössere Lücke, nehme an, dass du da noch mehr machst ...

Was ich aus dem bisher gesehenen ablese: es geht um Stundenrapporte im Ingenieur oder Architekturbereich (als Schweizer weiss man was SIA ist ;) )
Du hast also eine Tabelle mit Objekten/Aufträgen für die dann die Stunden pro Monat erfasst werden sollen. Wie aus dem Excel unschwer zu erkennen ist, muss das pro Person geschehen, somit hast du also noch eine Tabelle "Personen/Mitarbeiter". Diese wiederum müssten einem bzw. mehreren Projekten zugeordnet sein ...
Nun generierst du also für die Stundenerfassung pro Monat und Mitarbeiter ein Excel, in welchem horizontal die Tage des betreffenden Monats und vertikal die Objekte, für welche der Mitarbeiter Stunden aufwendet.
Übergeordnet ist vielleicht noch das Projekt - wenn es mehrere Projekte hat, dann musst du das ganze noch pro Projekt machen.

Ich gehe davon aus, dass ein Mitarbeiter 1 bis N Objekte innerhalb eines Projektes "bearbeitet", woher nimmst du also diese variable Anzahl und deren Bezeichnung ?

Mit dem Select der Zellen A6, A8, A10 etc. und einem DLookup ohne Bedingung kann's ja nicht sein ...

Es wäre also angebracht, wenn du mal die Facts "auf den Tisch" legen würdest, damit man eine komplette Lösung machen kann, sonst haben wir hier noch ein paar Tage das Frage und Antwort-Spiel ...

WOBEI: es stellt sich natürlich ganz generell die Frage, wozu du überhaupt diese ganze Excel-Geschichte machst ? Die erfassten Daten müssen ja dann wieder irgendwie in's Access - nehme ich doch mal schwer an ...
Wieso machst du die Erfassung nicht gleich in Access mit entsprechenden Formularen ?

So - eine ganze Menge für einen Sonntag morgen, aber ich denke, dass mal eine grundsätzliche Gesamtbetrachtung Not tut !

darkfire
09.05.2004, 12:54
hi jean

ich weis meine lösung ist nicht die beste, sie sollte auch nur das besherige erstellen der exceltabelle von hand vereinfachen.

die tabelle ist nicht gedacht um die stunden digital zu erfassen, sie ist gedacht um die stunden von hand mit bleistift einzutragen und sie am feierabend dann in das detailliertere formular B zu übertragen, was aber auch nicht im access geschieht.

ich danke dir das mir beim erstellen einer kompletten lösung helfen möchtest, aber so war eigendlich nicht gedacht, ich bin ein anfänger im programmieren von access datenbank (was nicht schwer zu erkennen ist!) ich verwende dieses projekt vom büro als übungsobjekt, um mir das programmieren im eigenstudium bei zubrignen, und gleichzeitig den arbeitsablauf im büro zu vereinfachen.

die kalenderdaten erstellt es mir nur vom gewünschten jahr und mittels filter vom ensprechenden monat

die objekte habe ich wie folgft aufgebaut. ich habe 17 bjektfelder erstellt, die dann nur 1 ds enthalten, so ist mir gewährleistet , dass es im excel auch platz hat, denn mehr als 17 objekte pro monat wird dieser betrieb nie haben (3 mann betrieb).


so noch mal zu meiner eigendlichen frage:
ist es nun möglich die füllung in den felder Sa und So von zeile 4 bis 39 automatisch zu erstellen ?

ich hoffe ich konnte dir meine situation verständlich erklären. übrigens finde ich es genieal von dir das du deine zeit für möchte gern programmieren(wie ich es bin :-) zu opfern um ein vernünftige lösung zu erzielen. mein nächstes projekt, sofern ich kein anderes finde, werde ich mich mal mit einer kopletten access lösung beschäftigen.

greets
darkfire

jmc
09.05.2004, 14:20
Hi

also, wenn das so ist, dann kannst du es dir aber einfacher machen:

Die Tabelle mit den Tagen brauchst du nicht aufzubereiten, das kann man berechnen.
Die Tabelle mit den Objekten ist aus DB-Design-Sicht natürlich völlig daneben, aber lassen wir das mal so stehen.

Habe das ganze jetzt etwas optimiert. Anbei ein Zip mit einer mdb und 2 Excel's.

Zu Bedenken ist noch, dass du das Excel nicht unter demselben Namen speichern darfst, sonst hast du das nächste mal ja bereits die Tage und Formatierungen drin ... Habe das so gelöst, dass jeweils beim Speichern der Name des Excel genommen wird und hinten das Jahr und der Monat angehängt. (siehe Beispiel im ZIP)
Ausgangslage ist jeweils das "Stundenrapport.xls"

Schau's dir mal an ...

darkfire
09.05.2004, 14:50
hi,

perfekt, genau so habe ich es mir vorgestellt!

besten dank für deine hilfe.


greets
darkfire