У меня есть файл Excel, созданный другой компанией (так что я не могу заглянуть под капот, так сказать), который извлекает данные с сервера. Я могу выбрать диапазон дат, а затем нажать кнопку, чтобы сгенерировать множество отчетов. Я работаю над файлом Excel для автоматизации выбора диапазона дат и последующего выполнения отчета. Затем скопируйте и вставьте информацию. Повторяется месяц за месяцем в течение 10 лет. У меня работает макрос, но мерцание экрана, вызванное моим методом, вызывает у меня недомогание.
Единственный способ заставить это работать - активировать лист с помощью объекта кнопки (не кнопки ActiveX). Это код, который я использую, где wb_dat - это рабочая книга с отчетом данных, ws_dat0 - это рабочий лист с кнопкой. В любом случае это кажется плохим методом.
'Run the report
Application.ScreenUpdating = True
wb_dat.Activate
ws_dat0.Activate
Application.Run ActiveSheet.Shapes("Button 1").OnAction
Application.ScreenUpdating = False
Что не работает, но я чувствую, что должно быть следующее кнопка активирована, запускается макрос отчета, сейчас все хорошо. После создания отчета я использую range.copy
, а затем range.pastespecial xlpastevalues
. Мне кажется, что именно здесь и происходит мерцание, и я не могу думать о том, как его предотвратить. Если я смогу запустить отчет без активации книги, я думаю, это предотвратит мерцание, потому что тестирование макроса без создания нового отчета работает нормально.
Дополнительная запрошенная информация (за исключением массивов и значений для копирования / вставки ):
'wb_imp is workbook to have information copied to
Dim wb_imp As Workbook
'wb_dat is workbook to have information generated
Dim wb_dat As Workbook
Set wb_imp = Workbooks("Extract_From_Month_End_Report.xlsm")
Set wb_dat = Workbooks("Month_End_Report.xlsb")
'ws_impi is newly created worksheet for each loop (hence the i)
Dim ws_impi As Worksheet
'ws_imp0 is worksheet with list of date ranges to pull from
Dim ws_imp0 As Worksheet
Set ws_imp0 = wb_imp.Worksheets("Index")
'ws_dat0 is worksheet with date range selection and button to run report
Dim ws_dat0 As Worksheet
Set ws_dat0 = wb_dat.Worksheets("DateSelection")
For i = 2 To 127
'Sets date range to row i in index
ws_dat0.Range("E11").FormulaR1C1 = ws_imp0.Cells(i, 1).Value
ws_dat0.Range("K11").FormulaR1C1 = ws_imp0.Cells(i, 2).Value
'Run the report
Application.ScreenUpdating = True
wb_dat.Activate
ws_dat0.Activate
Application.Run ActiveSheet.Shapes("Button 1").OnAction
Application.ScreenUpdating = False
'Create new worksheet with date for name
Set ws_impi = wb_imp.Worksheets.Add(After:=wb_imp.Worksheets(wb_imp.Worksheets.Count))
d = ws_imp0.Cells(i, 1).Value
s = CStr(Format(d, "mmm_yyyy"))
ws_impi.Name = s
'More loops here to run through array
c = 1
For j = 0 To ArrayL(dat_a) - 1
ws_impi.Cells(1, c) = dat_a(j).Name
For k = 0 To ArrayL(dat_n(j)) - 1
ws_impi.Cells(2, c) = dat_n(j)(k)
dat_a(j).Range(dat_a(j).Cells(dat_l(j), dat_c(j)(k)), dat_a(j).Cells(dat_u(j), dat_c(j)(k))).Copy
ws_impi.Range(ws_impi.Cells(3, c), ws_impi.Cells(3 + dat_u(j) - dat_l(j), c)).PasteSpecial (xlPasteValues)
c = c + 1
Next k
c = c + 1
Next j
Next i