sql >> Databáze >  >> RDS >> Oracle

Výstup SQL Query ve VBA je jiný než v SQL Oracle

Problém je CopyFromRecordset - zkracuje se na 255 znaků a není to jediná metoda Excel.Range, která to dělá.

Otázka zní:mám metodu, která ne? A máte ovladač OLEDB, který to dělá s vaší sadou záznamů ještě předtím, než se dostanete do fáze zápisu do rozsahu?

Měli byste procházet svou sadu záznamů ve VBA a zkontrolovat problematické pole ve VBA pro hodnotu delší než 255 znaků. Pokud jsou pole již zkrácena, zkuste ve svém připojovacím řetězci použít nativní ovladače klienta Oracle namísto poskytovatele Microsoft Oracle OLEDB – informace bude mít Connections.com.

Jakmile zjistíte, že sada záznamů skutečně obsahuje vaše data, bez zkrácení, zkuste CopyFromRecordset znovu. Ve skutečnosti neočekávám, že zapíše pole delší než 255 znaků, ale už je to dlouho, co jsem narazil na chybu, možná byla opravena a je vždy příjemné udělat pesimistu příjemné překvapení.

Další na řadě:

Náhrada VBA za CopyFromRecordset

Jsou zde tři úkoly:

  1. Naplňte variantu pole VBA daty pomocí Recordset.GetRows();
  2. Transponujte pole, protože GetRows je pro Excel nesprávným způsobem;
  3. Zvětšete cílový rozsah a zapište pole jakoRange.Value = Array , opakující se úkol, který by měl být automatizován v rutině ArrayToRange().

...A možná nějaká pomocná práce s psaním názvů polí, ale to v krátké odpovědi ignoruji.

Konečným výsledkem je, že spustíte tento kód:


    ArrayToRange rngTarget, ArrayTranspose(rst.GetRows)

Transponování pole je triviální, ale stejně je to tady:


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
...A ArrayToRange je triviální, pokud nepřidáte kontroly rozměrů pole a uchování vzorců v cílových buňkách:základním bodem je, že můžete zapsat svá data do jediného „požadovaného zásahu“, pokud rozměry rozsahu přesně odpovídají rozměry pole:

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

Upozornění:ve starších verzích Excelu (Office 2000, pokud si vzpomínám) bylo pole 'write' stále zkráceno na 255 znaků. To již není problém; a pokud stále používáte XL2000, buňky obsahující řetězec přesahující 255 znaků jsou dostatečným problémem, takže byste mohli být rádi za zkrácení.



  1. Aplikace ve stylu průzkumu kolejí - Zobrazit všechny odpovědi na možnost

  2. Získejte další objednávku po limitu

  3. Java – Počítejte přesně 60 znaků z řetězce se směsí znaků UTF-8 a jiných než UTF-8

  4. Trigram Wildcard String Search v SQL Server