問題はCopyFromRecordset
です -255文字で切り捨てられており、それを実行するのはExcel.Rangeメソッドだけではありません。
問題は、そうでない方法はありますか?また、範囲への書き込みの段階に入る前に、Recordsetに対してそれを実行するOLEDBドライバーがありますか?
VBAでレコードセットをループし、VBAで問題のあるフィールドを確認する必要があります 長さが255文字を超える値の場合。フィールドがすでに切り捨てられている場合は、MicrosoftOracleOLEDBプロバイダーの代わりにネイティブのOracleClientドライバーを接続文字列で使用してみてください。Connections.comに情報があります。
レコードセットに切り捨てなしで実際にデータが含まれていることがわかったら、CopyFromRecordsetを再試行してください。実際には、255文字を超える長さのフィールドを書き込むことは期待していませんが、エラーが発生してからしばらく経ちましたが、修正された可能性があり、悲観論者に嬉しい驚きを与えるのはいつでもいいことです。
次は:
CopyFromRecordsetのVBA代替
ここには3つのタスクがあります:
-
Recordset.GetRows()
を使用して、VBA配列バリアントにデータを入力します; - GetRowsはExcelのラウンドの間違った方法であるため、配列を転置します。
- ターゲット範囲のサイズを大きくし、配列を
Range.Value = Array
として記述します。 、ArrayToRange()ルーチンで自動化する必要がある反復タスク。
...そして、フィールド名を書くための補助的な作業かもしれませんが、短い答えではそれを無視しています。
最終結果は、次のコードを実行することです。
ArrayToRange rngTarget, ArrayTranspose(rst.GetRows)
配列の転置は簡単ですが、とにかくここにあります:
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
...そして、配列の次元のチェックを追加せず、ターゲットセルに数式を保持しない場合、ArrayToRangeは簡単です。重要な点は、範囲の次元が完全に一致する場合、単一の「ヒット」でデータを書き込むことができるということです。配列の寸法:
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
注意事項:古いバージョンのExcel(Office 2000、思い出すと)では、配列'write'はまだ255文字に切り捨てられています。これはもはや問題ではありません。また、XL2000をまだ使用している場合は、255文字を超える文字列を含むセルで十分な問題が発生するため、切り捨てが喜ばれる可能性があります。