Использование кнопки в другой книге для создания отчета, затем копирование данных в книгу - PullRequest
0 голосов
/ 05 августа 2020

У меня есть файл 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...