Das Problem ist CopyFromRecordset
- Es schneidet bei 255 Zeichen ab, und es ist nicht die einzige Excel.Range-Methode, die das tut.
Die Frage ist:Habe ich eine Methode, die das nicht tut? Und haben Sie einen OLEDB-Treiber, der es mit Ihrem Recordset macht, bevor Sie überhaupt in den Bereich schreiben?
Sie sollten Ihr Recordset in VBA durchlaufen und das fehlerhafte Feld in VBA überprüfen für einen Wert, der länger als 255 Zeichen ist. Wenn die Felder bereits abgeschnitten sind, versuchen Sie, anstelle des Microsoft Oracle OLEDB-Anbieters die nativen Oracle-Client-Treiber in Ihrer Verbindungszeichenfolge zu verwenden – Connections.com verfügt über die Informationen.
Wenn Sie wissen, dass das Recordset tatsächlich Ihre Daten ohne Kürzung enthält, versuchen Sie es erneut mit CopyFromRecordset. Ich erwarte eigentlich nicht, dass es ein Feld mit einer Länge von mehr als 255 Zeichen schreibt, aber es ist eine Weile her, seit ich auf den Fehler gestoßen bin, er könnte behoben worden sein, und es ist immer schön, einen Pessimisten angenehm zu überraschen.
Als nächstes:
Ein VBA-Ersatz für CopyFromRecordset
Hier gibt es drei Aufgaben:
- Füllen Sie eine VBA-Array-Variante mit den Daten unter Verwendung von
Recordset.GetRows()
; - Transponieren Sie das Array, weil GetRows die falsche Richtung für Excel ist;
- Vergrößern Sie einen Zielbereich und schreiben Sie das Array als
Range.Value = Array
, eine sich wiederholende Aufgabe, die in einer ArrayToRange()-Routine automatisiert werden sollte.
...Und vielleicht etwas Nebenarbeit beim Schreiben der Feldnamen, aber das ignoriere ich in einer kurzen Antwort.
Das Endergebnis ist, dass Sie diesen Code ausführen:
ArrayToRange rngTarget, ArrayTranspose(rst.GetRows)
Das Transponieren des Arrays ist trivial, aber hier ist es trotzdem:
Public Function ArrayTranspose(InputArray As Variant) As Variant
Application.Volatile False
Dim arrOutput As Variant
Dim i As Long
Dim j As Long
Dim iMin As Long
Dim iMax As Long
Dim jMin As Long
Dim jMax As Long
iMin = LBound(InputArray, 1)
iMax = UBound(InputArray, 1)
jMin = LBound(InputArray, 2)
jMax = UBound(InputArray, 2)
ReDim arrOutput(jMin To jMax, iMin To iMax)
For i = iMin To iMax
For j = jMin To jMax
arrOutput(j, i) = InputArray(i, j)
Next j
Next i
ArrayTranspose = arrOutput
End Function
...Und ArrayToRange ist trivial, wenn Sie keine Überprüfungen für Array-Dimensionen hinzufügen und Formeln in den Zielzellen beibehalten:Der wesentliche Punkt ist, dass Sie Ihre Daten in einem einzigen "Treffer" schreiben können, wenn die Dimensionen des Bereichs genau übereinstimmen Abmessungen des Arrays:
Public Sub ArrayToRange(rngTarget As Excel.Range, InputArray As Variant) ' Write an array to an Excel range in a single 'hit' to the sheet ' InputArray should be a 2-Dimensional structure of the form Variant(Rows, Columns)
' The target range is resized automatically to the dimensions of the array, with ' the top left cell used as the start point.
' This subroutine saves repetitive coding for a common VBA and Excel task.
' Author: Nigel Heffernan http://Excellerando.blogspot.com
On Error Resume Next
Dim rngOutput As Excel.Range
Dim iRowCount As Long Dim iColCount As Long
iRowCount = UBound(InputArray, 1) - LBound(InputArray, 1) iColCount = UBound(InputArray, 2) - LBound(InputArray, 2)
With rngTarget.Worksheet
Set rngOutput = .Range(rngTarget.Cells(1, 1), _ rngTarget.Cells(iRowCount + 1, iColCount + 1))
Application.EnableEvents = False
rngOutput.Value2 = InputArray
Application.EnableEvents = True
Set rngTarget = rngOutput ' resizes the range This is useful, most of the time
End With ' rngTarget.Worksheet
End Sub
Ein Hinweis zur Vorsicht:In älteren Versionen von Excel (Office 2000, wenn ich mich erinnere) wurde das Array 'write' immer noch auf 255 Zeichen gekürzt. Dies ist kein Problem mehr; und wenn Sie immer noch XL2000 verwenden, sind Zellen, die eine Zeichenfolge mit mehr als 255 Zeichen enthalten, ein Problem genug, dass Sie sich über die Kürzung freuen könnten.