PDA

Vollständige Version anzeigen : Werte per VBA aus Tabelle auslessen


Mikes
27.02.2001, 14:35
Wie kann ich ALLE Werte aus einem Feld mit VBA auslesen und als Variablen im Modul verwenden?
Zb. Tabelle1 hat 10 DS und aus dem Feld5 brauche ich alle 10 Werte im Modul als Variablen f1,f2,..,f10 für wetere Berechnungen.
DANKE

embe
27.02.2001, 14:56
Hi,

also um das ganze dynamisch zu halten solltest du die Werte einem Array zuweisen (also nicht einzelnen variablen)

dim db as database
dim rs as recordset
dim i as integer
dim werte() as wertVonDeinenFeldern

set db=dbengine(0)(0)
set rs=db.openrecordset("name",db_open_snapshot)
i=0
if not (rs.eof=true and rs.bof=true) then
rs.movefirst
while not rs.eof
werte[i]=rs![Feld]
rs.movenext
i=i+1
wend
endif

... hoffe das reicht als anhaltspunkt
mfg
Mario

Mikes
28.02.2001, 06:59
Hallo Mario,
Super, das ist noch besser, so kann ich belibig viele DS auslesen, also ganz gut !
Nun, funktioniert nicht ganz ! So habe ich das gemacht:
Private Sub Form_Open(Cancel As Integer)

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim i As Integer
Dim werte() As Double

Set db = DBEngine(0)(0)
Set rs = db.OpenRecordset("Bewertungsfaktor", DB_OPEN_SNAPSHOT)
i = 0
If Not (rs.EOF = True And rs.BOF = True) Then
rs.MoveFirst
While Not rs.EOF
werte [i] = rs![FaktorWert]
rs.MoveNext
i = i + 1
Wend
End If
End Sub

aber hier bekomme ich Kompilierfehler bei ...=rs![FaktorWert]...Fehler beim Kompilieren: Sub, Function oder Property erwartet !
Habe schon probiert mit Dim werte() as Variant aber nix.
Was mache ich falsch ?
DANKE FÜR DEINE HILFE !!!
Dario

Sascha Trowitzsch
28.02.2001, 11:28
Der Index von 'werte' wird so angesprochen: werte(i), nicht in rechteckigen Klammern (...wir haben hier ja Basic...)
Und: Dim werte() As ... reicht nicht, um ein dynamisches Array anzulegen. Die Zahl der Elemente muss mit ReDim angegeben werden.
Füge nach rs.movefirst ein:

ReDim werte(rs.RecordCount)

Ciao, Sascha

Mikes
28.02.2001, 12:35
Hm, hier bin ich nicht ganz zuhause !?
Jetzt schaut das so aus:

Private Sub Form_Open(Cancel As Integer)
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim i As Integer
Dim werte() As Double
Set db = DBEngine(0)(0)
Set rs = db.OpenRecordset("Bewertungsfaktor", DB_OPEN_SNAPSHOT)
i = 0
If Not (rs.EOF = True And rs.BOF = True) Then
rs.MoveFirst
ReDim werte(rs.RecordCount)
While Not rs.EOF
werte(i) = rs![FaktorWert]
rs.MoveNext
i = i + 1
Wend
End If
End Sub

Jetzt bekomme ich nach 2 Durchläufe (beim 3. DS) ein Laufzeitfehler '9': Index auserhalb des gültigen Bereichs!
Was mache ich schon wieder falsch?
Kann ich bitte ganze Prozedur bekommen, wie schaut das aus ?
Und weitere Frage: wie verwende ich dann diese Variablen? zB:a=2*werte(1)+3*werte(2) oder wie ?

embe
28.02.2001, 13:55
Hi mikes

Also, das Problem liegt darin, daß recordCount erst dann die Anzahl der Datensätze liefert, wenn auf alle Datensätze zugegriffen wurde. Dies erreichst du dadurch, daß du mit rs.movelast auf den letzten DS gehst. Unten jetzt die fertige Prozedur.

Private Sub Form_Open(Cancel As Integer)
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim i As Integer
Dim werte() As Double
Set db = DBEngine(0)(0)
Set rs = db.OpenRecordset("Bewertungsfaktor", DB_OPEN_SNAPSHOT)
i = 0
If Not (rs.EOF = True And rs.BOF = True) Then
rs.MoveLast
ReDim werte(rs.RecordCount)
rs.MoveFirst
While Not rs.EOF
werte(i) = rs![FaktorWert]
rs.MoveNext
i = i + 1
Wend
End If
End Sub

Zu deiner 2. Frage. Völlig richtig, du greifst auf die Array Werte mit werte(indexnummer) zu
also z.B werte(0)*werte(1) multipliziert 1. Array wert mit 2.

Hab die obige Prozedur getestet u. funktioniert.
Viel spaß damit ;)
Mario

Mikes
28.02.2001, 15:10
SUPER ! Funktioniert echt gut !
VIELEN DANK FÜR DEINE HILFE !!!
Das war SUPER HILFE !!!
DANKE !
MfG Dario