正确保存内存中的引用而不是激活

时间:2015-10-31 15:30:25

标签: excel vba excel-vba

如何正确保存对某个单元格的引用,例如

Dim x As WHAT_TYPE_?
x = location_of_cell_in_memory

而不是激活它?

我不想通过激活单元格(.Select.Activate)进行迭代,然后使用偏移量向上或向下移动。这应该在屏幕上没有任何事情的情况下完成,只需在后台检索和分配值,这样用户就无法点击屏幕上的某个地方并破坏脚本。

我是否真的必须自己定义一些Pair-Datatype(x,y)并将其用作Cell-representation?

作为三联(表,x,y)?

我甚至不确定在VBA中是否可以实现,我来自Java。

1 个答案:

答案 0 :(得分:1)

您不必激活或选择要分配值的单元格。在给定适当的对象(RangeCell等)的情况下,可以直接读取或写入value属性。您可以初始化Range变量,并保留稍后要访问的单元格地址。

如上所述,如果您只想在迭代的单元格上分配值,则无需真正分配动态范围引用并使用偏移量。一个简单的循环就行了。请参阅以下代码和示例。

Sub IterateExample()

    'Initialize variables.
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim x As Integer, y As Integer, i As Integer, j As Integer

    ' Assign to object.
    Set wb = ThisWorkbook
    Set ws = wb.Sheets("Sheet1")

    ' Assign values.
    x = 10
    y = 10

    Application.ScreenUpdating = False 'Hide updates from viewer/user.

    ' Simple iteration.
    For i = 1 To x
        For j = 1 To y
            'i is row index, j is column index.
            ws.Cells(i, j).Value = i * j 'Use .Value directly, no need to .Select or .Activate
        Next
    Next

    Application.ScreenUpdating = True 'Return to original setting.

End Sub

结果很简单:

enter image description here

但是,如果你真的必须有一个更新的范围引用,循环也可以解决这个问题,只需在循环中重新分配对象。

Sub OffsetExample()

    'Initialize variables.
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim r As Range, i As Integer

    'Assign to object.
    Set wb = ThisWorkbook
    Set ws = wb.Sheets("Sheet1")

    'Assign range.
    Set r = ws.Range("A1")

    Application.ScreenUpdating = False 'Hide updates from viewer/user.

    'Iteration of offset.
    For i = 1 To 10
        r.Value = i * i
        Set r = r.Offset(1, 1) 'Move range reference 1 row down, 1 column right
    Next

    Application.ScreenUpdating = True 'Return to original setting.

End Sub

结果如下:

enter image description here