【发布时间】:2017-09-16 18:25:34
【问题描述】:
今天我开始学习 VBA 中的数组。
在尝试了一些简单的脚本后,我想创建一个对我的项目有用的脚本。
在我的 excelsheet 中,我有一个需要转换为新工作表的数据表。仅适用于第 4 行中具有“详细信息”的每一列。
最简单的想象方法是将每个相关列的值写入数组,读取结果并将其写入新工作表,然后再次执行操作。
但我认为我使用错误的方法将变量写入我的数组。 我查看了我的代码,我的所有声明都不正确。
您能帮帮我吗,我怎样才能正确更改对数组的写入?
Sub Import_data()
Dim LastCol As Integer
Dim LastRow As Long
Dim WS As Worksheet
Dim Arr() As Variant
Dim dim1 As Long, dim2 As Long
Set WS = Sheets("Budget to Table")
' Copy data from Budget to Table
With WS
LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
dim1 = .Cells(.Rows.Count, "B").End(xlUp).Row - 5
dim2 = 4
' Copy information
For i = 3 To LastCol
If Cells(4, i).Value = "Detail" Then
ReDim Arr(0 To dim1, 0 To dim2)
For dim1 = LBound(Arr, 1) To UBound(Arr, 1)
For dim2 = LBound(Arr, 2) To UBound(Arr, 2)
Arr(dim1, 0) = Range(Cells(dim1, 2)) 'Should have the variable length but always column B
Arr(dim1, 1) = Range(Cells(dim1, i)) 'Should have the variable length but always column i
Arr(dim1, 2) = Range(Cells(1, i)) 'Is always the same header info from row 1 of the chosen column
Arr(dim1, 3) = Range(Cells(2, i)) 'Is always the same header info from row 2 of the chosen column
Arr(dim1, 4) = Range(Cells(3, i)) 'Is always the same header info from row 3 of the chosen column
Next dim2
Next dim1
End If
'writing the contents in a new sheet
Worksheet.Add
For dim1 = LBound(Arr, 1) To UBound(Arr, 1)
For dim2 = LBound(Arr, 2) To UBound(Arr, 2)
ActiveCell.Offset(dim1, dim2).Value = Arr(dim1, dim2)
Next dim2
Next dim1
Erase Arr
Next i
End With
End Sub
如果我需要提供更多指导,请告诉我。
我猜dim1 和dim2 的值永远不会改变,所以这不会创建我所追求的循环。
编辑:我在这里上传了文件:https://dubblej15.stackstorage.com/s/C0DrKzFDxn4gY4U
我手动执行了两次操作,我的结果应该是这样的。 也许有更好或更简单的方法,但我认为数组可以完美地适应这项工作。
提前致谢!
【问题讨论】:
-
从您的代码和描述中,我不太了解您要做什么。但是将范围写入 VBA 数组的常用方法是:
Dim arr as Variant: arr = myRange--> 二维数组。请参阅 Chip Pearsons 网页上的 [VBA 中的数组和范围](VBA 数组和工作表范围)。并发布带注释的屏幕截图以准确显示您正在尝试做的事情会有所帮助。 -
如果要转移到数组的范围是不连续的,那么您可能会执行类似
Redim arr(1 to .Areas.Count): For each W in .Areas: I = I+1: arr(I) = W.Value2` -
@RonRosenfeld 我上传了带有信息的文件(对其进行了注释),我还手动执行了两次最终结果,因此您可以了解一下。如果我需要提供其他任何东西,请让我知道并感谢您的调查!
-
您可能引用了错误的对象。您可以通过声明
WS开始,但稍后开始使用无处不在的 Application 对象上的 default 属性。我的意思是在这个声明中:LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column,.Cells来自WS。但是在此声明中:If Cells(4, i).Value = "Detail" Then、Cells来自 Application 对象。您对Range的使用同样令人怀疑。Worksheet.Add中的工作表是什么?通常,工作表没有 Add 方法。 -
要读取数组使用
vals = Range("A2").Resize(100,5).Value类型的语法,并用Range("A2").Resize(100,5).Value=vals写一个反转它。使用Dim vals() as Variant声明数组,并确保大小与ReDim vals(1 to 100, 1 to 5)类似,并使用基于1的索引。