Excel VBA PasteSpecial xlAdd循环

时间:2018-10-31 13:26:36

标签: excel

我需要一些想要使用的PasteSpecial的帮助。     我自己编写了以下代码:

    Sub oefen()

    ' oefen Macro
    Dim f As Long
    Dim d As Long
    d = Sheets("Omreken").Range("N2").Value
    f = Sheets("Omreken").Range("U2").Value

    For f = 1 To f + 1
    Range("O2").Copy
    Range("A" & (2 + ((f - 1) * d)) & ":" & "A" & (1 + (f * d))).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    Next f

       For f = 2 To f - 1
       Range("T2").Copy
    Range("A" & (2 + ((f - 1) * d)) & ":" & "A" & (1 + (f * d))).Select
       Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd, SkipBlanks _
            :=False, Transpose:=False
      Next f
      End Sub

我的代码执行以下操作: 选择一个因循环而适应的特定范围。每次循环执行时,都会将T2的值添加到执行xlAdd之前粘贴的O2的原始值。该代码对我来说几乎是完美的,除了我想在每次循环执行时向T2添加+1。

因此,假设我的A1为1,A2为1,A3为1,A4为1。 xlAdd; T2是1 如果我要遍历循环,我希望代码执行以下操作:

loop 1: A1 + T2*1 is 2
Loop 2: A2 + T2*2 is 3
Loop 3: A3 + T2*3 is 4
Loop 4: A4 + T2*4 is 5

对我的英语感到抱歉,希望您理解我想说的话。

2 个答案:

答案 0 :(得分:0)

您无需粘贴值即可添加它。您可以通过这种方式简单地计算和设置值

Range("A" & (2 + ((f - 1) * d)) & ":" & "A" & (1 + (f * d))).value = Range("A" & (2 + ((f - 1) * d)) & ":" & "A" & (1 + (f * d))).value+Range("T2").value*(f-1)

如果您使用f循环并从2开始,则需要添加

Range("T2").value*(f-1)

每个值。因此,将第一个值添加 T2 *(2-1)= T2 * 1,第二秒将添加T2 * 2,依此类推

修改: 当您收到诸如类型不匹配之类的错误时,我通常要做的是检查为什么我希望只对数字求和时会发生这种情况。您可以通过在消息框中显示值来做到这一点(还有其他更好的方法,如debug-在点#4下有更多信息here或在链接中也使用断点,但是消息框很简单)。因此,当前,如果该行给您错误,只需将其放在该行的前面即可。

msgbox(Range("A" & (2 + ((f - 1) * d)) & ":" & "A" & (1 + (f * d))).value)
msgbox(Range("T2").value)

请注意,该循环的每次运行都会显示2个弹出窗口,因此请限制您的范围。以这种方式运行它,并在出现类型不匹配错误之前告诉我显示的内容。

编辑2:

Sub oefen()

    ' oefen Macro
    Dim f As Long
    Dim d As Long
    d = Sheets("Omreken").Range("N2").Value
    f = Sheets("Omreken").Range("U2").Value

    For f = 1 To f + 1
        Range("A" & (2 + ((f - 1) * d)) & ":" & "A" & (1 + (f * d))).value=Range("O2").value
    Next f

    For f = 2 To f - 1
         Range("A" & (2 + ((f - 1) * d)) & ":" & "A" & (1 + (f * d))).value =Range("A" & (2 + ((f - 1) * d)) & ":" & "A" & (1 + (f *d))).value+Range("T2").value*(f-1)
    Next f
  End Sub

请注意,我没有更改范围行计算内或for周期内的任何内容。您需要确保这些设置有意义,因为我不知道您在df中具有什么值。

答案 1 :(得分:0)

也许是这样。...我在最后一个循环中添加了一个计数器,它将替换您在T2中的值。

Sub oefen()

    ' oefen Macro
    Dim f As Long
    Dim d As Long
    Static counter As Long
    d = Sheets("Omreken").Range("N2").Value
    f = Sheets("Omreken").Range("U2").Value
    counter = 1


    For f = 1 To f + 1
        Range("O2").Copy
        Range("A" & (2 + ((f - 1) * d)) & ":" & "A" & (1 + (f * d))).Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                               :=False, Transpose:=False
    Next f

    For f = 2 To f - 0
        Dim T2 As Long
        If Not f = 2 Then
            T2 = Cells(2, 20).Value
            T2 = T2 + counter
            Cells(2, 20).Value = T2
            Range("T2").Copy
            Range("A" & (2 + ((f - 1) * d)) & ":" & "A" & (1 + (f * d))).Offset(-d, 0).Select
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd, SkipBlanks _
                                   :=False, Transpose:=False
        Else                                     'Skip counter for the first loop
            Range("T2").Copy
            Range("A" & (2 + ((f - 1) * d)) & ":" & "A" & (1 + (f * d))).Offset(-d, 0).Select
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd, SkipBlanks _
                                   :=False, Transpose:=False
        End If
    Next f
End Sub