代码之家  ›  专栏  ›  技术社区  ›  RugsKid

在VBA数组中存储值时进行调整

  •  0
  • RugsKid  · 技术社区  · 7 年前

    我试图将列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 回复  |  直到 7 年前
        1
  •  3
  •   Tim Williams    7 年前

    这里有一个“无循环”的方法:

    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
  •  3
  •   SJR    7 年前

    您可以这样做,但更容易使用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
    
        3
  •  1
  •   Cyril    7 年前

    当我看到蒂姆·波斯特的时候正在做这个。。。与evaluate的用法类似,但不需要额外的数组或循环:

    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")
    
        4
  •  1
  •   user4039065 user4039065    7 年前

    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