Excel VBA - 让VBA脚本循环遍历行

时间:2016-07-26 08:03:14

标签: excel vba excel-vba loops

我有一个VBA脚本,可以将数据从一个工作表复制到另一个工作表。复制的数据将放入公式中,并将计算出的数量复制回原始工作表。我试图得到它,以便VBA脚本为每一行执行此操作。我有1000行数据。

Sub Rating()
Dim ws1 As Worksheet, ws2 As Worksheet
Set ws1 = Worksheets("SoapUI - Single")
Set ws2 = Worksheets("STpremcalc")

        ws2.Range("B3").Value = ws1.Range("B3").Value

        ws2.Range("B4").Value = ws1.Range("C3").Value

        ws2.Range("B5").Value = ws1.Range("D3").Value

        ws2.Range("B6").Value = ws1.Range("E3").Value

        ws2.Range("E3").Value = ws1.Range("F3").Value

        ws2.Range("E4").Value = ws1.Range("G3").Value

        ws2.Range("E5").Value = ws1.Range("H3").Value

        ws2.Range("E6").Value = ws1.Range("I3").Value

        ws2.Range("G3").Value = ws1.Range("J3").Value

        ws2.Range("G4").Value = ws1.Range("K3").Value

        ws2.Range("G5").Value = ws1.Range("L3").Value

        ws2.Range("J3").Value = ws1.Range("N3").Value

        ws2.Range("J4").Value = ws1.Range("O3").Value

        ws2.Range("J6").Value = ws1.Range("P3").Value

        ws2.Range("B9").Value = ws1.Range("Q3").Value

        ws2.Range("C9").Value = ws1.Range("R3").Value

        ws2.Range("D9").Value = ws1.Range("S3").Value

        ws2.Range("E9").Value = ws1.Range("T3").Value

        ws2.Range("B10").Value = ws1.Range("U3").Value

        ws2.Range("C10").Value = ws1.Range("V3").Value

        ws2.Range("D10").Value = ws1.Range("W3").Value

        ws2.Range("E10").Value = ws1.Range("X3").Value

        ws2.Range("B11").Value = ws1.Range("Y3").Value

        ws2.Range("C11").Value = ws1.Range("Z3").Value

        ws2.Range("D11").Value = ws1.Range("AA3").Value

        ws2.Range("E11").Value = ws1.Range("AB3").Value

        ws1.Range("AW3").Value = ws2.Range("M4").Value

        ws1.Range("AX3").Value = ws2.Range("M5").Value

        ws1.Range("AY3").Value = ws2.Range("M6").Value

End Sub

我也理解这可能是执行此任务的一种非常低效的方式,但我不知道如何改进它。因此,如果您有办法提高效率,我们将非常感激。

编辑:根据@ user3598756建议更新代码

2 个答案:

答案 0 :(得分:3)

我不是复制/粘贴程序的粉丝,但是如果你必须使用它,那么以下语句

Sheets("SoapUI - Single").Range("B3").Copy
Sheets("STpremcalc").Range("B3").PasteSpecial Paste:=xlValues

Sheets("SoapUI - Single").Range("C3").Copy
Sheets("STpremcalc").Range("B4").PasteSpecial Paste:=xlValues

Sheets("SoapUI - Single").Range("D3").Copy
Sheets("STpremcalc").Range("B5").PasteSpecial Paste:=xlValues

Sheets("SoapUI - Single").Range("E3").Copy
Sheets("STpremcalc").Range("B6").PasteSpecial Paste:=xlValues

可以简化为

Sheets("SoapUI - Single").Range("B3:E3").Copy
Sheets("STpremcalc").Range("B3").PasteSpecial Paste:=xlValues, Transpose:=True

除此之外,您可以简化

    Sheets("SoapUI - Single").Range("Q3").Copy
    Sheets("STpremcalc").Range("B9").PasteSpecial Paste:=xlValues

    Sheets("SoapUI - Single").Range("R3").Copy
    Sheets("STpremcalc").Range("C9").PasteSpecial Paste:=xlValues

    Sheets("SoapUI - Single").Range("S3").Copy
    Sheets("STpremcalc").Range("D9").PasteSpecial Paste:=xlValues

    Sheets("SoapUI - Single").Range("T3").Copy
    Sheets("STpremcalc").Range("E9").PasteSpecial Paste:=xlValues

    Sheets("SoapUI - Single").Range("Q3:T3").Copy
    Sheets("STpremcalc").Range("B9:E9").PasteSpecial Paste:=xlValues

我认为你可以自己做其余的事。

编辑:由于OP编辑了他的问题。以下内容可以简化

    ws2.Range("B3").Value = ws1.Range("B3").Value

    ws2.Range("B4").Value = ws1.Range("C3").Value

    ws2.Range("B5").Value = ws1.Range("D3").Value

    ws2.Range("B6").Value = ws1.Range("E3").Value

    ws2.Range("E3").Value = ws1.Range("F3").Value

    ws2.Range("E4").Value = ws1.Range("G3").Value

    ws2.Range("E5").Value = ws1.Range("H3").Value

    ws2.Range("E6").Value = ws1.Range("I3").Value

使用像

这样的循环程序
For i = 1 To 4
    ws2.Cells(i + 2, 2) = ws1.Cells(3, i + 1)    'Or you can use `ws1.Cells(3, i + 1).Value2` if you only need the value without its format like date or currency
    ws2.Cells(i + 2, 5) = ws1.Cells(3, i + 5)
Next i

其余的是你的。

答案 1 :(得分:1)

没什么可做的,但那可能很少:

  • 使用变量来引用工作表并提高代码的可读性和效率

    Dim ws1 As Worksheet, ws2 As Worksheet    
    Set ws1 = Worksheets("SoapUI - Single")
    Set ws2 = Worksheets("STpremcalc")
    
  • 使用Range1.Value = Range2.Value模式在范围之间复制/粘贴值'

    ws2.Range("B3").Value = ws1.Range("B3").Value
    ws2.Range("B4").Value = ws1.Range("C4").Value
    ...