调整存储在VBA阵列中的值

时间:2018-08-28 20:30:54

标签: arrays excel vba excel-vba

我试图将A列写入数组,并在传递到数组中或将数组写入工作表时,我想将每个存储的值乘以设置的数字(特别是.01)。我将把数组写回到设置数组的同一列上。

例如 宏之前的表格:

Col A     Col B     Col C
Header    Header    Header
100
50
50
40
100

宏后面的页面:

Col A     Col B     Col C
Header    Header    Header
1
.5
.5
.4
1

到目前为止,我已经在网上看到的教程中处理了代码的基本数组部分:

Sub ArrayTest
Dim Arr() As Variant
Arr = Range("A1:A6")
Dim R As Long
Dim C As Long
  For R = 1 To UBound(Arr, 1) ' First array dimension is rows.
  For C = 1 To UBound(Arr, 2) ' Second array dimension is columns.
   Debug.Print Arr(R, C)
Next C
Next R

'resize range array will be written to
Dim Destination As Range
  Set Destination = Range("K1")
Destination.Resize(UBound(Arr, 1), UBound(Arr, 2)).Value = Arr

'transpose / write array to range
Set Destination = Range("A1")
Destination.Resize(UBound(Arr, 2), UBound(Arr, 1)).Value = Application.Transpose(Arr)

结束子

此代码没有错误,但是我不确定在哪里/如何“操纵”值(在进入数组或返回表的途中)。

一个数组甚至可能不是实现覆盖自身乘以另一个数字的列值的总体目标的最佳方法。我知道我可以将列写到虚拟工作表中,然后进行计算,然后再移回原始工作表和列中,但是我试图找到一种更清洁,并且可能比这更快的东西。这也是一个简化的示例,我的实际数据集更大而且更易变,但是为了便于讨论,我创建了这个示例。

任何建议都非常感谢!

4 个答案:

答案 0 :(得分:3)

您可以这样做,但是更容易使用pastespecial(乘或除)。

Sub x()

Dim v As Variant, i As Long

v = Range("A2:A6").Value

For i = LBound(v) To UBound(v)
    v(i, 1) = v(i, 1) * 0.01
    Debug.Print v(i, 1)
Next i

Range("A2:A6").Value = v

End Sub

答案 1 :(得分:3)

这是一种“无循环”方法:

Sub Tester()

    Dim arr, rngSrc As Range, sht As Worksheet

    Set sht = ActiveSheet

    Set rngSrc = sht.Range("A2:A6")

    arr = rngSrc.Parent.Evaluate(rngSrc.Address() & " * 10") '<< returns an array

    sht.Range("B2").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr

End Sub

针对您的具体情况:

With Range("A2:A6")
    .Value = .Parent.Evaluate(.Address & " * 0.01")
End With

答案 2 :(得分:1)

我正在看Tim的文章,正在做这个工作……相似地使用了validate,但是不需要额外的数组或循环:

Dim rng As Range, lr As Long
lr = Cells(Rows.Count, 1).End(xlUp).Row
Set rng = Range(Cells(1, 1), Cells(lr, 1))
rng = Evaluate(rng.Address & "*0.01")

答案 3 :(得分:1)

也许您应该先收集这些值并处理内存中的调整。

dim i as long, arr as variant

with worksheets("sheet1")

    arr = .range(.cells(2, "A"), .cells(.rows.count, "A").end(xlup)).value2

    for i=lbound(arr, 1) to ubound(arr, 1)
        arr(i, 1) = arr(i, 1)/100
    next i

    for i=lbound(arr, 1) to ubound(arr, 1)
        debug.print arr(i, 1)
    next i

    .cells(1, "K").resize(ubound(arr, 1), ubound(arr, 2)) = arr
    .cells(1, "L").resize(ubound(arr, 2), ubound(arr, 1)) = application.transpose(arr)

end with