VBA 遍历行,使用多个工作表

VBA to iterate through rows, working with multiple worksheets

我想要一些关于在 VBA 中创建宏的建议,它将遍历一个工作表中的一组值,复制两个字段的值,将这些值粘贴到另一个工作表中,然后复制和将在这些值中进行的计算的输出粘贴回原始行旁边的原始工作表中。

在(非常精简)示例中,我在一个工作簿中有 2 个工作表

 Worksheet:     Values
 Contains 4 columns. (A,B,C &D).  
 Columns A and B each contain a list of numbers
 Columns C and D are empty, waiting to be populated based on a 
 calculation made from columns A and B (calculation takes place in a seperate worksheet).

 Worksheet:     Formula
 Contains 2 fields to enter data (pasted from VALUES:colums A & B)
 Also contains 2 calculation fields which produce the output.  

然后需要将此输出粘贴回 "VALUES" 空白列中的相应行。

下面的值工作集:

下面的公式工作集:

我在上面 VBA 中解释的过程是这样的:

Sub value_paster()
'
' value_paster Macro
'

'
    Sheets("Values").Select
    Range("A2:B2").Select
    Selection.Copy
    Sheets("Formula").Select
    Range("A2").Select
    ActiveSheet.Paste
    Range("C2:D2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Values").Select
    Range("C2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub

我的下一个工作是将上面的代码包装成一些有用的东西,它将重复在 "Forumla" 工作表中进行的相同过程,同时在 "Values" 工作表中逐行向下工作。

我找到了很多关于如何 loop/iterate 遍历行的例子,但没有太多关于如何在工作表之间跳转和 copying/pasting 从一个到另一个等时如何做到这一点的例子。

注意:对工作表中的数据进行的实际计算比较复杂,无法合并到代码中。

非常感谢任何建议。

编辑: 澄清一下,我不需要在 Formulas 工作表中创建任何额外的行 - 此工作表仅用于对粘贴的数据执行计算来自 Values。然后需要将 Formulas 中生成的输出粘贴回 2 个输出列中的 Values 工作表 - 这是需要循环遍历行的地方。

编辑 2:我创建了一个 gif 演示我想使用 VBA

复制的手动过程

请注意,这不是我将使用的实际工作簿,它只是针对此问题的快速演示)

我相信下面的代码将满足您的需要,假设您只需要单元格的值并完全假设您提供的模式。

请注意,我还在迭代 Formula 工作表中的行。如果计算公式仅在 Formula 工作表的 C1D1 单元格中,则必须更改代码。

Sub value_paster()

    Dim wsValues: Set wsValues = ThisWorkbook.Worksheets("Values")
    Dim wsFormula: Set wsFormula = ThisWorkbook.Worksheets("Formula")

    Dim iRow: iRow = 1
    Do While wsValues.Cells(iRow, 1).Value <> ""
        Dim lngA: lngA = wsValues.Cells(iRow, 1).Value
        Dim lngB: lngB = wsValues.Cells(iRow, 2).Value

        wsFormula.Cells(iRow, 1).Value = lngA
        wsFormula.Cells(iRow, 2).Value = lngB

        Dim lngC: lngC = wsFormula.Cells(iRow, 3).Value
        Dim lngD: lngD = wsFormula.Cells(iRow, 4).Value

        wsValues.Cells(iRow, 3).Value = lngC
        wsValues.Cells(iRow, 4).Value = lngD

        iRow = iRow + 1
    Loop

End Sub

编辑: 根据 OP 的最新信息,我正在添加替代解决方案。 可能有更好的方法来做到这一点(我承认我对这个的表现不满意)但我目前无法改进它。 希望这对你有用:

Sub value_paster()

    Application.ScreenUpdating = False   ' To freeze screen while the sub is performed


    Dim wsValues: Set wsValues = ThisWorkbook.Worksheets("Values")
    Dim wsFormula: Set wsFormula = ThisWorkbook.Worksheets("Formula")

    Dim iRow: iRow = 2
    Do While wsValues.Cells(iRow, 1).Value <> ""
        Dim lngA: lngA = wsValues.Cells(iRow, 1).Value
        Dim lngB: lngB = wsValues.Cells(iRow, 2).Value

        wsFormula.Cells(2, 1).Value = lngA  ' You are making simple copy/paste here, so working with Selection can be avoided.
        wsFormula.Cells(2, 2).Value = lngB  ' Same goes here. Simple copy/paste can be done by assigning values, without using Selection

        wsFormula.Activate
        wsFormula.Range("C2:D2").Select
        Application.CutCopyMode = False
        Selection.Copy

        wsValues.Activate
        wsValues.Range(wsValues.Cells(iRow, 3), wsValues.Cells(iRow, 4)).Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

        iRow = iRow + 1
    Loop

    Application.ScreenUpdating = True   ' Reenables screen updating 


End Sub

多亏了 Victor 提供的一些代码,我已经设法创建了 "works" 的东西(每个子都需要独立执行,因为我还没有弄清楚如何将多个子脚本串成一个脚本)。

这是我使用的代码:

Sub value_paster_PT1()
'

'
  Dim wsValues: Set wsValues = ThisWorkbook.Worksheets("Values")
  Dim wsFormula: Set wsFormula = ThisWorkbook.Worksheets("Formula")

    Sheets("Values").Select
    Dim iRow: iRow = 2
    Do While wsValues.Cells(iRow, 1).Value <> ""
        Dim lngA: lngA = wsValues.Cells(iRow, 1).Select
        Selection.Copy
        Sheets("Formula").Select
        Range("A2").Select
        ActiveSheet.Paste
        Range("C2").Select
        Application.CutCopyMode = False
        Selection.Copy

        Sheets("Values").Select
        wsValues.Cells(iRow, 3).Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

        iRow = iRow + 1
    Loop

End Sub

Sub value_paster_PT2()

  Dim wsValues: Set wsValues = ThisWorkbook.Worksheets("Values")
  Dim wsFormula: Set wsFormula = ThisWorkbook.Worksheets("Formula")

    Sheets("Values").Select
    Dim iRow: iRow = 2
    Do While wsValues.Cells(iRow, 2).Value <> ""
        Dim lngB: lngB = wsValues.Cells(iRow, 2).Select
        Selection.Copy
        Sheets("Formula").Select
        Range("B2").Select
        ActiveSheet.Paste
        Range("D2").Select
        Application.CutCopyMode = False
        Selection.Copy

        Sheets("Values").Select
        wsValues.Cells(iRow, 4).Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

        iRow = iRow + 1
    Loop


End Sub

这是它的作用: