Vấn đề là CopyFromRecordset
- nó đang cắt bớt 255 ký tự và nó không phải là phương thức Excel.Range duy nhất làm được điều đó.
Câu hỏi đặt ra là:tôi có phương pháp nào không? Và bạn có trình điều khiển OLEDB đang làm điều đó với Bộ ghi của bạn trước khi bạn bắt đầu ghi vào dải không?
Bạn nên lặp qua tập bản ghi của mình, trong VBA và kiểm tra trường vi phạm trong VBA cho giá trị có độ dài vượt quá 255 ký tự. Nếu các trường đã bị cắt bớt, hãy thử sử dụng trình điều khiển Máy khách Oracle gốc trong chuỗi kết nối của bạn, thay vì nhà cung cấp Microsoft Oracle OLEDB - Connections.com sẽ có thông tin.
Khi bạn biết rằng tập bản ghi thực sự chứa dữ liệu của bạn mà không bị cắt bớt, hãy thử CopyFromRecordset một lần nữa. Tôi không thực sự mong đợi nó viết một trường có độ dài vượt quá 255 ký tự, nhưng đã lâu tôi gặp lỗi, nó có thể đã được sửa và thật tuyệt khi mang đến cho người bi quan một sự ngạc nhiên thú vị.
Tiếp theo:
VBA thay thế cho CopyFromRecordset
Có ba nhiệm vụ ở đây:
- Điền vào một biến thể mảng VBA với dữ liệu bằng cách sử dụng
Recordset.GetRows()
; - Chuyển đổi mảng, vì GetRows không đúng cách 'vòng forExcel;
- Tăng kích thước một dải ô mục tiêu và viết mảng dưới dạng
Range.Value = Array
, một tác vụ lặp đi lặp lại nên được tự động hóa trong quy trình ArrayToRange ().
... Và có thể một số công việc phụ trợ với việc viết tên trường, nhưng tôi bỏ qua điều đó trong một câu trả lời ngắn gọn.
Kết quả cuối cùng là bạn chạy mã này:
ArrayToRange rngTarget, ArrayTranspose(rst.GetRows)
Việc chuyển đổi mảng là việc không bình thường, nhưng dù sao thì đây cũng là điều tuyệt vời:
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
... Và ArrayToRange sẽ thật tầm thường nếu bạn không thêm kiểm tra kích thước mảng và bảo toàn công thức trong các ô đích:điểm quan trọng là bạn có thể ghi dữ liệu của mình trong một 'lần truy cập' nếu các kích thước của phạm vi khớp chính xác với kích thước của mảng:
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
Một lưu ý thận trọng:trong các phiên bản Excel cũ hơn (Office 2000, nếu tôi nhớ lại), mảng 'ghi' vẫn bị cắt ngắn thành 255 ký tự. Đây không còn là vấn đề nữa; và nếu bạn vẫn đang sử dụng XL2000, các ô chứa chuỗi vượt quá 255 ký tự là đủ vấn đề mà bạn có thể hài lòng về việc cắt bớt.