Accessdaten an vorhandene Exceltabelle anhängen

Ich brauche Hilfe!
Ich programmiere in Access 2000 - VA.

Ich möchte Daten aus einer Tabelle in Access kopieren und in eine vorhandene Tabelle in Excel einfügen.
Das Programm soll dabei überprüfen, ob sich schon Daten in der Tabelle befinden und mich Fragen, ob es die Daten überschreiben soll oder die Daten an die Bestehenden anhängen soll.

Die Kopierfunktion habe ich schon geschrieben. Nur diese Such-Funktion mit anschließendem Anhängen der Daten an die vorhanden Daten fällt mir nicht ein.

Es wäre super, wenn mir jemand bei diesem Problem helfen könnte.

Danke!!!

Hallo!

Die Kopierfunktion habe ich schon geschrieben. Nur diese
Such-Funktion mit anschließendem Anhängen der Daten an die
vorhanden Daten fällt mir nicht ein.

Zunächst binde den Verweis auf die passende Excel-Version ein. (Modul öffnen, „Extras“-„Verweise“).

Jetzt ist davon auszugehen, dass zum Anhängen der Daten am Tabellenanfang diverse Zeilen stehen, an deren Ende die neuen Daten kommen sollen. Weiterhin gehe ich davon aus, dass die vorhandenen Zeilen lückenlos, d. h. ohne Leerzeile auftreten, und dass in Spalte A immer ein Eintrag steht. D. h., Eine leere Zelle in Spalte A markiert das Ende. Sollte dem nicht so sein, ist natürlich der Algorithmus entsprechend anzupassen.

Dann:

 Dim wbDatei as workbook
 Dim wsTabelle as worksheet
 Dim lngZeile as long

 set wbDatei=workbooks.open("C:\DeineDatei.xls")
 Set wsTabelle=wbDatei.worksheets("DeineTabelle")
 ' Vorher löschen?
 if msgbox("Tabelle vorher löschen?",vbyesno)=vbyes then
 wsTabelle.Cells.Clear
 endif
 lngZeile=1
 do while wsTabelle.Cells(lngZeile, 1)""
 lngZeile=lngZeile+1
 loop
 ' Jetzt steht in lngZeile Deine erste Leerzeile, 
 ' und Du kannst mit dem Kopieren anfangen...

Wenn Du die Löschabfrage nur haben willst, wenn auch wirklich Daten vorhanden sind, musst Du natürlich die entsprechende Prüfung vorher machen, dann Fragen und im Fall des Löschens die neue Zeile zum Einfügen auf 1 setzen.

Gruß, Manfred

Danke für den Code. Er ist eigentlich völlig einleuchtend.
Aber ich habe da wohl noch immer ein Problem.

  1. Meine Tabelle in Excel fängt bei Zeile 10 an
  2. Ich verwende die Snapshot-Funktion (Dummerweise)

Ich poste hier mal meinen bisherigen Code:

Private Sub Form_Open(Cancel As Integer)
'Kill „c:\Alte Datei.xls“
'FileCopy „c:\Eigene\Excel\Musterliste.xls“, „c:\Neue Datei.xls“

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 = False
.Workbooks.Open („c:\Neue Datei.xls“)
.Sheets(„Tabelle1“).Select
.Rows(„1:1“).Select
.Cells.Select
'Set RS = Me.RecordsetClone

Set DB = CurrentDb
Set RS = DB.OpenRecordset(„A_Bemerkung“, dbOpenSnapshot)
–> aus Access

If Me!Spaltenk Then
For i = 15 To RS.Fields.Count - 1
.Cells(2, i + 2) = RS.Fields(i).Name
Next i
.Range(„a10“).Select
Else
.Range(„a10“).Select
End If

.Selection.CopyFromRecordset RS
.ActiveWorkbook.Save
.ActiveWorkbook.Close
.Quit
End With

End Sub

Das Programm löscht von vornherein die gesamte Datei und ersetzt diese mit einer leeren Musterliste. Das möchte ich aber wie gesagt umgehen.
Er soll schauen, ob schon etwas in der Excel-Datei steht.

Ich muß dazu sagen, dass ich diesen Code von einem Kollegen habe. Ich versteh den unteren Teil nicht richtig.

Vielleicht gibt es eine Lösung…

Gruß
Sven

Zunächst binde den Verweis auf die passende Excel-Version ein.
(Modul öffnen, „Extras“-„Verweise“).

Jetzt ist davon auszugehen, dass zum Anhängen der Daten am
Tabellenanfang diverse Zeilen stehen, an deren Ende die neuen
Daten kommen sollen. Weiterhin gehe ich davon aus, dass die
vorhandenen Zeilen lückenlos, d. h. ohne Leerzeile auftreten,
und dass in Spalte A immer ein Eintrag steht. D. h., Eine
leere Zelle in Spalte A markiert das Ende. Sollte dem nicht so
sein, ist natürlich der Algorithmus entsprechend anzupassen.

Dann:

Dim wbDatei as workbook
Dim wsTabelle as worksheet
Dim lngZeile as long

set wbDatei=workbooks.open(„C:\DeineDatei.xls“)
Set wsTabelle=wbDatei.worksheets(„DeineTabelle“)
’ Vorher löschen?
if msgbox(„Tabelle vorher löschen?“,vbyesno)=vbyes then
wsTabelle.Cells.Clear
endif
lngZeile=1
do while wsTabelle.Cells(lngZeile, 1)""
lngZeile=lngZeile+1
loop
’ Jetzt steht in lngZeile Deine erste Leerzeile,
’ und Du kannst mit dem Kopieren anfangen…

Wenn Du die Löschabfrage nur haben willst, wenn auch wirklich
Daten vorhanden sind, musst Du natürlich die entsprechende
Prüfung vorher machen, dann Fragen und im Fall des Löschens
die neue Zeile zum Einfügen auf 1 setzen.

Gruß, Manfred

Danke für den Code. Er ist eigentlich völlig einleuchtend.
Aber ich habe da wohl noch immer ein Problem.

Das ist gut. Dann sollte das weitere nicht das Problem werden.

  1. Meine Tabelle in Excel fängt bei Zeile 10 an

lngZeile in meinem Code dann halt bei 10 anfangen lassen…

  1. Ich verwende die Snapshot-Funktion (Dummerweise)

Das sollte eigentlich nichts ausmachen.

Private Sub Form_Open(Cancel As Integer)
'Kill „c:\Alte Datei.xls“
'FileCopy „c:\Eigene\Excel\Musterliste.xls“, „c:\Neue
Datei.xls“

Das hast Du auskommentiert. Schon mal gut.

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“)

Bis hierhin klar, nehme ich an: Excel wird aktiviert, falls schon geöffnet; falls nicht, eben neu gestartet.

On Error GoTo 0
With oExcel
.Visible = False
.Workbooks.Open („c:\Neue Datei.xls“)

Hier wird die Datei geöffnet. Jetzt käme prinzipiell der Code von mir, mit dem überprüft wird, ob was vorhanden ist oder nicht. Eben auf Deine Rahmenbedingungen (Startzeile, Spalten, wann ist was leer…) angepasst.

.Sheets(„Tabelle1“).Select
.Rows(„1:1“).Select
.Cells.Select

Hiermit wird in Excel die gesamte Tabelle markiert.

'Set RS = Me.RecordsetClone

Set DB = CurrentDb
Set RS = DB.OpenRecordset(„A_Bemerkung“, dbOpenSnapshot)
–> aus Access

If Me!Spaltenk Then
For i = 15 To RS.Fields.Count - 1
.Cells(2, i + 2) = RS.Fields(i).Name
Next i

Mit dieser Schleife werden die Spaltenüberschriften in die Spalten B bis weit in Zeile 2 geschrieben.

.Range(„a10“).Select
Else
.Range(„a10“).Select
End If

Warum dann A10 selektiert wird, weiß ich nicht. Theoretisch sollten die Zeilen 3 bis 10 dann leer sein bzw. mit den Eingaben aus der Quelldatei, die zum kopieren genommen wird, vorbelegt sein.
Wenn Du vor dem Einfügen Deine Tabelle löschen willst, darf das natürlich nur ab Zeile 10 geschehen. Dies machst Du dann (in Analogie zu meinem Code) mit

wsTabelle.Rows("10:65535").clear

Vor der folgenden Zeile musst Du noch die betreffende Zelle markieren, ab der eingefügt werden soll. Im Lösch-Fall dürfte das die 10 sein, ansonsten eben die vorher mit lngZeile und der Schleife ermittelte:

wsTabelle.Cells(lngZeile, 1).select

.Selection.CopyFromRecordset RS

Das kopiert die Daten aus dem Recordset in die Tabelle. Ist prinzipiell das gleiche wie den Recordset in Tabellenform anzeigen zu lassen, komplett zu markieren und mit kopieren und einfügen nach Excel zu bringen.

.ActiveWorkbook.Save
.ActiveWorkbook.Close
.Quit
End With

Speichert und schließt die Datei und beendet Excel.

Das Programm löscht von vornherein die gesamte Datei und
ersetzt diese mit einer leeren Musterliste. Das möchte ich
aber wie gesagt umgehen.
Er soll schauen, ob schon etwas in der Excel-Datei steht.

Ich muß dazu sagen, dass ich diesen Code von einem Kollegen
habe. Ich versteh den unteren Teil nicht richtig.

Hoffe, mit der Erklärung kommst Du weiter.

Gruß, Manfred

Vielen vielen Dank, jetzt klappt alles wunderbar.
Ich sitze schon über eine Woche an diesem Problem.

Danke!

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]