Как исправить ошибку «Требуется объект Excel 2016», которая работала в Excel 2010 - PullRequest
0 голосов
/ 31 января 2019

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

Я полагаю, что это происходит из-за способа объявления переменных (или, по-видимому, не в этомдело).Функция принимает диапазон, который перекрывает график.Затем он экспортирует диаграмму как изображение в формате .png.Еще одна вещь, которую я не понимаю, почему она отлично работает в Excel 2010, но не в 2016 году?

Ошибка 424 - Требуется объект:

Error 424 - Object Required

Строка с ошибкой :

 With .Pictures(1)

Код:

Sub createPNG(sheetName As String, rangeName As String, fileName As String)

  Dim vFilePath As Variant
  Dim rSelection As Range
  Dim sDefaultName As String

  Sheets(sheetName).Range(rangeName).Select

  Set rSelection = Selection

  vFilePath = "Z:\marginsOutput\Charts\" & fileName & ".png"
  '-- copy selected range as picture (not as bitmap)
  rSelection.CopyPicture Appearance:=xlScreen, Format:=xlPicture

  '--Create an empty chart, slightly larger than exact size of range copied
  With Sheets(sheetName).ChartObjects.Add( _
      Left:=rSelection.Left, Top:=rSelection.Top, _
      Width:=rSelection.Width + 2, Height:=rSelection.Height + 2)

  With .Chart
  ' clean up chart
  .ChartArea.Format.Line.Visible = msoFalse

  ' paste and position picture
  .Paste
  With .Pictures(1)
    .Left = .Left + 2
    .Top = .Top + 2
  End With

  ' export
  .Export CStr(vFilePath)
End With

' remove no-longer-needed chart
.Delete
  End With

End Sub

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Это работает, если вы просто выбираете ChartObject перед вставкой изображения в Chart.
Это один из редко случаев, где помогает .Select - иначе смотрите Как избежать использования Select в Excel VBA

With Sheets(sheetName).ChartObjects.Add( _
    Left:=rSelection.Left, Top:=rSelection.Top, _
    Width:=rSelection.Width + 2, Height:=rSelection.Height + 2)
    .Select
    With .Chart
        ' ...
    End With
End With

... и во время отладки это действительно раздражает:
Если вы запускаете код пошагово через (F8), он работает без ChartObject.Select, но если вы запустите его нормально или через (F5), вы получите ошибку, либо
Изображение (1) = Ошибка 424 (такого объекта нет)
Shapes (1) =Ошибка -2147024809 (номер 1 отсутствует)

0 голосов
/ 14 февраля 2019

Как и Макс, я обнаружил, что многие команды в Excel, которые работают с различными объектами (фигурами, диаграммами, рисунками, рабочими листами, рабочими книгами и т. Д.), Занимают больше времени, чем раньше, и VBA не ожидает их завершения.прежде чем пытаться выполнить следующую команду.Отсюда ошибка, когда он пытается что-то сделать с картинкой, которая еще не вставлена.

Признаком этой проблемы является то, что код выполняется без ошибок при переходе в VB Editor с помощью клавиши F8, ноне работает на полной скорости при работе с клавишей F5.

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

With .chart
  Do Until .Pictures.Count = 1
    DoEvents
    .Paste
  Loop
End With

Альтернативой является размещениеФактически вставьте в отдельную функцию, которую вы бы вызвали из этой части кода, и передайте вставляемую картинку и диаграмму, которая ее получает.Барьер между различными элементами в стеке вызовов, похоже, побуждает VBA завершить то, что он делает, прежде чем перейти к следующему шагу.

Я должен отметить, что мне приходилось делать это во многих частях моего коммерческого ExcelНадстройка VBA, которая активно работает с диаграммами, и я вставил код, который был добавлен непосредственно из этой надстройки.

0 голосов
/ 31 января 2019

Иногда в VBA я нахожу, что .paste, кажется, не работает с первого раза, особенно если элемент уже находится в буфере обмена!Я добавил несколько строк, чтобы проверить, есть ли изображение, прежде чем пытаться выбрать изображение!если он не найден, он снова попытается вставить пасту.Вы должны добавить к этому некоторый контроль, чтобы он не зацикливался на ошибках вставки!

попробуйте изменить ниже;

Sub createPNG(sheetName As String, rangeName As String, fileName As String)

  Dim vFilePath As Variant
  Dim rSelection As Range
  Dim sDefaultName As String

  Sheets(sheetName).Range(rangeName).Select

  Set rSelection = Selection

  vFilePath = "Z:\marginsOutput\Charts\" & fileName & ".png"

  '-- copy selected range as picture (not as bitmap)
  rSelection.CopyPicture Appearance:=xlScreen, Format:=xlPicture

  '--Create an empty chart, slightly larger than exact size of range copied
  With Sheets(sheetName).chartobjects.Add( _
      Left:=rSelection.Left, Top:=rSelection.Top, _
      Width:=rSelection.Width + 2, Height:=rSelection.Height + 2)

  With .Chart
  ' clean up chart
  .ChartArea.Format.Line.Visible = msoFalse

  ' paste and position picture
  .Paste
  If .Pictures.Count = 0 Then
        .Paste
  End If
  With .Pictures(1)
    .Left = .Left + 2
    .Top = .Top + 2
  End With

  ' export
  .Export CStr(vFilePath)
End With

' remove no-longer-needed chart
.Delete
  End With

End Sub

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