Копирование пасты VBA выполняется по-другому в режиме отладки - PullRequest
0 голосов
/ 17 мая 2019

У меня есть таблица в Excel с тремя сводными диаграммами.Я написал код VBA, который выполняет следующие действия:

' Copies sheets 1-4
ThisWorkbook.Worksheets(Array("1", "2", "3", "4")).Copy

'Transforms each new sheet data in values only.
For Each iSheet In ActiveWorkbook.Sheets
    iSheet.Activate
    iSheet.UsedRange.Copy
    iSheet.UsedRange.PasteSpecial xlPasteValuesAndNumberFormats
    iSheet.Range("A1").Select
Next iSheet

' After pasting, deletes the contents of the cells but keeps the graphs
' in spread sheet 4
ActiveWorkbook.Sheets("4").Columns("J:AB").Clear

Этот код работает в режиме отладки (F8) иначе, чем когда он запускается нажатием клавиши F5 или нажатием кнопки в Excel.В режиме отладки он сохраняет всю информацию о рядах в сводных диаграммах, когда сводные таблицы вставляются как значения.Когда он работает без остановок, он теряет информацию сводных диаграмм, так что, например, имена серий меняются на значения по умолчанию «Series 1», значения x переходят от определенных значений даты к jan-00, формат меток оси x меняется на текст и т. Д.. Я не имею понятия почему.В другом очень похожем вопросе кто-то указал, что PasteSpecial ведет себя по-разному, когда целевой лист не активирован, поэтому я добавил iSheet.Activate.Эта разница в действии также может быть результатом использования метода Очистка сводных таблиц.

Я пытался добавить активировать в разных шагах в коде, но безрезультатно.

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Похоже, вам все равно, если вы действительно сохраняете значения сводной таблицы. В примере, который я только что выполнил, у меня есть сводная таблица в G2: L19. Я выполнил эту строку кода, которая удалила столбцы, содержащие сводную таблицу, и сводная диаграмма осталась, отображая те же данные, но теперь данные были жестко запрограммированы в диаграмме.

ActiveSheet.Range("G:L").Delete

Если вы хотите сохранить значения и числовые форматы, но не саму сводную таблицу, этот код, работающий в режиме F5 или F8, сохраняет данные там, где была сводная таблица, и сохраняет данные в диаграмме. -кодированный (не связанный с сводной таблицей).

Sub UnpivotTable()
  With ActiveSheet.Range("G2:L19")
    .Copy
    .PasteSpecial xlPasteValuesAndNumberFormats
  End With
End Sub

Хотите сохранить ссылки с графика на данные? Сохраните формулы ряда, отмените сводную таблицу и повторно примените формулы ряда:

Sub UnpivotTableKeepChartLinks()
  Dim MyChart As Chart
  Set MyChart = ActiveSheet.ChartObjects("Chart 1").Chart
  Dim vSrsFmlas As Variant
  ReDim vSrsFmlas(1 To MyChart.SeriesCollection.Count)
  Dim iSrs As Long
  For iSrs = 1 To MyChart.SeriesCollection.Count
    vSrsFmlas(iSrs) = MyChart.SeriesCollection(iSrs).Formula
  Next
  With ActiveSheet.Range("G2:L19")
    .Copy
    .PasteSpecial xlPasteValuesAndNumberFormats
  End With
  For iSrs = 1 To MyChart.SeriesCollection.Count
    MyChart.SeriesCollection(iSrs).Formula = vSrsFmlas(iSrs)
  Next
End Sub
0 голосов
/ 17 мая 2019

Я предполагаю, что вы хотите оставить только значения на каждом листе в активной книге, так что вот оно:

' Copies sheets 1-4
ThisWorkbook.Worksheets(Array("1", "2", "3", "4")).Copy

'Transforms each new sheet data in values only.
For Each iSheet In ActiveWorkbook.Sheets
    iSheet.UsedRange.Values = iSheet.UsedRange.Values
Next iSheet

Думал, что первая строка, копирующая листы, не имеет смысла.

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