我有一个70000个元素(vb6)的数组,我需要将该数组作为excel列。 由于每个Excel表格都有66k的行数限制,所以我无法做到这一点。如何选择具有多个工作表的vb6中的excel范围
我试着选择多个工作表的范围,但我得到错误。
我有一个70000个元素(vb6)的数组,我需要将该数组作为excel列。 由于每个Excel表格都有66k的行数限制,所以我无法做到这一点。如何选择具有多个工作表的vb6中的excel范围
我试着选择多个工作表的范围,但我得到错误。
Updated Code #1
在顶部的代码已被更新以
ObjExcel.Transpose
不能用作解决初始数组的第一维的解决方法,因为X
中有超过65536条记录)我已经添加转储初始的替换码70K到工作表,然后从工作表设置30K和40K的情况下直接循环(参见Updated Code #2
)
Sub SplicedArray2()
Dim objExcel As Object
Dim objWB As Object
Dim X(1 To 70000, 1 To 1) As String
Dim Y()
Dim Z()
Dim lngRow As Long
Dim lngRow2 As Long
Dim lngStart As Long
'create intial 70K record array
For lngRow = 1 To UBound(X, 1)
X(lngRow, 1) = "I am record " & lngRow
Next
'records split size
lngStart = 30000
Set objExcel = CreateObject("excel.application")
'creats a new excel file. You may wish to open an existing one instead
Set objWB = objExcel.Workbooks.Add
ReDim Y(1 To UBound(X, 1) - lngStart, 1 To 1)
'Place records 30001 to 70000 from original array to second array
For lngRow2 = 1 To UBound(Y, 1)
Y(lngRow2, 1) = X(lngRow2 + lngStart, 1)
Next lngRow2
ReDim Z(1 To lngStart, 1 To 1)
'Place records 1 to 30000 from original array to third array
For lngRow2 = 1 To UBound(Z, 1)
Z(lngRow2, 1) = X(lngRow2, 1)
Next lngRow2
'Test for presence of second sheet, add it if there is only one sheet
If objWB.Sheets.Count < 2 Then objWB.Sheets.Add
'Dump first set of records to sheet 1
objWB.Sheets(1).[a1].Resize(UBound(Y, 1), UBound(Y, 2)) = Y
' Dump second set of records to sheet 2
objWB.Sheets(2).[a1].Resize(UBound(Z, 1), UBound(Z, 2)) = Z
objExcel.Visible = True
'close file (unsaved)
' objWB.Close False
' objExcel.Quit
' Set objExcel = Nothing
End Sub
Updated Code #2
Sub OtherWay()
'Works only in xl 07/10 if more than 65536 rows are needed
Dim objExcel As Object
Dim objWB As Object
Dim objws As Object
Dim lngRow As Long
Dim lngStart As Long
Dim X(1 To 70000, 1 To 1) As String
Dim Y()
Dim Z()
Set objExcel = CreateObject("excel.application")
'Add a single sheet workbook
Set objWB = objExcel.Workbooks.Add(1)
Set objws = objWB.Sheets.Add
For lngRow = 1 To UBound(X, 1)
X(lngRow, 1) = "I am record " & lngRow
Next
'records split size
lngStart = 30000
With objws.[a1]
.Resize(UBound(X, 1), UBound(X, 2)).Value2 = X
Y = .Resize(lngStart, UBound(X, 2)).Value2
Z = .Offset(lngStart, 0).Resize(UBound(X, 1) - lngStart, UBound(X, 2)).Value2
.Parent.Cells.ClearContents
End With
objWB.Sheets(1).[a1].Resize(UBound(Y, 1), UBound(Y, 2)) = Y
objWB.Sheets(2).[a1].Resize(UBound(Z, 1), UBound(Z, 2)) = Z
objExcel.Visible = True
'close file (unsaved)
' objWB.Close False
' objExcel.Quit
' Set objExcel = Nothing
End Sub
Original Code
像这样会做
下面的代码使用INT()
具有奇数记录处理阵列
即60001记录将被转储
[更新代码来显示的Excel自动化]
Sub SplicedArray()
Dim objExcel As Object
Dim objWB As Object
Dim X()
Dim Y()
Dim lngRow As Long
Dim lngStart As Long
Set objExcel = CreateObject("excel.application")
'creats a new excel file. You may wish to open an existing one instead
Set objWB = objExcel.Workbooks.Add
'create 60000*1 array from column A
X = objWB.Sheets(1).Range("A1:A60000").Value2
'determine if second array needs X/2+1 records for an odd sized array
If UBound(X, 1) Mod 2 <> 0 Then
ReDim Y(1 To Int(UBound(X, 1)/2) + 1, 1 To 1)
Else
ReDim Y(1 To Int(UBound(X, 1)/2), 1 To 1)
End If
'loop from 30001 to 60000
For lngRow = Int(UBound(X, 1)/2) + 1 To UBound(X, 1)
' put value of row 30001 column 1 into row 1 column 1 of second array
' ......
' put value of row 60000 column 1 inro row 30000 column 1 of second array
Y(lngRow - Int(UBound(X, 1)/2), 1) = X(lngRow, 1)
Next lngRow
' Dump first half of records from orginal array to sheet 1
objWB.Sheets(1).[a1].Resize(Int(UBound(X, 1)/2), UBound(X, 2)) = X
' Dump second half of records from new array to sheet 2
objWB.Sheets(2).[a1].Resize(UBound(Y, 1), UBound(Y, 2)) = Y
'close file (unsaved)
objWB.Close False
objExcel.Quit
Set objExcel = Nothing
End Sub
你的代码的胆量工作正常,但作为一个例子,我很难遵循:为什么这是在一个新的,不可见的Excel实例中完成的然后关闭而不保存?第一张纸在完成后仍然有60,000行数据(我停止并在创建后将数据添加到Sheet1)。对于只用一张纸打开一本书的人(如我)也需要添加一张。最后,如果它提到了70,000个数组@jeyaganesh,那将会很好。对不起,太挑剔了! – 2011-12-28 15:26:36
@dougglancy在vb中问的问题与vba相反,现有的二维数组很可能来自Excel的外部,所以我的重点是显示如何将一个数组拆分为2,以便为一个自动Excel实例转储为2个工作表。我不得不从某个地方创建一个数组进行演示,这就是'X'的所有初始数据填充的目的 - 我并不打算删除“额外”记录,但我可以看到为什么会导致查询。我将添加代码,根据您的评论 – brettdj 2011-12-28 19:37:43
@dougglancy检查第二个工作表。当我读第一张“30K”的评论时,我将数组修剪为60k,因为我认为将数组分成一半的方法对于任何数据大小来说比单纯的减法更有用。我将提供一个替代方案,将70K转换为30k和40k加上使用转发器来实际修剪第一个阵列。感谢您的意见 – brettdj 2011-12-28 19:42:09
是是一个字符串数组(一维)或2D阵列已经适于倾倒到Excel?无论哪种情况,您都需要调整阵列大小以适应2列。 – brettdj 2011-12-28 05:57:04
它是一个二维数组。 – Jeyaganesh 2011-12-28 06:01:51
如何调整数组的大小?可以说我需要将第30000行放在第一张表中,并在下一个 – Jeyaganesh 2011-12-28 06:02:24