sql >> Database >  >> RDS >> Oracle

SQL Query-uitvoer in VBA is anders dan in SQL Oracle

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:

  1. Vul een VBA-arrayvariant met de gegevens met behulp vanRecordset.GetRows();
  2. Transponeer de array, want GetRows is de verkeerde kant op voor Excel;
  3. Maak een doelbereik groter en schrijf de array alsRange.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.



  1. Meest efficiënte manier om IP-adres op te slaan in MySQL

  2. SQLServer - Hoe vind ik afhankelijke tabellen in mijn tabel?

  3. Hoe PostgreSQL 12-replicatie en failover te automatiseren met repmgr - Deel 2

  4. Waarom beginnen tabelnamen in SQL Server met dbo?