excel VBA 用数组值填充 listobject 取决于数组的数据类型 variant/string
excel VBA populate listobject with array values depends on datatype of array variant/string
我必须在 Excel 的 Listobjects 中操作数据,而不是用循环填充列我试图一次性将数组的值粘贴到 listobject 位置以加快速度(访问列表对象和单元格一个一个更新非常慢)。
几周前我在 SO 中发布了这个问题:
尽管如此,我正在观察以下内容:
'variables
Dim mylistObject As ListObject
Set mylistObject = ThisWorkbook.Sheets("training").ListObjects(1)
Dim i As Integer
' the two arrays to be pasted are defined differently
Dim theArray() As Variant
theArray = mylistObject.ListColumns(1).DataBodyRange.value
' where column 1 is populated with numbers.
Dim otherArray() As String
otherArray = Split("1,2,3,4,5,6,7,8,9", ",")
'lets paste both arrays with insertion point a particular cell (item 5)
' a) if the two ranges are the same size, i.e. one column copied I can do:
mylistObject.ListColumns(2).DataBodyRange.value = theArray
' b) lets paste the two arrays in from item 5 on using resize (note ubound of thearray is 9, i.e. base 1)
mylistObject.ListColumns(3).DataBodyRange.item(5).Resize(UBound(theArray), 1).value = theArray
' c) lets paste the otherarray in column 4 (note ubound of thearray is 8, i.e. base 0)
mylistObject.ListColumns(4).DataBodyRange.item(5).Resize(UBound(otherArray) + 1, 1).value = otherArray
'the classical but slow way to paste value by value is:
For i = LBound(otherArray) To UBound(otherArray)
mylistObject.ListColumns(5).DataBodyRange.item(4 + i).value = otherArray(i)
Next i
我得到这个结果(见图),这真的很奇怪。当数组是字符串类型时,为什么粘贴第二个数组(otherarray)不起作用。
如果您想知道为什么我只是不将 otherarray 更改为 variant 是因为那样我就无法使用 split() 方法生成 otherarray。
当数组是一维数组时,它应该是水平的。
这就是为什么我只在所有单元格中粘贴了第一个值。
为了在一列中正确粘贴一维数组,需要将其转置为
mylistObject.ListColumns(4).DataBodyRange.item(5).Resize(UBound(otherArray) + 1, 1).value =application.transpose(other_array)
其中 other_array 是一个维度,我们要用它来垂直填充项目 5 的第 4 列。
我必须在 Excel 的 Listobjects 中操作数据,而不是用循环填充列我试图一次性将数组的值粘贴到 listobject 位置以加快速度(访问列表对象和单元格一个一个更新非常慢)。
几周前我在 SO 中发布了这个问题:
尽管如此,我正在观察以下内容:
'variables
Dim mylistObject As ListObject
Set mylistObject = ThisWorkbook.Sheets("training").ListObjects(1)
Dim i As Integer
' the two arrays to be pasted are defined differently
Dim theArray() As Variant
theArray = mylistObject.ListColumns(1).DataBodyRange.value
' where column 1 is populated with numbers.
Dim otherArray() As String
otherArray = Split("1,2,3,4,5,6,7,8,9", ",")
'lets paste both arrays with insertion point a particular cell (item 5)
' a) if the two ranges are the same size, i.e. one column copied I can do:
mylistObject.ListColumns(2).DataBodyRange.value = theArray
' b) lets paste the two arrays in from item 5 on using resize (note ubound of thearray is 9, i.e. base 1)
mylistObject.ListColumns(3).DataBodyRange.item(5).Resize(UBound(theArray), 1).value = theArray
' c) lets paste the otherarray in column 4 (note ubound of thearray is 8, i.e. base 0)
mylistObject.ListColumns(4).DataBodyRange.item(5).Resize(UBound(otherArray) + 1, 1).value = otherArray
'the classical but slow way to paste value by value is:
For i = LBound(otherArray) To UBound(otherArray)
mylistObject.ListColumns(5).DataBodyRange.item(4 + i).value = otherArray(i)
Next i
我得到这个结果(见图),这真的很奇怪。当数组是字符串类型时,为什么粘贴第二个数组(otherarray)不起作用。
如果您想知道为什么我只是不将 otherarray 更改为 variant 是因为那样我就无法使用 split() 方法生成 otherarray。
当数组是一维数组时,它应该是水平的。 这就是为什么我只在所有单元格中粘贴了第一个值。
为了在一列中正确粘贴一维数组,需要将其转置为
mylistObject.ListColumns(4).DataBodyRange.item(5).Resize(UBound(otherArray) + 1, 1).value =application.transpose(other_array)
其中 other_array 是一个维度,我们要用它来垂直填充项目 5 的第 4 列。