Het probleem is CopyFromRecordset
- het wordt afgekapt bij 255 tekens, en het is niet de enige Excel.Range-methode die dat doet.
De vraag is:heb ik een methode die dat niet heeft? En heb je een OLEDB-stuurprogramma dat het met je Recordset doet voordat je zelfs maar in het stadium van schrijven naar het bereik komt?
U moet uw recordset doorlopen, in VBA, en het beledigende veld in VBA aanvinken voor een waarde van meer dan 255 tekens lang. Als de velden al zijn afgekapt, probeer dan de native Oracle Client-stuurprogramma's in uw verbindingsreeks te gebruiken in plaats van de Microsoft Oracle OLEDB-provider - Connections.com heeft de informatie.
Zodra u weet dat de recordset uw gegevens daadwerkelijk bevat, zonder afkappen, probeert u CopyFromRecordset opnieuw. Ik verwacht eigenlijk niet dat het een veld van meer dan 255 tekens lang zal schrijven, maar het is een tijdje geleden dat ik de fout tegenkwam, het zou kunnen zijn dat het is opgelost, en het is altijd leuk om een pessimist een aangename verrassing te geven.
Volgende:
Een VBA-vervanger voor CopyFromRecordset
Er zijn hier drie taken:
- Vul een VBA-arrayvariant met de gegevens met behulp van
Recordset.GetRows()
; - Transponeer de array, want GetRows is de verkeerde kant op voor Excel;
- Maak een doelbereik groter en schrijf de array als
Range.Value = Array
, een repetitieve taak die zou moeten worden geautomatiseerd in een ArrayToRange()-routine.
...En misschien wat bijkomend werk met het schrijven van de veldnamen, maar dat negeer ik in een kort antwoord.
Het eindresultaat is dat u deze code uitvoert:
ArrayToRange rngTarget, ArrayTranspose(rst.GetRows)
Het transponeren van de array is triviaal, maar hier is het toch:
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
...En ArrayToRange is triviaal als je geen controles toevoegt voor arraydimensies en formules in de doelcellen bewaart:het essentiële punt is dat je je gegevens in een enkele 'hit' kunt schrijven als de afmetingen van het bereik exact overeenkomen met de afmetingen van de array:
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
Een waarschuwing:in oudere versies van Excel (Office 2000, als ik me goed herinner) werd de array 'schrijven' nog steeds afgekapt tot 255 tekens. Dit is niet langer een probleem; en als je nog steeds XL2000 gebruikt, zijn cellen met een tekenreeks van meer dan 255 tekens een probleem dat je misschien blij maakt met de inkorting.