| |
Visual-Basic EinsteigerExcel-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 | |
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 | |
Re: Excel-Daten aus vorh. Excel Tabelle (2003) mit DAO importieren | | | Autor: Blackbox | Datum: 08.03.13 21:16 |
| Hi,
ActiveSheet.CopyFromRecordset. | |
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? | |
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. | |
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? | |
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. | |
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. | |
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. | |
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? | |
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. | |
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! | |
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. | |
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 | |
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 | |
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 | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevCoolbar 3.0
Professionelle Toolbars im modernen Design!
Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access Weitere Infos
|