VBA - спарклайн с динамическим диапазоном, не обновляющийся в VBA

У меня вопрос, очень похожий на этот, где у меня есть:

  1. Создан рабочий лист со спарклайном, который ссылается на динамический диапазон
  2. У меня есть макрос, который через цикл обновляет некоторые ячейки (и, следовательно, меняет спарклайн с каждой итерацией цикла)
  3. Копирует большой диапазон (включая спарклайн и другие именованные диапазоны)
  4. Вставляет этот диапазон на второй лист (я не мог понять, как это сделать по-другому, поэтому я использую метод Range.CopyPicture и вставляю диапазон в виде изображения на второй лист, но если есть способ, который вы знаете, вставьте сам спарклайн, чтобы он не обновлялся, когда я снова обновляю ранег, ПОЖАЛУЙСТА, дайте мне знать)

Теперь моя проблема в том, что если я прохожу код в режиме отладки, все работает хорошо, НО если я разрешаю запуск макросу автоматически, спарклайн никогда не обновляется (так что всегда выглядит так, как будто это произошло при первом запуске макроса) .

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

Cells A1-A10: 
      1,2,3...,10 (what I'll use for the sparkline range)

Cell Named "StartCol": 
      =RANDBETWEEN(1,9)

Cell Named "Width":    
      =RANDBETWEEN(1,10-StartCol)

Dynamic range Named "SparkRange":  
      =OFFSET(Sheet1!$A$1,0,StartCol-1,1,Width)

Cell With a SparkLine within a larger range Named "ToCopy"

A Second Sheet Named "OutPut" with a named range "Output" where we'll start pasting to

Теперь упрощенный код VBA:

Sub Test()
    Sheets("Output").Select

    For i = 1 To 10
        Application.Calculate   ' Probably not needed, but putting it in to be safe
        Sheets("Sheet1").Range("ToCopy").CopyPicture

        Sheets("Output").Range("Output").Select
        Sheets("Output").Paste
        Sheets("Output").Names("output").RefersTo = Sheets("Output").Range("Output").Offset(Sheets("Sheet1").Range("ToCopy").Rows.Count + 2)
    Next i
End Sub

Теперь это ДОЛЖНО вставить 10 разных спарклайнов, а лучше 10 копий одного и того же. И если я прохожу через него в режиме отладки (или даже устанавливаю точку останова, а затем нажимаю F5 в VBA, тогда он работает!) Я снова посмотрел на упомянутый выше вопрос и попробовал его трюки, но безрезультатно ... Кто-нибудь знает как заставить это работать для спарклайнов ????

Спасибо!!!


person John Bustos    schedule 11.09.2014    source источник
comment
BIRDSVIEW: Если он работает в режиме отладки, попробуйте это. Добавить Doevents, чтобы у него было достаточно времени, чтобы поместить изображение в буфер обмена, а затем вставить его?   -  person Siddharth Rout    schedule 11.09.2014
comment
@SiddharthRout ... Просто попробовал ... Не повезло :( Есть другие идеи ???? - Это больно !!   -  person John Bustos    schedule 11.09.2014
comment
OMG - @SiddharthRout ... Я ПРИНЯЮ ЭТО ВЕРНУТЬСЯ !!!! - Я положил его в другое место И ЭТО РАБОТАЛО   -  person John Bustos    schedule 11.09.2014
comment
Рад, что у вас сработало: D   -  person Siddharth Rout    schedule 11.09.2014
comment
ТЫ МОЙ ГЕРОЙ !!! - Пожалуйста, опубликуйте это как решение, чтобы я мог отдать вам должное! - Я не могу передать, сколько неприятностей вы мне сохранили !!!   -  person John Bustos    schedule 11.09.2014


Ответы (1)


Если вы постоянно выполняете повторяющееся упражнение, в котором используется excel / system для обработки нескольких событий, рекомендуется разделять их с помощью DoEvents.

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

Например

Sheets("Sheet1").Range("ToCopy").CopyPicture

Doevents '<~~ This gives enough time for the pic to be placed in Clipboard

Sheets("Output").Paste

DoEvents '<~~ This gives enough time for the pic to be pasted

Говоря техническим языком, DoEvents отказывается от выполнения макроса, чтобы операционная система могла обрабатывать другие события. Функция DoEvents передает управление от приложения операционной системе.

ВНИМАНИЕ: разумное использование DoEvents предпочтительнее, иначе вы в конечном итоге без надобности замедляете свой код.

person Siddharth Rout    schedule 11.09.2014