Второй макрос в Excel не запускается

моя проблема нечетна … У меня есть код в Access VBA. Там я хочу запустить два макроса в другом файле Excel. Первый макрос запускается без проблем, но когда dubbger получает второй, мне дается ошибка времени выполнения 1004: «Не удается запустить макрос« prcPrepareFirstReport ». Макрос не будет доступен в этой книге или все макросы будут отключены».

Код доступа:

Private Sub cmdRaport_Click() Dim pPath As String Dim pWorkPath As String Dim pExcel As Object Dim pPathToSave As String Dim pTargetPath As String pPath = fncFilePicker() pWorkPath = DLookup("[F_LINK]", "tblLinks", "[F_ID] = 1") Set pExcel = CreateObject("Excel.Application") pExcel.Workbooks.Open (pWorkPath) pMacro = "prcPrepareFile" pPathToSave = DLookup("[F_LINK]", "tblLinks", "[F_ID] = 2") pExcel.Run pMacro, pPath, pPathToSave 'this macro is going fine pMacro = "prcPrepareFirstReport" pTargetPath = DLookup("[F_LINK]", "tblLinks", "[F_ID] = 5") pExcel.Run pMacro, pTargetPath 'on this macro I'm given error 1004 pExcel.ActiveWorkbook.Close pExcel.Quit Set pExcel = Nothing End Sub 

Код Excel VBA:

 Public pSourceName As String Sub prcPrepareFile(pPath As String, pPathToSave As String) Dim pFileToPrepare As Workbook Dim pSheet As Worksheet Dim pLastRow As Long Dim pName As String Dim i As Long With Application .DisplayAlerts = False .ScreenUpdating = False End With Set pFileToPrepare = Workbooks.Open(pPath) Set pSheet = pFileToPrepare.Worksheets(1) pSheet.Rows("1:3").Select Selection.Delete Shift:=xlUp pSheet.Rows("2:5").Select Selection.Delete Shift:=xlUp pLastRow = pSheet.Cells(pSheet.Rows.Count, "A").End(xlUp).Row For i = 2 To pLastRow If pSheet.Cells(i, 1).Value = "" Then pSheet.Rows(i & ":" & i + 5).Select Selection.Delete Shift:=xlUp End If Next i pName = pFileToPrepare.Name pName = pPathToSave & pName Debug.Print pName pFileToPrepare.SaveAs pName pSourceName = pFileToPrepare.Name With Application .DisplayAlerts = True .ScreenUpdating = True End With End Sub Sub prcPrepareFirstReport(pTargetPath As String) Dim pSourceWorbook As Workbook Dim pTargetWorkbook As Workbook Set pSourceWorbook = Workbooks(pSourceName) Set pTargetWorkbook = Workbooks.Open(pTargetPath) End Sub 

Я пробовал такую ​​версию

 pExcel.Application.Run pMacro 

, но он не работает …

Я попытался запустить только этот второй макрос, и он включен …

Пожалуйста помоги.

Похоже, что ваша переменная pSourceName теряет состояние между двумя вызовами Application.Run в вызывающем коде. Гораздо более надежное решение, чем использование глобальной переменной состояния, – это преобразовать prcPrepareFile в функцию, возвращающую имя pSourceName , а затем передать это prcPrepareFirstReport .

Код Excel:

 Public Function prcPrepareFile(pPath As String, pPathToSave As String) As String 'Snip pName = pFileToPrepare.Name pName = pPathToSave & pName pFileToPrepare.SaveAs pName prcPrepareFile = pFileToPrepare.Name With Application .DisplayAlerts = True .ScreenUpdating = True End With End Function Sub prcPrepareFirstReport(pTargetPath As String, pSourceName As String) Dim pSourceWorbook As Workbook Dim pTargetWorkbook As Workbook Set pSourceWorbook = Workbooks(pSourceName) Set pTargetWorkbook = Workbooks.Open(pTargetPath) End Sub 

Код звонка:

 Dim pSourceName As String pSourceName = pExcel.Run(pMacro, pPath, pPathToSave) pMacro = "prcPrepareFirstReport" pTargetPath = DLookup("[F_LINK]", "tblLinks", "[F_ID] = 5") pExcel.Run pMacro, pTargetPath, pSourceName 

Хорошо, я понял это. Помощь от @Comintern и @Rory была необходима 🙂

Поэтому проблема заключалась в том, что после запуска prcPrepareFile активировался другой Excel, а не с помощью prcPrepareFile . Я не знаю, почему (может быть, кто-то может это объяснить), но после этого переменная pExcel имела в себе этот второй Excel без кода VBA …

Решение состоит в том, чтобы подготовить переменную с именем этого первого Excel, а затем запустить этот второй макрос с именем этого первого Excel. Правильный код ниже:

 Dim pSourceName As String Dim pWorkWorkbookName As String pWorkWorkbookName = pExcel.Names.Parent.Name pSourceName = pExcel.Run(pMacro, pPath, pPathToSave) pMacro = "prcPrepareFirstReport" pTargetPath = DLookup("[F_LINK]", "tblLinks", "[F_ID] = 5") pExcel.Run "'" & pWorkWorkbookName & "'!" & pMacro, pTargetPath, pSourceName 

Спасибо всем за помощь.

  • Excel не распознает доступ к SQL Query Pass-Through в качестве таблицы
  • График доступа с несогласованными значениями x
  • VBA - Вставка в две таблицы, где идентификатор из первой таблицы - это поле во втором
  • Как определить текстовые значения с наименьшими идентификаторами строк по 4 столбцам?
  • Excel VBA, выполняющий запрос Access, может возвращать несколько записей
  • MS Access Формат VBA Формат Excel Столбец в виде валюты
  • SQL Access VBA Excel
  • Как перенести данные, сохраненные как переменные в программе Excel VBA, в базу данных Access
  • Доступ к VBA: как вернуть путь к файлу, который вы просматривали
  • Скопируйте данные из MS Access в MS Excel с помощью Python
  • Почему этот запрос доступа занимает так много времени?
  • Interesting Posts

    Увеличение строки ячейки в excel

    Excel VBA Оптимизируйте цикл

    Показывать название месяца в соответствии с номером в excel

    Слияние или удаление повторяющихся значений в столбцах с использованием Excel (или SQL)

    Если Range EntireRow.Hidden

    отображать внутри столбца номер из строки

    Excel VBA, если столбец B содержит значение, затем скопируйте это значение в столбец A, не перезаписывайте существующие данные столбца A

    Чтение данных из XLSX в c #

    формула до минут и секунд до общей суммы в секундах

    Чтение Python Чтение данных ячейки Excel Zero

    Скопируйте несвязанные ячейки из таблицы Excel в таблицу Word с помощью VBA

    Получение идентификаторов на основе нескольких строковых критериев

    расчетное поле сводной таблицы на подсчитанной колонке и суммированный столбец

    Visual Basic-Excel копирует только один столбец на другой лист

    Чтение файла Excel в R с пакетом XLConnect из URL-адреса

    Давайте будем гением компьютера.