MS-Office-Forum

Zurück   MS-Office-Forum > Microsoft Access & Datenbanken > Microsoft Access
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 25.09.2003, 19:59   #1
schnolli
MOF User
MOF User
Traurig Access > Excel, aber wie wenn 1:n Beziehung

Hallo,

habe hier im Forum diesen Code gefunden, der Daten von Access nach Excel übergibt, funktioniert soweit auch ganz gut.
Code:

Dim ExApp As Excel.Application
Dim wb As Excel.Workbook
Dim ws As Excel.Worksheet
Set ExApp = CreateObject("Excel.Application")
ExApp.Workbooks.Open "C:\Dokumente und Einstellungen\Oliver\Desktop\Access.xls"
ExApp.Visible = True
'oder, falls neue Mappe gewünscht:
'ExApp.Workbooks.Add
Set wb = ExApp.ActiveWorkbook
'Set ws = wb.Worksheets("MeinBlatt")
Set ws = wb.ActiveSheet
With ws
  .Cells(1) = Nachname
  .Cells(2) = Vorname
  .Cells(3) = Straße
  .Cells(4) = PLZ
  .Cells(5) = Ort
'wb.Save
Set ws = Nothing
Set wb = Nothing
Set ExApp = Nothing
End With
Es gibt zwei Tabellen die eine 1:n Beziehung haben, in meinem Haupt_frm ist ein UFO eingebunden, in diesem UFO stehen die Verträge zum Kunden, jeder Kunde hat also eine Verschiedene Anzahl von Verträgen.

Wie müsste den der Code ergänzt werden, dass Access weiss, dass auch die dazugehörigen Verträge (Felder: VS-Nummer, Vertragsart, Gesellschaft, Beginn, Ablauf, JBP, untereinander in die Zellen übergeben werden sollen?

Habe leider nichts zu einem ähnlichem Problem hier im Forum gefunden.
schnolli ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 26.09.2003, 07:00   #2
MarioR
MOF Meister
MOF Meister
Nachricht

Hallo,

ich vermute mal "Nachname", "Vorname" usw. sind Formularfelder aus dem HF, oder? Ich würde an Deiner Stelle nicht die Formularfelder auslesen, sondern ein Recordset öffnen, dort DS für DS durchgehen und die Daten dabei nach Excel schreiben. Das könnte ungefähr so aussehen:

Code:

...
Dim ws As Excel.Worksheet
Dim rs As DAO.Recordset
Dim strSQL As String
strSQL = "SELECT Tabelle1.*, Tabelle2.* FROM Tabelle1 INNER JOIN Tabelle2 " & _
         "ON Tabelle1.KundenNr = Tabelle2.KundenNr WHERE ID = " & Me.Formularfeld_ID
Set rs = CurrentDb.OpenRecordset(strSQL, DAO.dbOpenForwardOnly)
If Not rs.EOF Then 
  Set ExApp = CreateObject("Excel.Application")
  ...
  Set ws = wb.ActiveSheet
  With ws
    .Cells(1) = rs!Nachname
    .Cells(2) = rs!Vorname
    .Cells(3) = rs!Straße
    .Cells(4) = rs!PLZ
    .Cells(5) = rs!Ort
    Do While Not rs.EOF
      .Cells(x) = rs!VS-Nummer
      .Cells(y) = rs!Vertragsart
      ...
      rs.MoveNext
    Loop 
  End With
  Set ws = Nothing
  Set wb = Nothing
  Set ExApp = Nothing
End If
rs.Close
Set rs = Nothing
  • "Tabelle1" und "Tabelle2" musst Du durch die richtigen Namen ersetzen.
  • "KundenNr" ist das Verknüpfungsfeld zwischen beiden Tabellen und muss ebenfalls durch die richtige(n) Bezeichnung(en) ersetzt werden.
  • Mit WHERE ID = " & Me.Formularfeld_ID im SQL-Code wird die Auswahl im Recordset auf den Kunden begrenzt, der momentan im HF dargestellt wird. "ID" wäre dabei ein eindeutiges Feld in Tabelle1 vom Typ Zahl (gewöhnlich ein Autowert-Feld) und "Formularfeld_ID" das zugehörige Formularfeld. Die Bezeichnungen musst Du wieder anpassen.
  • In .Cells(x) usw. werden dann die Daten aus Tabelle2 geschrieben. Das musst Du natürlich auch noch anpassen, damit nicht jeder DS aus Tabelle2 immer wieder in die gleichen Zellen geschrieben wird

HTH

__________________

Mario

Fluchen ist die einzige Sprache, die alle Programmierer perfekt beherrschen.
MarioR ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 26.09.2003, 08:40   #3
schnolli
Threadstarter Threadstarter
MOF User
MOF User
Weinen

Hallo,

erstmal danke für deine Antwort. Habe nun mal versucht deinen Code anzupassen, funzt aber nicht, bekomme die Fehlermeldung Laufzeitfehler '3131' Syntaxfehler in FROM-Klausel.
Code:

Dim ws As Excel.Worksheet
Dim rs As DAO.Recordset
Dim strSQL As String
strSQL = "SELECT tblKunden.*, tblVerträge zum Kunden.* FROM tblKunden INNER JOIN tblVerträge zum Kunden " & _
         "ON tblKunden.Kundennummer = tblVerträge zum Kunden.Kundennummer WHERE Kundennummer = " & Me.Kundennummer
Set rs = CurrentDb.OpenRecordset(strSQL, DAO.dbOpenForwardOnly)
If Not rs.EOF Then
Set ExApp = CreateObject("Excel.Application")
ExApp.Workbooks.Open "C:\Dokumente und Einstellungen\Oliver\Desktop\Access.xls"
ExApp.Visible = True
Set wb = ExApp.ActiveWorkbook
Set ws = wb.ActiveSheet
With ws
  .Cells(1) = Nachname
  .Cells(2) = Vorname
  .Cells(3) = Straße
  .Cells(4) = PLZ
  .Cells(5) = Ort
  Do While Not rs.EOF
  .Cells(6, 1) = VS - Nummer
  .Cells(6, 2) = Vertragsart
  .Cells(6, 3) = Gesellschaft
  .Cells(6, 4) = Beginn
  .Cells(6, 5) = Ablauf
  .Cells(6, 6) = JBP
  rs.MoveNext
  Loop
End With
Set ws = Nothing
Set wb = Nothing
Set ExApp = Nothing
End If
rs.Close
Wenn ich dann den Debugger starte unterstreicht er mir diese Zeile gelb.
Code:

Set rs = CurrentDb.OpenRecordset(strSQL, DAO.dbOpenForwardOnly)
Was habe ich falsch gemacht
schnolli ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 26.09.2003, 08:51   #4
MarioR
MOF Meister
MOF Meister
Nachricht

Bezeichnungen mit Leer- und Sonderzeichen müssen immer geklammert werden.
Code:

... [tblVerträge zum Kunden] " & _
Weiterhin muss der Bezug auf das Feld "Kundennummer" eindeutig sein. Sollte es vom Typ Text ist, dann müssen da übrigens noch Hochkommas rundrum (hab ich vorhin vergessen zu erwähnen).
Also bei Zahl:
Code:

... WHERE tblKunden.Kundennummer = " & Me.Kundennummer
Oder bei Text:
Code:

... WHERE tblKunden.Kundennummer = '" & Me.Kundennummer & "'"
Weiter unten fehlt auch der Bezug auf das Recordset. Also bei Nachname, Vorname usw. immer ein rs! davor:
Code:

.Cells(1) = rs!Nachname

__________________

Mario

Fluchen ist die einzige Sprache, die alle Programmierer perfekt beherrschen.
MarioR ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 26.09.2003, 08:58   #5
Lothi
MOF User
MOF User
Standard

Hallo Schnolli

Code:

strSQL = "SELECT tblKunden.*, tblVerträge zum Kunden.* FROM tblKunden INNER JOIN tblVerträge zum Kunden   " & _
         "ON tblKunden.Kundennummer = tblVerträge zum Kunden.Kundennummer WHERE Kundennummer = " & Me.Kundennummer
Bei Feld oder Tabellennamen mit Sonder- oder Leerzeichen musst du den Namen in Eckige klammern setzten: [tblVerträge zum Kunden]

Beim rest vom Code sieh noch mal den Code von Mario an
das rs! Feldname fehlt.

und wie Mario schon sagte wird dir so wie du es jetzt hast der nächste datensatz in die gleiche Zelle geschrieben wie der vorhergehende. Du musst bei jedem Schleifendurchgang den Zeilenwert um 1 erhöhen.

Zuspät aber wenigsten das gleiche wie Mario

Geändert von Lothi (26.09.2003 um 09:01 Uhr).
Lothi ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 26.09.2003, 09:45   #6
schnolli
Threadstarter Threadstarter
MOF User
MOF User
Standard

Es ist doch zum verzweifeln , habe nun die Tabellen in Klammern gesetzt, aber es funktioniert immer noch nicht. Bekomme nun den Laufzeitfehler '3075' fehlender Operator. Wenn einer von euch mal meinen Code anschauen könnte und mir sagen könnte was falsch ist, wäre das sehr nett.
Angehängte Dateien
Dateityp: zip exceldb.zip (86,3 KB, 13x aufgerufen)
schnolli ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 26.09.2003, 09:59   #7
MarioR
MOF Meister
MOF Meister
Nachricht

Ich hab hier kein A2k, muss jetzt aber auch weg.

Vielleicht kann sich Jemand der Sache mal annehmen ...

__________________

Mario

Fluchen ist die einzige Sprache, die alle Programmierer perfekt beherrschen.
MarioR ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 26.09.2003, 10:03   #8
schnolli
Threadstarter Threadstarter
MOF User
MOF User
Beeindruckt

Ups, sorry, habe vergessen die DB zu konvertieren. Hier nun Access97 Format.
Angehängte Dateien
Dateityp: zip excel.zip (26,6 KB, 9x aufgerufen)
schnolli ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 26.09.2003, 10:14   #9
Lothi
MOF User
MOF User
Standard

Hallo Schnolli

Hier die der funktionierende SQL Code
Code:

strSQL = "SELECT tblKunden.*, [tblVerträge zum Kunden].*, tblKunden.Kundennummer " & _
        "FROM tblKunden " & _
        "INNER JOIN [tblVerträge zum Kunden] " & _
        "ON tblKunden.Kundennummer = [tblVerträge zum Kunden].Kundennummer " & _
        "WHERE tblKunden.Kundennummer = " & Me.Kundennummer
Einde andere frage:

Du willst jetzt die zuerst die Namen in die Exeltabelle schreiben und dann unterhalb zu jedem dazugehörigen Name die verträge?

Beispiel:
Code:

 Name     Vorname
               1
                2
                3
            Name      Vorname
               1
               2
Wenn ja funktioniert dein aufbau des Codes nicht weil alle Datensätze in einer zeile dargestellt werd.
Lothi ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 26.09.2003, 10:54   #10
schnolli
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hallo Lothi,

Zitat:

Original geschrieben von Lothi
Du willst jetzt die zuerst die Namen in die Exeltabelle schreiben und dann unterhalb zu jedem dazugehörigen Name die verträge?

Jepp, es soll zuerst der Name+Adresse in Zellen geschrieben werden, dann Zeilen darunter sollen dann die Verträge aufgelistet werden, so das ich eine komplette übersicht des Kunden habe.
schnolli ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 26.09.2003, 11:07   #11
Lothi
MOF User
MOF User
Standard

Hallo

Da hab ich etwas gebastelt in der zwischenzeit

Code:

Private Sub Befehl170_Click()
Dim ws As Excel.Worksheet
Dim rs As DAO.Recordset
Dim rs2 As DAO.Recordset
Dim strSQL As String
Dim strSQL2 As String
Dim i As Integer
strSQL = "SELECT tblKunden.*" & _
        "FROM tblKunden " & _
        "WHERE Kundennummer = " & Me.Kundennummer
        
 strSQL2 = "SELECT [tblVerträge zum Kunden].* " & _
            "FROM [tblVerträge zum Kunden] " & _
            "WHERE Kundennummer = " & Me.Kundennummer
        
         Debug.Print strSQL
        
Set rs = CurrentDb.OpenRecordset(strSQL, DAO.dbOpenForwardOnly)
Set rs2 = CurrentDb.OpenRecordset(strSQL2, DAO.dbOpenForwardOnly)
If Not rs.EOF Then
Set ExApp = CreateObject("Excel.Application")
ExApp.Workbooks.Open "C:\Dokumente und Einstellungen\Oliver\Desktop\Access.xls"
ExApp.Visible = True
Set wb = ExApp.ActiveWorkbook
Set ws = wb.ActiveSheet
With ws
  .Cells(1) = rs!Nachname
  .Cells(2) = rs!Vorname
  .Cells(3) = rs!Straße
  .Cells(4) = rs!PLZ
  .Cells(5) = rs!Ort
End With
With ws
  Do While Not rs2.EOF
  .Cells(1, 5 + i) = rs2![VS-Nummer]
  .Cells(2, 5 + i) = rs2!Vertragsart
  .Cells(3, 5 + i) = rs2!Gesellschaft
  .Cells(4, 5 + i) = rs2!Beginn
  .Cells(5, 5 + i) = rs2!Ablauf
  .Cells(6, 5 + i) = rs2!JBP
  rs2.MoveNext
  i = i + 1
  Loop
End With
Set ws = Nothing
Set wb = Nothing
Set ExApp = Nothing
End If
rs.Close
rs2.Close
End Sub
Lothi ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 26.09.2003, 11:25   #12
schnolli
Threadstarter Threadstarter
MOF User
MOF User
Strahlen

Juhuuu,

echt klasse von Dir, funzt einwandfrei. Könntest Du mir noch bitte erklären was das + i im Code heisst.
Code:

  .Cells(1, 5 + i) = rs2![VS-Nummer]
  .Cells(2, 5 + i) = rs2!Vertragsart
  .Cells(3, 5 + i) = rs2!Gesellschaft
  .Cells(4, 5 + i) = rs2!Beginn
  .Cells(5, 5 + i) = rs2!Ablauf
  .Cells(6, 5 + i) = rs2!JBP
Merci.
schnolli ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 26.09.2003, 11:38   #13
Lothi
MOF User
MOF User
Standard

Hallo

Ja kann ich

Mit der Schleife

Code:

Do While Not rs2.EOF
  .Cells(1, 5 + i) = rs2![VS-Nummer]
  .Cells(2, 5 + i) = rs2!Vertragsart
  .Cells(3, 5 + i) = rs2!Gesellschaft
  .Cells(4, 5 + i) = rs2!Beginn
  .Cells(5, 5 + i) = rs2!Ablauf
  .Cells(6, 5 + i) = rs2!JBP
  rs2.MoveNext
  i = i + 1    
Loop
rs2 liest den ersten Datensatz ein. Wenn der erste datensatz in die geschrieben wurde wird die Variable i um 1 erhöht das wird dann der Spalte hinzugezählt so kommt als nächstes die Spalte 6 dann 7 u.s.w
Sonst wird jeder Datensatz in die gleiche Spalte geschrieben.
Lothi ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 26.09.2003, 11:49   #14
schnolli
Threadstarter Threadstarter
MOF User
MOF User
Top

Hallo,

danke für Deine Erklärung.

Da jetzt alles soweit läuft wie ich es möchte , kann ich beruhigt in die Pause gehen.

Und nochmals Merci.

Mahlzeit.
schnolli ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:52 Uhr.



Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Copyright ©2000-2018 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.