Почему мой VBA PasteSpecial, Operation: = xlAdd удваивает значения ячеек? - PullRequest
2 голосов
/ 28 марта 2019

Я выполняю очень простой макрос, который берет значение из одной и той же ячейки в каждом расписании и добавляет значения с помощью специальной вставки в сводную таблицу.

Ошибки не появляются, но конечное значение в два раза больше, чем должно быть. Я неправильно понял, как работает xladd, или мой код работает дважды?

For Each ws In ThisWorkbook.Worksheets
  If ws.Name <> "Summary" Then
        ws.Range("D13:E14").Copy     
        ThisWorkbook.Sheets("SUMMARY").Range("D13:D14").PasteSpecial 
        Paste:=xlAll, Operation:=xlAdd, SkipBlanks:=True, Transpose:=False
  End If
Next

В качестве примера я ожидаю, что выходной сигнал из 6 листов с ячейкой D13 = 1 составит 6 часов. На самом деле я получаю 12 часов.

Ответы [ 3 ]

1 голос
/ 28 марта 2019

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

Проверьте вашу книгу на предмет:

  • скрытых листов
  • очень скрытые листы (в VBE)

Мой тестовый код выглядит так:

Sub test()
Dim ws As Worksheet

ThisWorkbook.Sheets("SUMMARY").Range("D13:D14").Clear

For Each ws In ThisWorkbook.Worksheets
  If ws.Name <> "Summary" Then
        ws.Range("D13:E14").Copy
        ThisWorkbook.Sheets("SUMMARY").Range("D13:D14").PasteSpecial _
            Paste:=xlAll, Operation:=xlAdd, SkipBlanks:=True, Transpose:=False
  End If
Next

End Sub
0 голосов
/ 28 марта 2019

Ваш код дает правильные результаты, если РЕЗЮМЕ - первая вкладка в вашей книге.Если SUMMARY указан после первой вкладки, тогда что-либо из SUMMARY будет добавлено к себе, потому что If ws.Name <> "Summary" возвращает TRUE - String s "SUMMARY" и "Summary" не совпадают, поэтому ваш оператор IF работает на Worksheets("SUMMARY")поскольку он проходит по листам.

Кроме того, если вы запускаете свой код без включения команды для очистки Sheets("SUMMARY").Range("D13:E14") перед добавлением к нему каких-либо значений, он будет добавлять значения на каждой итерации.

Ссылки в коде на `Sheets (" Summary ") работают, потому что имена Sheet и Range в VBA не чувствительны к регистру.

Sub AddToSUMMARY()
Dim ws As Worksheet

    ThisWorkbook.Sheets("Summary").Range("D13:E14").Clear
    For Each ws In ThisWorkbook.Worksheets
      If ws.Name <> "SUMMARY" Then
            ws.Range("D13:E14").Copy
            ThisWorkbook.Sheets("SUMMARY").Range("D13:D14").PasteSpecial _
            Paste:=xlAll, Operation:=xlAdd, SkipBlanks:=True, Transpose:=False
      End If
    Next
End Sub
0 голосов
/ 28 марта 2019

Вы можете использовать ниже, чтобы проверить, если что-то идет не так.в случае нечисловых значений вы получите ошибку, потому что суммы хранилищ переменных объявлены как двойные.

Option Explicit

Sub test()

    Dim ws As Worksheet
    Dim D13 As Double, D14 As Double, E13 As Double, E14 As Double

    With ThisWorkbook

        For Each ws In .Worksheets
            With ws
                If .Name <> "Summary" Then
                    D13 = D13 + .Range("D13").Value
                    D14 = D14 + .Range("D14").Value
                    E13 = E13 + .Range("E13").Value
                    E14 = E14 + .Range("E14").Value
                End If
            End With
        Next ws

        With .Worksheets("SUMMARY")
            .Range("D13").Value = D13
            .Range("D14").Value = D14
            .Range("E13").Value = E13
            .Range("E14").Value = E14
        End With

    End With

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...