Excel vba pastespecial цикл xladd

Мне нужна помощь с 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 к исходному значению O2, которое вставляется перед выполнением xlAdd. Код почти идеально подходит для меня, за исключением того, что я хочу добавлять +1 к T2 каждый раз, когда цикл проходит.

Итак, скажем, у меня A1 равно 1, A2 равно 1, A3 равно 1, A4 равно 1. xlAdd; Т2 равен 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

Прошу прощения за мой английский, надеюсь, вы понимаете, что я пытаюсь сказать.

1
0
290
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам не нужно вставлять значение, чтобы добавить его. Вы можете просто рассчитать и установить значение таким образом

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 и так далее, как вы хотели

Редактировать: когда вы получаете сообщение об ошибке типа несоответствия типа, я обычно проверяю, почему это происходит, когда я собираюсь суммировать только числа. Вы можете сделать это, показывая значения в окне сообщения (есть и другие более удобные способы, такие как отладка - дополнительная информация здесь в пункте № 4 или использование точек останова также в ссылке, но окно сообщения простое). Итак, в настоящее время, если строка выдает ошибку, просто поместите это непосредственно перед этой строкой:

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

Только имейте в виду, что он будет показывать 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

обратите внимание, что я ничего не менял в вычислении строки Range или в циклах for. вам нужно убедиться, что они имеют смысл, поскольку я не знаю, какие значения у вас есть в d и f.

Когда я запускаю макрос, я получаю ошибку 13 во время выполнения: типы не совпадают

Mischa Urlings 31.10.2018 15:22

попробуйте использовать msgbox, чтобы показать вам, что находится в ячейках, которые он пытается добавить. Потому что я не делал ничего, кроме того, что у вас уже есть, поэтому я очень удивлен

Pavel_V 31.10.2018 15:25

Извините, но я не понимаю, что вы пытаетесь сказать. Не могли бы вы адаптировать это изменение к моему коду? Тогда я увижу, что нужно изменить. Я ценю вашу помощь!

Mischa Urlings 31.10.2018 15:30

@Error 1004 Это проблема, с которой я столкнулся

Mischa Urlings 01.11.2018 09:42

Можете ли вы обновить свой вопрос с помощью экрана печати вашего текущего кода и показать, в какой строке выдается ошибка? Поскольку ошибка 1004 должна быть ошибкой при выборе или копировании / вставке, но моя строка кода не выбирает и не копирует / вставляет. Вы уверены, что комбинация переменных f и d не заканчивается диапазоном («A0»)?

Pavel_V 01.11.2018 11:17

Я не имел в виду, что у меня есть код ошибки в моем макросе, но я спросил человека «Ошибка 1004» на этом веб-сайте, может ли он помочь мне с этой новой проблемой. Вот почему я пометил его. Возвращаясь к моему вчерашнему вопросу; не могли бы вы адаптировать это изменение кода, о котором вы говорили?

Mischa Urlings 01.11.2018 11:35

Поскольку вопрос немного сбивает с толку, предоставьте изображения исходного листа и желаемого результата.

Error 1004 01.11.2018 15:50

Просто заметил, что вы не добавляете, а заменяете первую часть, касающуюся O2, поэтому я изменил это в своем коде. Также да, исходный лист и желаемый результат помогут понять, но в любом случае использование select и paste специального xlAdd для добавления значений довольно неэффективный способ сделать это, поэтому независимо от текущей проблемы я бы придерживался использования метода .value .

Pavel_V 01.11.2018 16:33
Ответ принят как подходящий

Может быть, что-то вроде этого .... Я добавляю счетчик в последний цикл и он заменит ваше значение в 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

Решение работает почти идеально, внесены небольшие изменения, и оно работает! Спасибо

Mischa Urlings 02.11.2018 15:06

Другие вопросы по теме