Страницы: 1
RSS
Запустить макрос из другой книги
 
Доброго времени суток. В книге есть макрос который удаляет ненужные листы. А запустить его нужно из другой книги. В той другой книге, в ячейке N1 находится имя книги.
   Dim Nam_Fi As String 'имя файла
   Workbooks.Open ThisWorkbook.Path & "\" & Sheets("Счета").Range("N1") & ".xlsm" 'открываю книгу со счетами из текущей папки
   Nam_Fi = Sheets("Счета").Range("N1") & ".xlsm"
   Application.Run Macro:="'Nam_fi'!ModDeliter.Delet_sch"
   ActiveWorkbook.Close
По отдельности всё работает: открывается/закрывается. Сам макрос удаляет то что нужно. Затык в Nam_Fi, не получить имя файла
 
Так?
Код
Dim iWb As Workbook
Dim Nam_Fi As String 'имя файла
On Error Resume Next
With ThisWorkbook
  'открываю книгу со счетами из текущей папки
  Nam_Fi = .Worksheets("Счета").Range("N1") & ".xlsm"
  Set iWb = Workbooks.Open(.Path & "\" & Nam_Fi)
End With
If Not iWb Is Nothing Then
  Nam_Fi = iWb.Worksheets("Счета").Range("N1") & ".xlsm"
Else
  MsgBox "Не удалось открыть книгу! " & Nam_Fi, vbCritical + vbOKOnly
End If
Application.Run Macro:=Nam_fi & "!ModDeliter.Delet_sch"
ActiveWorkbook.Close

ПС Код оформляется соответствующим тэгом (<...>), исправьте сообщение
Согласие есть продукт при полном непротивлении сторон
 
Sanja добрый день, спасибо, что откликнулись. Попробовал ваш вариант, файл открывается в переменной Nam_Fi получает имя файла. Но не запускается макрос на удаление в открываемой книге. Попробовал туда ввести имя с путём nmm = .Path & "\" & Nam_Fi тоже не помогает. Прилагаю пробник с попытками.
 
Что и откуда нужно удалить?
Цитата
Фрезератор написал: В той другой книге, в ячейке N1 находится имя книги.
В обоих книгах ячейка 'N1' пустая.
Макроса тоже нет
В чем подвох?
Согласие есть продукт при полном непротивлении сторон
 
Цитата
написал:
В обоих книгах ячейка 'N1' пустая.
Действительно какие то не те файлы прицепил. Вторая попытка:  В книге "Основная" кнопкой вызывается макрос который запускает из книги "Пробник" макрос который должен удалить удалить листы вы книге "Пробник".
 
Самое прикольное, попробовал обратно скачать свои же файлы для проверки, майкрософт заблокировала как опасные. Но текст макросов присутствуют.
Я так понимаю это фишки лицензионного екселя.    
 
Меня вдруг посетила догадка, по сути применяемые макросы достаточно просты, может это сам excel не даёт другому файлу запускать удаление?
 
Я уже начал методом научного тыка, вместо переменной Nam_fi прямо вписал имя файла с расширением, получилось. Но имя будет изменяться, нужна переменная.
Сработала конструкция вызова макроса из другой книги Application.Run (nmm & ".xlsm!ModDeliter.Delet_sch").
т.е. в переменной nmm имя файла и сцепляю таким образом.
Появилась другая проблема. Открываемый файл после удаления листов, перед закрытием просит подтверждения на сохранение. Как отключить запрос?
Изменено: Фрезератор - 07.01.2026 23:16:50
 
Цитата
Фрезератор написал:
майкрософт заблокировала как опасные
Проделайте то что на скриншоте и будет вам счастье.
 
Цитата
написал:
Проделайте то что на скриншоте
Я такое в свойствах не нашёл. Да в принципе проблема уже отпала.
Изменено: Фрезератор - 07.01.2026 23:24:55
 
Проблема решена
   Application.DisplayAlerts = False
   ActiveWorkbook.Close True
   Application.DisplayAlerts = True
Когда знаешь, всё просто :)
Sanja спасибо.
 
Цитата
Фрезератор написал:
Проблема решена
Что-то не верится мне!
Код
Application.Run Macro:="Nam_Fi!ModDeliter.Delet_sch"
Ты передаёшь строку "Nam_Fi!...", а не имя файла, которое хранится в переменной Nam_Fi. VBA пытается найти книгу с буквальным именем Nam_Fi.xlsm, которой не существует. Правильно будет склеить строку с именем файла:
Код
Application.Run "'" & Nam_Fi & "'!ModDeliter.Delet_sch"


Если не верите что ваш код работает неправильно, то уберите в вашем коде строку
Код
On Error Resume Next
. Вместо неё внесите следуйщую строку
Код
On Error GoTo ErrHandler
. И окончание вашей процедуры будет таким
Код
    Application.Run Macro:="Nam_Fi!ModDeliter.Delet_sch"
    Application.DisplayAlerts = False
    ActiveWorkbook.Close True
    Application.DisplayAlerts = True
    Exit Sub

ErrHandler:
    MsgBox "Ошибка при открытии или выполнении макроса: " & Nam_Fi, vbCritical
End Sub
и увидите ошибку Вам решать.
Изменено: MikeVol - 08.01.2026 09:34:23 (Дополнил ответ)
 
Цитата
написал:
Если не верите что ваш код работает неправильно
я рано обрадовался. В тестовой книге всё заработало, а когда начал встраивать код в реальную книгу опять не срабатывает макрос.  
 
Фрезератор, Вы разницу в своем коде файла из вашего поста #5 и кодом что вам предоставил Уважаемый Sanja в посте #2 видите?
 
Так?
Скрытый текст

Скрытый текст

Обратите внимание, что вместо ActiveWorkbook используется ThisWorkbook
П.С. А для чего такие сложности? Макрос удаления листов можно держать в книге 'Основная' или в Личной книге макросов, а не в каждой книге, в которй нужно периодически удалять листы. Тем более, что имя 'подопытного' файла Вы берете из 'Основная'
Скрытый текст
Изменено: Sanja - 08.01.2026 18:06:01
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Sanja написал:
А для чего такие сложности?
Нет проблем у ТС видать, вот и занимается ... .;)
 
Цитата
написал:
А для чего такие сложности?
К стати да. Если из основной удалять, то действия будут более предсказуемые. Прошу не судить меня строго. Макросами не занимаюсь на постоянной основе, с большой по времени периодичностью, когда какие нибудь задолбаные действия захочется переложить на vba.
 
Цитата
написал:
Нет проблем у ТС видать, вот и занимается
Бывает, что троллинг заставляет шевелить серым веществом.
 
Sanja разбираюсь с предложенным последним вариантом, хочется до конца понимать, что происходит.
For Each iSh In iWb.Worksheets -можете объяснить как это работает?
Данное выражение удаляет все листы кроме указанного. А мне надо чтобы удалялись все листы после указанного.
Изменено: Фрезератор - 08.01.2026 23:43:38
 
Цитата
Фрезератор написал:
можете объяснить как это работает?
идти по каждому листу книги iWb. Вот и все. Вы же не первый день на форуме и с VBA - уже можно было начать азы-то изучать.
Цитата
Фрезератор написал:
надо чтобы удалялись все листы после указанного
Код
For i = wsStart.Index + 1 To iWb.Worksheets.Count
    iWb.Worksheets(i).Delete
Next

wsStart - ссылка на "указанный" лист. Где и как он указывается даже не разбирался, т.к. по переписке в теме на это нет никакого указания.
Изменено: Дмитрий(The_Prist) Щербаков - 09.01.2026 12:05:37
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Фрезератор написал: А мне надо чтобы...
Все Ваши предыдущие коды удаляли именно ВСЕ листы, кроме 'ТН'
Скрытый текст
Согласие есть продукт при полном непротивлении сторон
 
Спасибо всем за участие. Проблема решена.
 
Разве удалять листы нужно не обратным циклом?
 
Да, Hugo, конечно
Скрытый текст

Но с другой стороны
Цитата
Фрезератор написал: Проблема решена.
:D
Согласие есть продукт при полном непротивлении сторон
Страницы: 1
Читают тему
Наверх