首页 > 解决方案 > 更改单元格范围以覆盖列中的所有数据

问题描述

我在我的 excel 表中创建了一个宏

宏的目的是将一列中的单元格一一(L1,L2 ...)复制到特定单元格(A1)中。然后在计算完成后,将另一个单元格 E2 中的值复制到 L 旁边的列,意思是 M1,M2...

我不知道如何将这些步骤循环到列中的所有单元格。

Sub Checking_Frequences()
'
' Checking_Frequences Macro
'

'
    Range("L1").Select
    Selection.Copy
    Range("A1").Select
    ActiveSheet.Paste
    Range("E2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("M1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("L2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("A1").Select
    ActiveSheet.Paste
    Range("E2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("M2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub

有没有办法添加延迟,以便 excel 在从 E2 复制结果之前完成计算?

有什么建议吗?

问候

标签: excelvba

解决方案


你的工作簿可以做一点组织升级。我可能没有按照你最喜欢的方式完成它,但我认为下面的代码会让你向前迈出一大步。将其安装在标准代码模块中并仅运行过程WriteArrays。花时间首先了解它是如何工作的。

Sub WriteArrays()
    ' 043

    ' number of results wanted from each Base
    Const Iterations As Integer = 5     ' adjust to suit
    Const TgtTab As String = "Sheet3"   ' Output tab (change to suit)
    Const TgtRow As Long = 2            ' modify to suit
    Const TgtClm As Long = 4            ' first output column (modify to suit)

    Dim Src         As Variant          ' array of source Base numbers
    Dim R           As Long             ' SrcRng row counter
    Dim WsTgt       As Worksheet        ' Target worksheet (for output)
    Dim Arr         As Variant          ' value to write to sheet
    Dim Operand     As Double           ' calculated by a formula
    Dim i           As Long             ' loop counter

    Operand = 2 ^ (1 / 12)              ' = 1.0594630943593 (adjust to suit)

    With Worksheets("Frequencies")
        ' set the range L1:L(last used row) - modify to suit
        ' read all values into an array
        Src = .Range(.Cells(1, "L"), .Cells(.Rows.Count, "L").End(xlUp)).Value
    End With
    Set WsTgt = Worksheets(TgtTab)

    For R = LBound(Src) To UBound(Src)
        Arr = BaseArray(Src(R, 1), Operand, Iterations)
        With WsTgt.Cells(TgtRow, TgtClm - 1 + R).Resize(UBound(Arr))
            .Value = Application.Transpose(Arr)
            .NumberFormat = "0.00"
        End With
'        If R = 5 Then Exit For
    Next R
End Sub

Private Function BaseArray(ByVal Base As Double, _
                           ByVal Operand As Double, _
                           ByVal Iterations As Integer) As Variant
    ' 043

    Dim Fun         As Variant          ' function return value
    Dim i           As Integer

    ReDim Fun(1 To Iterations)
    For i = LBound(Fun) To UBound(Fun)
        Fun(i) = Base
        Base = Round(Base * Operand, 2)
    Next i
    BaseArray = Fun
End Function

您必须设置代码顶部的 4 个常量。最后 3 个处理输出。您要求在同一张纸上的 M 列中输出。但是此代码将添加 235 列。所以我认为最好开始一个新的工作表。您可以使用不同的参数轻松地多次运行代码并将结果输出到不同的工作表上。但它们必须在代码运行之前存在。

Const Iterations指定每列中有多少行。您似乎想要 50。我只测试了 5。修改此常量以满足您的需要。

再往下一点Operand是从您的单元格 C1 中获取的公式。它可以改变。

当然,Frequencies选项卡必须存在,并且 L 列中必须有数字。您可以从第 2 行而不是第 1 行开始。但是如果您想限制输出,您可能想利用我使用的方法,在这里If R = 5 Then Exit For:(在 Next ../.. For 循环的末尾)。如果您通过删除前导撇号来启用该行,它只会在列表中的 5 个数字之后减少循环。

我祝你事业成功:-)


推荐阅读