Daten von SQL-DB in Excel

  • VBScript

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Ovoxo.

    Daten von SQL-DB in Excel

    Hallo zusammen,

    Ich habe ein Problem. Ich versuche via VBScript Daten von meiner DB zu holen und in Excel-Files zu schreiben.
    De Prozess lauft im Hintergrund ab und ich sollte 5 Excel-Files erhalten. Sobald ein File fertig ist, wird es auf dem Desktop gespeichert und das nächste wird bearbeitet.
    Das funktioniert alles wunder. Nur das Problem ist, sobald ein File fertig ist und ich es öffne, lädt es auch das File welches gerade abgefüllt wird.
    Nun erhalte ich eine Error-Meldung, sobald ich im bearbeitenden File in ein leeres Feld klicke.

    Wie kann ich das beheben?

    Hoffe habe es irgendwie verständlich formuliert.

    Quellcode

    1. Option Explicit
    2. DIM Cn, sql, rs, item, objExcel, objWorkbook, objWorksheet, count, FileName, check
    3. DIM i, x, z, y, b, n, q, a
    4. Dim arrItem(300)
    5. Dim arrDB
    6. Dim arrCondition
    7. Dim arrContens
    8. Dim arrTitle
    9. Dim arrText
    10. arrCondition = Array("Mitgliedtyp","Mitgliedtyp","BusinessRelation","FachzeitschriftAbo","FachzeitschriftMAGeschenk","ZeitschriftAboKontakt","FachzeitschriftGratisAbo","ZeitschriftAboGratis")
    11. arrDB = Array("Companies","Companies","Companies","Companies","Contacts","Contacts","Companies","Contacts")
    12. arrContens = Array(1,2,8,1,1,1,1,1)
    13. arrTitle = Array("Aktivmitglieder","Passivmitglieder","Partner","Fachzeitschriften_(zahlbar)","Fachzeitschriften_Mitarbeiter","Fachzeitschrift_(zahlbar)","Fachzeitschrift_Gratis","Fachzeitschrift_Gratis")
    14. arrText = Array("Mitglieder","Firma_Fachzeitschriften","Kontakt_Fachzeitschriften","Firma_Fachzeitschriften_Gratisabo","Kontakt_Fachzeitschriften_Gratisabo")
    15. i = 0
    16. x = 0
    17. Z = 1
    18. y = 0
    19. b = 2
    20. n = 0
    21. a = 1
    22. q = true
    23. check = true
    24. SET Cn = CreateObject("ADODB.Connection")
    25. Set objExcel = CreateObject("Excel.Application")
    26. objExcel.Visible = false
    27. Cn.ConnectionString = "Provider = SQLOLEDB; Data Source = DB; User ID = User; Password = PW; Initial Catalog = Tabelle;"
    28. Cn.Open 'Verbindung herstellen Combit DB
    29. Aktivmitglieder()
    30. IF Cn.State = 1 THEN
    31. Cn.Close
    32. objExcel.DisplayAlerts = false
    33. objExcel.Quit
    34. SET Cn = Nothing
    35. set objExcel = Nothing
    36. set objWorkbook = Nothing
    37. Set objWorksheet = Nothing
    38. MsgBox("Closed")
    39. ELSE
    40. MsgBox("Failed")
    41. END IF
    42. Sub Aktivmitglieder()
    43. While check = true
    44. if(q = true) then
    45. Set objWorkbook = objExcel.Workbooks.Add()
    46. q = false
    47. END if
    48. If(n >= 7) then
    49. check = false
    50. End If
    51. Set objWorksheet = objWorkbook.Worksheets(a)
    52. objWorksheet.Name = arrTitle(i)
    53. objExcel.Cells.EntireColumn.AutoFit
    54. Filename = "C:\Users\Administrator\Desktop\" & arrText(x) & ".xlsx"
    55. sql = "SELECT COUNT(*) FROM dbo." & arrDB(i) & " Where " & arrCondition(i) & "=" & arrContens(i)
    56. SET rs = Cn.Execute(sql)
    57. count = rs(0)
    58. IF (count = 0) OR (IsNull(count)) THEN
    59. MsgBox("No Items Found")
    60. ELSE
    61. sql = "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE table_name = '" & arrDB(i) & "'"
    62. SET rs = Cn.Execute(sql)
    63. Do UNTIL rs.EOF
    64. for each item IN rs.Fields
    65. if (item = "") OR (IsNull(item)) then
    66. arrItem(y) = "Empty"
    67. ELSE
    68. arrItem(y) = item
    69. END IF
    70. objWorksheet.Cells(1,z).Font.FontStyle = "Bold"
    71. objWorksheet.Cells(1,z)= arrItem(y)
    72. z = z + 1
    73. y = y + 1
    74. Next
    75. rs.MoveNext
    76. Loop
    77. y = 0
    78. Z = 1
    79. sql = "SELECT * FROM dbo." & arrDB(i) & " Where " & arrCondition(i) & "=" & arrContens(i)
    80. SET rs = Cn.Execute(sql)
    81. DO UNTIL rs.EOF
    82. For Each item IN rs.Fields
    83. IF (item = "") OR (IsNull(item)) THEN
    84. arrItem(y) = ""
    85. ELSE
    86. arrItem(y) = item
    87. END IF
    88. objWorksheet.Cells(b,z)= arrItem(y)
    89. y = y + 1
    90. z = z + 1
    91. NEXT
    92. b = b + 1
    93. y = 0
    94. z = 1
    95. rs.MoveNext
    96. LOOP
    97. i = i + 1
    98. b = 2
    99. n = n + 1
    100. a = a + 1
    101. If(n = 3) or (n = 4) or (n = 6) or (n = 7) or (n = 8) then
    102. q = true
    103. x = x + 1
    104. a = 1
    105. objWorkbook.SaveAs FileName
    106. END IF
    107. END If
    108. Wend
    109. END SUB
    Bilder
    • 25-03-2015 13-36-02.jpg

      36,64 kB, 478×239, 155 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Ovoxo“ ()

    Ich nehme an, dass dein Recordset mehr als 300 Einträge hat und damit dein Array sprengt.

    Tipp:
    Verwende einen vernünftigen Debugger, z.B. VBSedit

    Alternativ kannst du das Script auch in Excel entwickeln.
    Dazu musst du die Main-Routine halt in ein Sub packen.
    Wenn es zufriedenstellend läuft, kannst du es immer noch in VBS zurück konvertieren.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Leider liegt es nicht am Recordset, habe es geprüft sind nicht mehr als 300 Einträge.
    Gibt es eine Möglichkeit die FIles in einen Ordner zu speichern und diesen solange unsichtbar lassen bis es abgeschlossen ist?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Ovoxo“ ()

    Ovoxo schrieb:

    Leider liegt es nicht am Recordset, habe es geprüft sind nicht mehr als 300 Einträge.
    Es wird dir nichts übrig bleiben, als das Script in einer vernünftigen Umgebung zu entwickeln.
    Wie gesagt: VBSedit oder Excel.
    Mit dem Texteditor wirst du an jeder Stolperstelle auf die Schnauze fallen.

    Ovoxo schrieb:

    Gibt es eine Möglichkeit die FIles in einen Ordner zu speichern und diesen solange unsichtbar lassen bis es abgeschlossen ist?
    Nicht wirklich. Es gibt zwar ein Hidden-Attribut, aber das macht sie nicht wirklich unsichtbar.
    Du kannst Dateien in einem temporären Ordner speichern und sie nach Fertigstellung an den endgültigen Platz verschieben.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --