Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Problem mit OpenRecordset (Array)

Betrifft: Problem mit OpenRecordset (Array) von: chris b.
Geschrieben am: 18.02.2008 07:29:13

Hallo und wunderschönen Montag morgen,
ich muss wieder einmal um eure Hilfe bitten.
Ich öffne eine Datenbank und will die werte in ein Sheet eintragen.
das funktioniert auch zum teuil super.
Nur ist mir gerade ein Problem aufgefallen.
Ich öffne die datenbank mit den codes(siehe unten)
dann rufe ich mich
"update" das Makro update auf und übergebe mit z den zähler einer Variable z.b 10
das heißt das die daten die gerade in dem array(rsetTB) sind in die Zeile 10 eingetragen werden sollen.
gehe ich dann mit der Maus über das aktuell einzutragende Array zeigt es mir bei einem bestimmten durchlauf einen Wert an.Also wenn ich mit der Maus über rsetTB.Fields(w) <- fahre zeigt es mit zum beispiel an "in bearbeitung" gehe ich mit der Maus weg und fahre noch einmal darüber zeigt es mir als wert null an und trägt nichts ein in ie zelle in der Exceltabelle.
Woran kann das liegen ?

Vielen Dank schon einmal wieder für eure Hilfe !
gruß Chris

Set rsetTB = conDB.OpenRecordset(strSQL, dbOpenDynamic)

With rsetTB
If .RecordCount > 0 Then
Do While Not .EOF

lRecCnt = lRecCnt + 1

  

Betrifft: AW: Problem mit OpenRecordset (Array) von: Luschi
Geschrieben am: 18.02.2008 08:22:21

Hallo chris b.,

eine Begründung von mir findest Du hier:
https://www.herber.de/forum/archiv/908to912/t909282.htm#909326
(darin der vorletzter Beitrag)

Gruß von Luschi
aus klein-Paris


  

Betrifft: AW: Problem mit OpenRecordset (Array) von: chris b.
Geschrieben am: 18.02.2008 08:43:48

Hallo Luschi,
danke für deine Schnelle Antwort.
jetzt klappt nichts mehr.
verstehe den Beitrag auch nicht so ganz.
Hier ein kleiner teil meines Codes. Hoffe du kannst mir noch einmal helfen.


Set rsetTB = conDB.OpenRecordset(strSQL, dbOpenDynamic)
rsetTB.MoveLast
With rsetTB
If rsetTB.RecordCount = 0 Then

Do While Not .EOF
'MsgBox obj_datenbank.Worksheets("daten" & Version).Cells(obj_datenbank.Worksheets("daten" & Version).Rows.Count, 1).End(xlUp).Row

For zz = 2 To obj_datenbank.Worksheets("daten" & Version).Cells(obj_datenbank.Worksheets("daten" & Version).Rows.Count, 1).End(xlUp).Row
MsgBox obj_datenbank.Worksheets("daten" & Version).Cells(zz, 1) & " - " & .Fields(0)
If obj_datenbank.Worksheets("daten" & Version).Cells(zz, 1) = rsetTB.Fields(0) Then 'zum prüfen ob aktuellen Änderungsnummer gleich ist mit daten im array


'----------
'Einfügen der Arrays (Daten) in Excelsheet
'Vorhandene Daten werden nicht belöscht nur überschrieben ...

'Schleife über einzelne einträge im Array (selbe Reihenfolge wie einträge in Tabelle)
w = 0
For s = A_s To A_e
w = s - 100
cbp = rsetTB.Fields(w)
obj_datenbank.Worksheets("daten" & Version).Cells(zz, s) = cbp
Next


  

Betrifft: AW: Problem mit OpenRecordset (Array) von: Luschi
Geschrieben am: 18.02.2008 09:08:03

Hallo chris b.,

mal 'ne Frage: Wozu willst Du wissen, wieviele DS im Recordset sind, die Information speicherst Du doch garnicht. Wenn der RecordSet geöffnet ist, dann ist die Information 'rsetTB.RecordCount' nicht verwertbar, aber eines ist bekannt:
Wenn kein Datensatz im RecordSet vorhanden ist, dann liefert 'rsetTB.eof' den Wert 'True'
Deshalb laß die Zeile 'If .RecordCount > 0 Then' einfach weg und beginne so:

Set rsetTB = conDB.OpenRecordset(strSQL, dbOpenDynamic)
With rsetTB
   Do While Not .EOF
   'hier die Befehle

   'nächsten DS im RecordSet ansteuern
   rsetTB.MoveNext
   Loop
End With

Wenn kein DS im Recordset sich befindet, dann wird die 'Do While'-Schleife
einfach übersprungen.

Gruß von Luschi
aus klein-Paris



  

Betrifft: AW: Problem mit OpenRecordset (Array) von: chris b.
Geschrieben am: 18.02.2008 10:01:39

Hallo Luschi...
hilfe es klappt nicht bei mir :((((((((((
Bitte um deine Hilfe.
Wenn Nummern in Spalte A doppelt vorkommen wird einfach der erste eintrag nicht geschrieben und weiter fehler :((
habe hier mal meinen code der das alles machen sollte..
Wäre wirklich super wenn du oder jemand mir helfen kann.


Option Explicit

Public Const Version As String = "_v.01_02_08"

Dim wspDB As Workspace
Dim strConnect As String
Dim conDB As Connection
Dim strSQL As String
Dim rsetTB As Recordset
Dim lRecCnt As Long
Dim cb As Name
Dim zz
Dim strSQL_teil
Dim s

Public Const A_s As Integer = 102 'Daten Spalten IN Excel die von Oracle gefüllt werden. (Allg. Daten START spalte)
Public Const A_e As Integer = 123 'Daten Spalten IN Excel die von Oracle gefüllt werden. (Allg. Daten ENDE spalte)

Public Const U_s As Integer = 126 'Daten Spalten IN Excel die von Oracle gefüllt werden. ( Daten START spalte)
Public Const U_e As Integer = 204 'Daten Spalten IN Excel die von Oracle gefüllt werden. ( Daten ENDE spalte)


Public Const PfadDatenbank = "pfad.xls"

Dim obj_datenbank As Workbook



Sub auto_open() 'holt daten aus K5AAS und spielt nur benötigte Daten in Tabelle

If MsgBox("Oracle update starten ?", vbYesNo) = vbYes Then
Else
Exit Sub
End If


'Prüfen ob Zugriff auf Datenbank ok - wenn nicht Programm abbruch - Datei schliesen
If Dir(PfadDatenbank) = "" Then
    MsgBox ("keine Verbindung zur Datenbank vorhanden. "), vbCritical, "warnung - Zugriff"
    MsgBox ("Programm wird geschlossen"), vbCritical, "kein Zugriff auf Datenbank"
    ThisWorkbook.Close False
    End
Else
'Zugriff OK - Datenbank vorhanden
End If

'----- Datenbank vorhanden (Object verbindung erstellen)
Set obj_datenbank = Workbooks.Open(PfadDatenbank, False, , , "passi")
'Datenbank ausblenden wenn sichtbar
If Windows(obj_datenbank.Name).Visible = True Then Windows(obj_datenbank.Name).Visible = False

'Prüfen ob Datenbank erfolgreich geöffnet wurde
If Not obj_datenbank Is Nothing Then
Else
MsgBox ("Fehlerhaftes Passwort für Datenbank" & Chr(10) & "Datenbank konnte nicht geöffnet  _
werden - bitte erneut versuchen"), vbCritical, "Fehler beim öffnen - abbruch"
    ThisWorkbook.Close False
End If


If Not obj_datenbank Is Nothing Then
Else
MsgBox ("Fehlerhaftes Passwort für Datenbank - bitte erneut versuchen"), vbCritical, "Fehler  _
beim öffnen - abbruch"
End
End If

'prüft ob Datenbank aktuelle Version bzw. Programm aktuell (abgleich Version)
If obj_datenbank.Worksheets(1).Name = "daten" & Version Then
'Zugriff ok richtige Version
Else
MsgBox ("Datenbank Fehlerhaft oder Programm nicht aktuell.Bitte wenden Sie sich "), vbCritical,  _
"abbruch"
    obj_datenbank.Close False
    ThisWorkbook.Close False
    Exit Sub
    End
End If




Application.EnableCancelKey = xlDisabled

Application.ScreenUpdating = False


     Set wspDB = CreateWorkspace("XXWorkspace", "Excel", "", dbUseODBC)

      strConnect = ("ODBC;DSN=BA_ORA;DBQ=K5_ISP.WORLD;UID=username;pwd=passwort")
     
     Set conDB = wspDB.OpenConnection("MyConName", dbDriverNoPrompt, , strConnect)
     

'vorhandene Werte löschen ..

obj_datenbank.Worksheets("daten" & Version).Range("daten").ClearContents


strSQL_teil = ""
strSQL = ""

'Teil 1   String um Datenbank Einträge  auszulesen
 For s = A_s To A_e
      For Each cb In obj_datenbank.Names
        'prüfen ob name in richtigem sheet(sheet(1)
        If InStr(1, cb, "daten" & Version) > 0 Then
            If obj_datenbank.Worksheets("daten" & Version).Range(cb).Column = s Then
                If cb.Name <> "daten" Then
                    strSQL_teil = strSQL_teil & cb.Name & ","
                Else
                End If
            Else
            End If
        End If
       Next
     Next
'---------  ENDE Teil 1   ---------------



'Teil 2   String um Datenbank Einträge  auszulesen
  For s = U_s To U_e
       For Each cb In obj_datenbank.Names
        'prüfen ob name in richtigem sheet(sheet(1)
        If InStr(1, cb, "daten" & Version) > 0 Then
            If obj_datenbank.Worksheets("daten" & Version).Range(cb).Column = s Then
                strSQL_teil = strSQL_teil & cb.Name & ","
            Else
            End If
        End If
        Next
Next
'---------  ENDE Teil 2   ---------------



' ------ String Fertig (erstellen) für Datenbankabfrage
strSQL_teil = Left(strSQL_teil, Len(strSQL_teil) - 1)
strSQL = "SELECT AENDSCHEINNR,REGNR," & strSQL_teil & " FROM datenn"


     Set rsetTB = conDB.OpenRecordset(strSQL, dbOpenDynamic)
     
        With rsetTB
        If .RecordCount > 0 Then
           Do While Not .EOF
           
                lRecCnt = lRecCnt + 1



'String löschen
strSQL_teil = ""
strSQL = ""

For zz = 3 To obj_datenbank.Worksheets("daten" & Version).Cells(obj_datenbank.Worksheets("daten" _
 & Version).Rows.Count, 1).End(xlUp).Row
    If obj_datenbank.Worksheets("daten" & Version).Cells(zz, 1) = .Fields(0) Then
        Update zz
    Else
    End If
Next

                .MoveNext
           
           Loop

        Else
           MsgBox "Es sind keine Datensätze vorhanden!"
        End If
        .Close
    End With
     
     conDB.Close
     
'Windows(Obj_Datenbank.Name).Close True

Application.ScreenUpdating = True


Application.EnableCancelKey = xlInterrupt

'MsgBox ("Aktualisierte Datenbank wird gespeichert"), vbInformation, "Info ..."
'Application.DisplayAlerts = False
'obj_datenbank.Save
'obj_datenbank.Close
'Application.DisplayAlerts = True

'ThisWorkbook.Close False
End Sub





Sub Update(zeile)
Dim w
'Einfügen der Arrays (Daten) in Excelsheet
'Vorhandene Daten werden nicht belöscht nur überschrieben ...

'Schleife über einzelne einträge im Array (selbe Reihenfolge wie einträge in Tabelle)
 For s = A_s To A_e
w = s - 100
obj_datenbank.Worksheets("daten" & Version).Cells(zeile, s) = rsetTB.Fields(w)
 Next


 For s = U_s To U_e
 w = s - 108
obj_datenbank.Worksheets("daten" & Version).Cells(zeile, s) = rsetTB.Fields(w)
 Next
 
End Sub




  

Betrifft: AW: Problem mit OpenRecordset (Array) von: Luschi
Geschrieben am: 18.02.2008 10:56:33

Hallo chris b.

solange diese Zeile
If .RecordCount > 0 Then
im Code ist, kann das Alles nur ein Zufallsprodukt werden.
Set rsetTB = conDB.OpenRecordset(strSQL, dbOpenDynamic)
With rsetTB
''If .RecordCount > 0 Then --> raus damit
Do While Not .EOF
'usw.

Wenn die Spalte A keine eindeutigen Werte besitzt, dann muß man eben mit einem 2. Wert aus dem RecordSet vergleichen, bevor die Update-Routine laufen kann.

Gruß von Luschi
aus klein-Paris


  

Betrifft: AW: Problem mit OpenRecordset (Array) von: chris b.
Geschrieben am: 18.02.2008 11:02:30

Bringt alles nichts...
einmal hat die variable einen wert und einmal nicht:(
Aber ich baue es jetzt so um das ich erst einmall alle rsetTB.Fields(2)

in ein array auslesen lasse.
Weil immer wenn ich mit der maus das erste mal über rsetTB.Fields(2) fahre zeigt es mir einen wert an:
rsetTB.Fields(2) = "wert"
und beim nächsten mal zeigt es mir an also nur wenn ich mit der maus wegziehe im debugmodus udn erneut darüber fahre. rsetTB.Fields(2) = null

Danke trotzdem für deine Hilfe.
Hoffe ich bekomme es so hin ..


  

Betrifft: AW: Problem mit OpenRecordset (Array) von: chris b.
Geschrieben am: 18.02.2008 15:15:00

erledigt.
greife anders auf die daten zu.
Danke noch mal Luschi !


 

Beiträge aus den Excel-Beispielen zum Thema "Problem mit OpenRecordset (Array)"