vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Visual-Basic Einsteiger
Excel-Daten aus vorh. Excel Tabelle (2003) mit DAO importieren 
Autor: Michael_HU
Datum: 08.03.13 19:52

Hallo liebe Leute!

Ich würde Eure Hilfe bereits an dieser Stelle danken, solltet Ihr mich über die Sprünge helfen. Ich arbeite mit Visual Studio 6.0 Prof.Edition.
Ich habe eine vorhandene 2003 Excel-Tabelle mit 4 Spalten und 3 Zeilen, die Zahlen enthalten. Den Bereichnamen habe ich hier bereits vergeben: myRange2.
Den Verweis auf Microsoft DAO 3.51 Object Library habe ich bei Project/References gesetzt.
Diese Daten aus dem Bereich myRange2 möchte ich mit cmdLaden-Befehl in meine UserForm eingerichteten 12 Textboxen laden.
Die evtl. geänderten Daten in den TextBoxen möchte ich dann mit einem zweiten cmdSpeichern-Befehl in die gleiche Stelle der Quelltabelle wieder exportieren.
Könnt Ihr mir bitte behilflich sein? Ich bringe es leider nicht weiter.
Und was ist der Unterschied zw. den obigen Library und Microsoft DAO 3.6 Object Library? Sollte ich evtl. auf diese verweisen?

Gruß
Michael
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Excel-Daten aus vorh. Excel Tabelle (2003) mit DAO importieren 
Autor: Michael_HU
Datum: 08.03.13 19:59

Option Explicit

Private Sub Command1_Click()
Dim dbtmp As DAO.Database
Dim tblObj As DAO.TableDef
Dim rs As DAO.Recordset
Dim x As Integer
Dim dstr As String
Set dbtmp = OpenDatabase("G:\Testprogramme_allgemein\Visual Studio 6.0\Abfragen und Aktualisieren von Excel-Daten mit ADO von ASP\testen.xls", _
False, True, "Excel 8.0;")
DoEvents
Set rs = dbtmp.OpenRecordset("select * from `myRange2`")
rs.MoveFirst
While Not rs.EOF 'BOF?
For x = 0 To rs.Fields.Count - 1
dstr = CStr(rs.Fields(x).Value)
MsgBox dstr
Next x
rs.MoveNext
Wend
End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Excel-Daten aus vorh. Excel Tabelle (2003) mit DAO importieren 
Autor: Blackbox
Datum: 08.03.13 21:16

Hi,

ActiveSheet.CopyFromRecordset.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Excel-Daten aus vorh. Excel Tabelle (2003) mit DAO importieren 
Autor: Michael_HU
Datum: 08.03.13 21:25

Hallo Blackbox,

die Excel-Tabelle öffne ich nicht. Als Probe habe ich mir mit MsgBox das Auslesen kontrollíert, was ja auch klappt. Nur habe ich die in der Schleife durch CStr(rs.Fields(x).Value)aus der Tabelle ausgelesenen Werte nicht in die TextBoxen hinein gebracht. Ich muss noch dazu sagen, dass meine 12 TextBoxen alle anderen Namen haben. Z,B.: Me.txt_umpp oder Me.txt_uoc usw. Also mit dem Indexieren der TextBoxen bin ich nicht weiter.
Wie könnte ich die einzelnen TextBoxen in dieser Schleife dennoch ansprechen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Excel-Daten aus vorh. Excel Tabelle (2003) mit DAO importieren 
Autor: Blackbox
Datum: 08.03.13 21:54

Hi,
ok.
Gucke mal wie man ein DataControl via VBA machen kann ;)
melde mich morgen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Excel-Daten aus vorh. Excel Tabelle (2003) mit DAO importieren 
Autor: Michael_HU
Datum: 09.03.13 05:18

Guten Morgen Blackbox,

bin etwas weitergekommen:
Das herüberholen der Excel-Daten in den 10 TextBoxen habe ich folgendermaßen gelöst:
 
it

Private Sub Command1_Click()
Dim dbtmp As DAO.Database
Dim tblObj As DAO.TableDef
Dim rs As DAO.Recordset
Dim x As Integer
Dim dstr As String
Dim anz As Long
dstr = "G:\Testprogramme_allgemein\Visual Studio 6.0\Abfragen und Aktualisieren von Excel-Daten mit ADO von ASP\testen.xls"
Set dbtmp = OpenDatabase(dstr, False, True, "Excel 8.0;")
DoEvents
' Recordset-Objekt vom Typ Tabelle öffnen
' Im Bereich "myRange2" leigen die Daten i.d. Excel-Tabelle
Set rs = dbtmp.OpenRecordset("select * from `myRange2`")
rs.MoveFirst 'rs.MoveLast
anz = rs.Fields.Count 'Anzeige Feldanzahl nur für Kontrollzwecke
Me.txtBoxFieldAnzahl = anz

While Not rs.EOF 'BOF?
For x = 0 To rs.Fields.Count - 1
' Auslesen der Daten, wenn diese in einer Zeile sind
Text1 = CStr(rs.Fields(0).Value)
Text2 = CStr(rs.Fields(1).Value)
Text3 = CStr(rs.Fields(2).Value)
Text4 = CStr(rs.Fields(3).Value)
Text5 = CStr(rs.Fields(4).Value)
Text6 = CStr(rs.Fields(5).Value)
Text7 = CStr(rs.Fields(6).Value)
Text8 = CStr(rs.Fields(7).Value)
Text9 = CStr(rs.Fields(8).Value)
Text10 = CStr(rs.Fields(9).Value)
Next x
rs.MoveNext
Wend
rs.Close
Set rs = Nothing
Set dbtmp = Nothing
Set tblObj = Nothing
dstr = ""
End Sub

Allerdings kann ich diesen Weg nur gehen, wenn die Daten in einer Zeile sind.
Da ich die Feldlänge kenne und diese nicht all zu lang ist, ist das kein Problem.
Sicherlich gibt es andere Lösung für den Datenimport.
Meine zusammengehörenden Daten liegen in der Excel-Tabelle jedoch in einer Spalte.

Wie löse ich diesen Schritt?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Excel-Daten aus vorh. Excel Tabelle (2003) mit DAO importieren 
Autor: Blackbox
Datum: 09.03.13 10:19

Hallo,

zunächst einmal: Alle Zugriffe von DAO auf Office neuer als Office 8 sollten mit DAO 3.6 durchgeführt werden, da sich die DBEngine etwas verändert hat.

DAO bietet einen sehr eleganten Weg der Datenübernahme aus einem Recordset.

kleine Demo von GetRows()

   Dim db As Database
   Dim rs As Recordset
   Dim vRow As Variant
 
   'Variant vRow(Spalte, Zeile) basiert auf 0
 
   Set db = OpenDatabase("F:\MyExl.xls", False, False, "Excel 8.0;")
   If IsObject(db) Then
      Set rs = db.OpenRecordset("SELECT * FROM MyBereich") ' das oder
      'so: Set rs = db.OpenRecordset("MyBereich") 
      If Not rs.BOF Or rs.EOF Then
         vRow = rs.GetRows(3)
 
 
      End If
   End If
Dabei ist folgendes zu beachten: MyBereich muss eine Zeile größer sein, als später
abgefragt wird. Der Grund dafür ist, dass die erste Zeile als Feldnamen und nicht
als Daten definiert ist. GetRows liefert einen Variant-Array zurück, wobei ein
Member dieses Array ein zweidimensionales Feld darstellt aus: Spalte,Zeile

vRow(0,0) wäre das erste Feld mit Daten
vRow(3,2) wäre das letzte Datenfeld

Das lässt sich dann sehr gut mit VB6-Steuerelementen, wie zB. TextBox, synchronisieren,
wenn man ein Steuerelement-Array dementsprechend definiert.

Man kann auch die Data-Eigenschaften der VB6-Controls setzen, was eine weitere Möglichkeit
des Datenzugriffs wäre.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Excel-Daten aus vorh. Excel Tabelle (2003) mit DAO importieren 
Autor: Michael_HU
Datum: 09.03.13 10:56

Guten Morgen Blackbox,

danke für die Code. DAO habe ich auch auf 3.6 gesetzt.
Die bisherigen Daten befanden sich ja in einer Zeile.
Wie erreiche ich jedoch die Daten aus nur einer Spalte mit z.B.: 10 Zeilen in den TextBoxen ebenfalls mittels DAO auszulesen?
Dieser Bereich der Tabelle ist benannt, wie ich bereits erwähnt habe.
Nachdem ich in irgendeiner Textbox einen Wert oder mehrere Werte geändert habe, möchte ich bei Knopfdruck die gesamten Daten mitsamt geänderten Daten im gleichen Bereich in der Tabelle abspeichern. Anschließend Form schließen.

Der Grund warum ich bei Excel und DAO bleiben möchte, weil ich bereits große Programmteile und Datenbanken in Excel VBA erstellt habe, wo ich dort viele (Sub)Routinen per VBA löse und dort gut funktionieren
Kannst Du mir bitte hier noch behilflich sein? Hoffe, verlange ich nicht all zu viel.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Excel-Daten aus vorh. Excel Tabelle (2003) mit DAO importieren 
Autor: Michael_HU
Datum: 10.03.13 18:42

Hallo Blackbox,

habe das Auslesen und die Sätze an die gleiche Stelle wieder Zurückschreiben so gelöst:

 
it

Private Sub cmdSpeichern_Click()
Dim dbtmp As DAO.Database
Dim tblObj As DAO.TableDef
Dim rs As DAO.Recordset
Dim x As Integer
Dim dstr As String
Dim anz As Long
On Error GoTo trans_Err
dstr = "G:\Testprogramme_allgemein\Visual Studio 6.0\Abfragen und Aktualisieren von Excel-Daten mit ADO von ASP\testen.xls"
Set dbtmp = OpenDatabase(dstr, False, False, "Excel 8.0;")
Set rs = dbtmp.OpenRecordset("select * from `myRange2`")
rs.MoveFirst 'rs.MoveLast
anz = rs.Fields.Count 'Anzeige Feldanzahl nur für Kontrollzwecke
rs.Bookmark = rs.LastModified
'Daten wieder zurückschreiben
rs.Edit
rs.Fields(0).Value = Me.Text1
rs.Fields(1).Value = Me.Text2
rs.Fields(2).Value = Me.Text3
rs.Fields(3).Value = Me.Text4
rs.Fields(4).Value = Me.Text5
rs.Fields(5).Value = Me.Text6
rs.Fields(6).Value = Me.Text7
rs.Fields(7).Value = Me.Text8
rs.Fields(8).Value = Me.Text9
rs.Fields(9).Value = Me.Text10
rs.Update

trans_Exit:
rs.Close
Set rs = Nothing
Set dbtmp = Nothing
Set tblObj = Nothing
dstr = ""
Exit Sub
trans_Err:
Resume trans_Exit ' alles freigeben und schließen

'Clean up and close all
Unload Me
End Sub

Private Sub cmdLaden_Click()
Dim dbtmp As DAO.Database
Dim tblObj As DAO.TableDef
Dim rs As DAO.Recordset
Dim x As Integer
Dim dstr As String
Dim anz As Long
On Error GoTo trans_Err
dstr = "G:\Testprogramme_allgemein\Visual Studio 6.0\Abfragen und Aktualisieren von Excel-Daten mit ADO von ASP\testen.xls"
'Syntax
'expression .OpenDatabase(Name, Options, ReadOnly, Connect)
'Name: the name of an existing Microsoft database
'Options: Sets various options for the database, as specified in Remarks
'ReadOnly: True=read only, False=read and write access
'Connect: versch. Information inkl. Passwort
Set dbtmp = OpenDatabase(dstr, False, True, "Excel 8.0;")
If IsObject(dbtmp) Then
DoEvents
' Recordset-Objekt vom Typ Tabelle öffnen
' Im Bereich "myRange2" leigen die Daten i.d. Excel-Tabelle
Set rs = dbtmp.OpenRecordset("select * from `myRange2`")
rs.MoveFirst 'rs.MoveLast
anz = rs.Fields.Count 'Anzeige Feldanzahl nur für Kontrollzwecke
Me.txtBoxFieldAnzahl = anz

While Not rs.EOF 'BOF?
For x = 0 To rs.Fields.Count - 1
' Auslesen der Daten, wenn diese in einer Zeile sind
Me.Text1 = CStr(rs.Fields(0).Value)
Me.Text2 = CStr(rs.Fields(1).Value)
Me.Text3 = CStr(rs.Fields(2).Value)
Me.Text4 = CStr(rs.Fields(3).Value)
Me.Text5 = CStr(rs.Fields(4).Value)
Me.Text6 = CStr(rs.Fields(5).Value)
Me.Text7 = CStr(rs.Fields(6).Value)
Me.Text8 = CStr(rs.Fields(7).Value)
Me.Text9 = CStr(rs.Fields(8).Value)
Me.Text10 = CStr(rs.Fields(9).Value)
Next x
rs.MoveNext
Wend
End If
trans_Exit:
rs.Close
Set rs = Nothing
Set dbtmp = Nothing
Set tblObj = Nothing
dstr = ""
Exit Sub
trans_Err:
Resume trans_Exit ' alles freigeben und schließen
End Sub

Vielleicht geht auch einfacher, aber diese hier funktioniert mal.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Excel-Daten aus vorh. Excel Tabelle (2003) mit DAO importieren 
Autor: Michael_HU
Datum: 11.03.13 16:52

Hallo an Alle!

Die erste Programmvariante, Daten mit DAO 3.6 aus 2003 Excel-Tabelle aus einem def. Zeilenbereich "myRange2" auszulesen und diese evtl geänderten Daten wieder dorthin abzuspeichern geht ohne weiteres.

Eine zweite Möglichkeit interessiert mich mehr; Daten, die in einer Spalte aber in mehreren (z.b: 10) Zeilen stehen auszulesen und diese nach Änderung wieder dorthin mit DAO 3.6 abzulegen.
Das herauslesen der Spalte in Array und in die TextBoxen, die alle versch. Namen haben, zu platzieren geht. Siehe Code:

Private Sub cmdLaden_Click()
Dim dbtmp As DAO.Database
Dim rs As DAO.Recordset
Dim vRow() As Variant 'Angabe bei unbekannter Grösse der Tabelle
Dim src_File As String
Dim dstr As String
Dim rsAnzahl As Long 'Variable für Anzahl DS im Recordset
src_File = "testen.xls"
dstr = App.Path & "\" & src_File

On Error GoTo trans_Err
Set dbtmp = OpenDatabase(dstr, False, False, "Excel 8.0;")
If IsObject(dbtmp) Then
DoEvents
' Recordsetobjekt anlegen und Daten holen
' Recordset-Objekt vom Typ Tabelle öffnen
' Im Bereich "myRange2" leigen die Daten i.d. Excel-Tabelle
Set rs = dbtmp.OpenRecordset("select * from `myRange2`")
rsAnzahl = rs.RecordCount
If Not rs.BOF Or rs.EOF Then
vRow = rs.GetRows(10) 'wir haben 10 Textboxen
End If
Me.Text1 = vRow(0, 0)
Me.Text2 = vRow(0, 1)
Me.Text3 = vRow(0, 2)
Me.Text4 = vRow(0, 3)
Me.Text5 = vRow(0, 4)
Me.Text6 = vRow(0, 5)
Me.Text7 = vRow(0, 6)
Me.Text8 = vRow(0, 7)
Me.Text9 = vRow(0, 8)
Me.Text10 = vRow(0, 9)
End If
trans_Exit:
rs.Close
Set rs = Nothing
dbtmp.Close
Set dbtmp = Nothing
dstr = ""
Exit Sub
trans_Err:
Resume trans_Exit ' alles freigeben und schließen
End Sub

Leider komme ich nicht darauf, wie ich die in den einzelnen TextBoxen abgeänderten Daten wieder in dem "myRange2"-Bereich abspeichern könnte. Wieder mit Array, aber wie?
Hat jemand Idee bzw. Lösungsweg wie ich bewerkstelligen kann?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Excel-Daten aus vorh. Excel Tabelle (2003) mit DAO importieren 
Autor: Blackbox
Datum: 11.03.13 20:01

Hi,

schau mal hier. Ich habe allerdings ein ControlArray. Dazu habe ich ein Button eingeführt, das die Daten aus den Textboxen im Recordset saved.

Private db As Database
Private rs As Recordset
 
Private Sub Command1_Click()
   Dim n As Long
 
   For n = 0 To 2
      With rs
        .Edit
        .Fields(0).Value = Text1(n).Text
        .Update
        .MoveNext
      End With
   Next
 
End Sub
 
Private Sub Form_Load()
    Dim vRow As Variant
    Dim n As Long
 
    Set db = DBEngine.OpenDatabase("D:\MyExl.xls", False, False, "Excel 8.0")
    If IsObject(db) Then
        Set rs = db.OpenRecordset("MyBereich2")
        If Not rs.BOF Or rs.EOF Then
            vRow = rs.GetRows(3)
            For n = 0 To 2
               Text1(n).Text = vRow(0, n)
            Next
            rs.MoveLast
            rs.MoveFirst
        End If
    End If
End Sub
Eingelesen wird der Recordset also via GetRows en Block. Gespeichert wird aber wieder
als Row.

Beitrag wurde zuletzt am 11.03.13 um 20:27:56 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Excel-Daten aus vorh. Excel Tabelle (2003) mit DAO importieren 
Autor: Michael_HU
Datum: 12.03.13 07:29

Vielen Dank Blackbox!
Habe hier nur die Set-Anweisung ändern müssen:
Set rs = db.OpenRecordset("select * from `MyBereich2`")
Bei mir musste ich die Namen meiner Textboxen alle in „Text1” für die Array ändern müssen, aber das war ja zu erwarten. Die Indexierungen (0...9) hiefür in den Eigenschaften hat VB selbst gemacht.
Ansprechen kann ich die einzelnen TextBoxen später mit z.B.:
GezahlteGegenleistung = Text1(9).Text

Ein Problem habe ich, da die Datenformatierung ist weg, statt z.B.: 31.01.2013 habe ich nun „41305” in einer TextBox, wo ein Datum stehen sollte.
Wie überprüfe ich den Inhalt von „vRow(0, n)”, ob dieser Datumsformat hat?
Im String sind eigentlich die Punkte „.”., aber auch in den anderen habe ich die Tausender punkte! Mit „If InStr(vRow(0, n), ".") Then” geht es nicht.

Das spaltenweise Auslesen und Daten wieder zurück funktioniert.
Noch einmal vielen Dank dafür!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Excel-Daten aus vorh. Excel Tabelle (2003) mit DAO importieren 
Autor: Blackbox
Datum: 12.03.13 18:01

Hi,

mehrere Möglichkeiten. Entweder du prüfst vorher rs.Fields(0).Type oder nach RetRows mit VarType(vRow(0,1)) oder TypeName(vRow(0,1)). VarType gibt einen nummerischen Wert und TypeName einen String über den Typ des Variant. Dann entsprechend konvertieren. Wenn es ein Datum ist dann:

Text1.Text = CDate(vRow(0,1)) oder String
Text1.Text = CStr(vRow(0,1)) etc.

Auch gibt es die Funktion IsDate(), IsString, IsNummeric() um solche Dinge zu prüfen. GetRows ist allerdings auch fähig ganze Objekte zurückzugeben, wie auch Images etc. In diesem Fall wäre dann VarType eine Zahl die auf ein Interface hindeutet wie IDispatch oder IUnknown, oder ein Array im Fall von Bitmap etc.

Beitrag wurde zuletzt am 12.03.13 um 18:02:31 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Excel-Daten aus vorh. Excel Tabelle (2003) mit DAO importieren 
Autor: Michael_HU
Datum: 12.03.13 18:12

Danke für die schnelle Antwort.
Ich werde Heute noch ausmerzen und gebe Bescheid.

Gruß
Michael
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Excel-Daten aus vorh. Excel Tabelle (2003) mit DAO importieren 
Autor: Michael_HU
Datum: 13.03.13 08:44

Hallo Blackbox,
leider stotere ich beim Datum.
In der Quelltabelle sind die Werte in Zahlenformat und das eine Datumswert in Datumsformat abgespeichert, z.B.: Wert=1.003,76, Datum=31.01.2013.
Beim ersten Einlesen mit GetRows(n) werden alle Zahlenwerte in den TextBoxen angezeigt: Me.Text1(n).Text = vRow(0, n), allerdings ohne Tausender-Zeichen. Das werde ich nacher richtig formatiert ausgeben lassen.
Beim Datum habe ich aber nur den seriellen Zahlenwert 41305 anstatt 31.01.2013 in der Textbox.
Ändere ich nichts und speichere so alles ab, dann steht in der Quelltabelle 41035 als Standardwert ohne bestimmten Format.
Ändere ich das Datum in der TextBox auf 31.01.2013 und speichere alle, dann habe ich in der Quelltabelle 31012013 als Standardwert ohne bestimmten Format stehen.

Beim wieder Einlesen steht immer nur 31012013 in der TextBox.

Das Prüfen beim Einlesen mit VarType(vRow(0,n)) oder TypeName(vRow(0,n)) hat nichts gebracht. Bei VarType gibt mir immer „5” und bei TypeName „Double” aus, was gleichbedeutend mit Type ist.
Insgesamt habe ich 10 TextBoxen und davon ist der 8. mit Index(7) mit Datum:

Hypothekendarlehen(Auszahlungsbetrag) 8.842,70
Auszahlungskurs (%) 98
Zinssatz nominal (%) 3
Gesamtlaufzeit bzw. Zinsfestschreibung (Jahre) 10
Tilgungsfreie Jahre 1
Bearbeitungsgebühr einmalig 25,00
Kontogebühr pro Jahr 5,00
Darlehensbeginn 31.01.2013
Annuität p.a. 1.018,83
Gezahlte Gegenleistung 10.503,60

Diese Werte möchte ich einlesen, evtl. abändern und wieder abspeichern.

Gehbare Idee evtl?
Gruß
Michael
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Excel-Daten aus vorh. Excel Tabelle (2003) mit DAO importieren 
Autor: Michael_HU
Datum: 27.03.13 06:55

Vielen Dank Blackbox!
Hast viel geholfen. Mein Problem ist gelöst!
Gruß Michael
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel