VBA,因为它不支持这样的事情。只有一个范围才可能。
理论上....
你可以做这样的东西用Evaluate
在verly有限的方式。为了展示一些例子改变二维数组只有一个行/列或具体数值,使用有效的IF
语句来允许做很多
Dim MyArray() As Variant
Public Function MyArrayOut() As Variant
MyArrayOut = MyArray
End Function
Sub testing()
'we are using a 5x4 (4 columns/5 rows) array
ReDim MyArray(0 To 4, 0 To 3) As Variant 'also 1 to 5 and 1 to 4 are possible.... doesn't matter
Dim i As Long, j As Long 'input some numbers
For i = 0 To 4
For j = 0 To 3
MyArray(i, j) = i + 5 * j + 1
Next
Next
[A1:D5].Value2 = MyArray
Stop ' check the sheet -> should be 1 to 20
'lets add 11 to the second row
MyArray = Evaluate("=IF({0;1;0;0;0},MyArrayOut()+11,MyArrayOut())")
[A1:D5].Value2 = MyArray
Stop ' check again. row 2 should be 13, 18, 23, 28
'set only 1,1 ; 2,2 ; 4,2 and 5,4 to 0. just keep in mind that using math will fail if ANY value is not numeric (or empty)
MyArray = Evaluate("=MyArrayOut()*{0,1,1,1;1,0,1,1;1,1,1,1;1,0,1,1;1,1,1,0}")
[A1:D5].Value2 = MyArray
Stop 'A1, B2, B4, D5 all should be 0
'set column 3 to "abc"
MyArray = Evaluate("=IF({0,0,1,0},""abc"",MyArrayOut())")
[A1:D5].Value2 = MyArray
Stop ' check again. column C should be just abc
End Sub
,但你需要手动编码,或者一个漂亮的复杂的算法“杀死”和“不循环”的想法一样好。
此外,这将花费更多的资源,并且总是比直接做得慢。你还需要一个额外的函数来将数组放入评估中。
还有一种情况可用于我的眼睛:通过INDEX
提取一行/列。请记住,输出仍然是一个2d阵列,可以通过Application.Transpose
-Trick获得。它可用的原因只是事实,即不需要知道数组的大小。这样你可以直接通过extrVar = Evaluate("=INDEX(MyArrayOut(),2,)")
提取。虽然2可以通过不同的变量设置。这样你就不需要ReDim
这个新变量(在这种情况下为extrVar
)。它只是需要变体。这就是说,与Application.Index
你也可以实现这个没有使用Evaluate
。 (这也使用更少的资源,更快)
我希望你有一个想法,你可以可以使用评估来完成这项工作。
尽管如此,VBA本身并没有提供任何方法来通过语法本身在一个步骤中操作数组的多个内容。 (至少在某种程度上,你可以使用针对这种情况)
编辑
我差点忘了:在一个变量来设置所有值相同的值,像MyArray = Evaluate("=IF(MyArrayOut()="""",5,5)")
将尽设置一切到5或MyArray = Evaluate("=IF(MyArrayOut()="""",""abc"",""abc"")")
只包含“abc”。要清空它,你可以使用MyArray = Evaluate("=IF(MyArrayOut()="""","""","""")")
,但是一个简单的ReDim
没有Preserve
也可以在一行中完成。
EDIT 2
您Range("A1:C3") = MyArray: Range("A1,B2,C1,B3") = 11: MyArray = Range("A1:C3")
例如,你可以使用它作为一个自身的功能就像一个基地:
Public Sub multiSetSame(ByRef arr As Variant, ByVal val As Variant, ParamArray str() As Variant)
Dim runner As Variant
For Each runner In str
arr(Split(runner, ",")(0), Split(runner, ",")(1)) = val
Next
End Sub
Sub test()
Dim MyArray(1 To 3, 1 To 4) As Long
multiSetSame MyArray, 11, "1,1", "2,2", "1,3", "3,2"
[A1:D3].Value2 = MyArray
End Sub
而且对于这个例子,虽然我不知道是怎么回事评估其中要更改的值,它应该是更好的直接更改它,因为它们被评估,或者如果它们总是相同的,只需编写一个子工作的所有值的工作。任何“解决方法”都会减慢整个过程。
如果您还有任何疑问,就问;)
有一种方法,但它不适用于bidimentional数组。你需要他们是双向的吗? –
@EduardoPoço你是说二维数组?是的,我需要它像上面的例子(MyArray) –
嗯,无论如何...我想使用字符串和Split(),它返回一个数组,但这个数组不会是2D。怎么样使用数组数组?而不是使用MyArray(i,j)访问,它将是MyArray(i)(j)。 –