Vba excel как закрыть excel
Добрый день!
Есть файл на сервере и копия на рабочей машине. Рабочий файл при открытии проверяет наличие обновления на сервере, и если файл новее, то файл рабочий нужно заменить на версию с сервера по средствам работы макроса запущенного из рабочей копии.
Макрос рабочей копии:
[vba]
Sub tt() 'копирование файла
Dim sFileName As String, sNewFileName As String
Workbooks("Копирование.xls").Activate
Workbooks("Книга1.xls").Close False 'закрываем книгу
sFileName = "\\192.168.178.17\Книга 1\Книга1.xls" 'имя файла для копирования
sNewFileName = "D:\Книга1.xls" 'имя копируемого файла. Директория(в данном случае диск D) должна существовать
If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "Ошибка": Exit Sub
FileCopy sFileName, sNewFileName 'копируем файл
MsgBox "Файл скопирован", vbInformation, ""
With ActiveWorkbook 'закрываем активную книгу
.Close False
End With
Добрый день!
Есть файл на сервере и копия на рабочей машине. Рабочий файл при открытии проверяет наличие обновления на сервере, и если файл новее, то файл рабочий нужно заменить на версию с сервера по средствам работы макроса запущенного из рабочей копии.
Макрос рабочей копии:
[vba]
Sub tt() 'копирование файла
Dim sFileName As String, sNewFileName As String
Workbooks("Копирование.xls").Activate
Workbooks("Книга1.xls").Close False 'закрываем книгу
sFileName = "\\192.168.178.17\Книга 1\Книга1.xls" 'имя файла для копирования
sNewFileName = "D:\Книга1.xls" 'имя копируемого файла. Директория(в данном случае диск D) должна существовать
If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "Ошибка": Exit Sub
FileCopy sFileName, sNewFileName 'копируем файл
MsgBox "Файл скопирован", vbInformation, ""
With ActiveWorkbook 'закрываем активную книгу
.Close False
End With
Я не Гуру, но стремлюсь!
Sub tt() 'копирование файла
Dim sFileName As String, sNewFileName As String
Workbooks("Копирование.xls").Activate
Workbooks("Книга1.xls").Close False 'закрываем книгу
sFileName = "\\192.168.178.17\Книга 1\Книга1.xls" 'имя файла для копирования
sNewFileName = "D:\Книга1.xls" 'имя копируемого файла. Директория(в данном случае диск D) должна существовать
If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "Ошибка": Exit Sub
FileCopy sFileName, sNewFileName 'копируем файл
MsgBox "Файл скопирован", vbInformation, ""
With ActiveWorkbook 'закрываем активную книгу
.Close False
End With
Много чего не знаю.
[/vba] перенести в самый конец макроса tt?
а, всё, врубился. Автор - Roman777
Дата добавления - 02.06.2017 в 16:06
Дело в том, что его наверно нужно закрыть и заменить копией с сервера, иначе если он открыт копирование вызовит ошибку
Дело в том, что его наверно нужно закрыть и заменить копией с сервера, иначе если он открыт копирование вызовит ошибку ZamoK
ZamoK, тут нужно передавать управление кому-то, иначе кто будет управлять программой, запущенной файлом, который Вы хотите закрыть. Мб как Вариан, сначала создавать в процессе копию книги (или просто пустую книгу) с макросом, который и будет выполнять эту процедуру, не мешая закрыть книгу "Книга1.xls".
ZamoK, тут нужно передавать управление кому-то, иначе кто будет управлять программой, запущенной файлом, который Вы хотите закрыть. Мб как Вариан, сначала создавать в процессе копию книги (или просто пустую книгу) с макросом, который и будет выполнять эту процедуру, не мешая закрыть книгу "Книга1.xls". Roman777
Я не очень силён в vba , но как вариант сделать приват в файле Копирование, а в самом фале сделать close falce через паузу, вот только будет ли работать и как реализовать - знаний не хварает
Я не очень силён в vba , но как вариант сделать приват в файле Копирование, а в самом фале сделать close falce через паузу, вот только будет ли работать и как реализовать - знаний не хварает ZamoK
Я не Гуру, но стремлюсь!
Sub tt() 'копирование файла
Dim sFileName As String, sNewFileName As String
' Workbooks("Копирование.xls").Activate
' Workbooks("Книга1.xls").Close False 'закрываем книгу
sFileName = "D:\Тест2\Test2.xls" 'имя файла для копирования"
sNewFileName = "D:\Тест1\Test1.xls" 'имя копируемого файла. Директория(в данном случае диск D) должна существовать
If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "Ошибка": Exit Sub
FileCopy sFileName, sNewFileName 'копируем файл
MsgBox "Файл скопирован", vbInformation, ""
' With ActiveWorkbook 'закрываем активную книгу
' .Close False
' End With
Эта часть не моя, она удаляет файл Temp.xls (пока сам не очень понимаю как именно. что-то тут особенное в SetAttr), который собственно и управлял процессом (копия Книги1):
[vba]
Sub tt() 'копирование файла
Dim sFileName As String, sNewFileName As String
' Workbooks("Копирование.xls").Activate
' Workbooks("Книга1.xls").Close False 'закрываем книгу
sFileName = "D:\Тест2\Test2.xls" 'имя файла для копирования"
sNewFileName = "D:\Тест1\Test1.xls" 'имя копируемого файла. Директория(в данном случае диск D) должна существовать
If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "Ошибка": Exit Sub
FileCopy sFileName, sNewFileName 'копируем файл
MsgBox "Файл скопирован", vbInformation, ""
' With ActiveWorkbook 'закрываем активную книгу
' .Close False
' End With
Эта часть не моя, она удаляет файл Temp.xls (пока сам не очень понимаю как именно. что-то тут особенное в SetAttr), который собственно и управлял процессом (копия Книги1):
[vba]
Много чего не знаю.
Sub tt() 'копирование файла
Dim sFileName As String, sNewFileName As String
' Workbooks("Копирование.xls").Activate
' Workbooks("Книга1.xls").Close False 'закрываем книгу
sFileName = "D:\Тест2\Test2.xls" 'имя файла для копирования"
sNewFileName = "D:\Тест1\Test1.xls" 'имя копируемого файла. Директория(в данном случае диск D) должна существовать
If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "Ошибка": Exit Sub
FileCopy sFileName, sNewFileName 'копируем файл
MsgBox "Файл скопирован", vbInformation, ""
' With ActiveWorkbook 'закрываем активную книгу
' .Close False
' End With
Эта часть не моя, она удаляет файл Temp.xls (пока сам не очень понимаю как именно. что-то тут особенное в SetAttr), который собственно и управлял процессом (копия Книги1):
[vba]
Всем нам приходится - кому реже, кому чаще - повторять одни и те же действия и операции в Excel. Любая офисная работа предполагает некую "рутинную составляющую" - одни и те же еженедельные отчеты, одни и те же действия по обработке поступивших данных, заполнение однообразных таблиц или бланков и т.д. Использование макросов и пользовательских функций позволяет автоматизировать эти операции, перекладывая монотонную однообразную работу на плечи Excel. Другим поводом для использования макросов в вашей работе может стать необходимость добавить в Microsoft Excel недостающие, но нужные вам функции. Например функцию сборки данных с разных листов на один итоговый лист, разнесения данных обратно, вывод суммы прописью и т.д.
Макрос - это запрограммированная последовательность действий (программа, процедура), записанная на языке программирования Visual Basic for Applications (VBA). Мы можем запускать макрос сколько угодно раз, заставляя Excel выполнять последовательность любых нужных нам действий, которые нам не хочется выполнять вручную.
Способ 1. Создание макросов в редакторе Visual Basic
Для ввода команд и формирования программы, т.е. создания макроса необходимо открыть специальное окно - редактор программ на VBA, встроенный в Microsoft Excel.
- В старых версиях (Excel 2003 и старше) для этого идем в меню Сервис - Макрос - Редактор Visual Basic(Toos - Macro - Visual Basic Editor).
- В новых версиях (Excel 2007 и новее) для этого нужно сначала отобразить вкладку Разработчик (Developer) . Выбираем Файл - Параметры - Настройка ленты (File - Options - Customize Ribbon) и включаем в правой части окна флажок Разработчик (Developer) . Теперь на появившейся вкладке нам будут доступны основные инструменты для работы с макросами, в том числе и нужная нам кнопка Редактор Visual Basic(Visual Basic Editor)
:
К сожалению, интерфейс редактора VBA и файлы справки не переводятся компанией Microsoft на русский язык, поэтому с английскими командами в меню и окнах придется смириться:
Макросы (т.е. наборы команд на языке VBA) хранятся в программных модулях. В любой книге Excel мы можем создать любое количество программных модулей и разместить там наши макросы. Один модуль может содержать любое количество макросов. Доступ ко всем модулям осуществляется с помощью окна Project Explorer в левом верхнем углу редактора (если его не видно, нажмите CTRL+R). Программные модули бывают нескольких типов для разных ситуаций:
-
Обычные модули - используются в большинстве случаев, когда речь идет о макросах. Для создания такого модуля выберите в меню Insert - Module. В появившееся окно нового пустого модуля можно вводить команды на VBA, набирая их с клавиатуры или копируя их из другого модуля, с этого сайта или еще откуда нибудь:
Обычный макрос, введенный в стандартный модуль выглядит примерно так:
Давайте разберем приведенный выше в качестве примера макрос Zamena:
С ходу ясно, что вот так сразу, без предварительной подготовки и опыта в программировании вообще и на VBA в частности, сложновато будет сообразить какие именно команды и как надо вводить, чтобы макрос автоматически выполнял все действия, которые, например, Вы делаете для создания еженедельного отчета для руководства компании. Поэтому мы переходим ко второму способу создания макросов, а именно.
Способ 2. Запись макросов макрорекордером
Макрорекордер - это небольшая программа, встроенная в Excel, которая переводит любое действие пользователя на язык программирования VBA и записывает получившуюся команду в программный модуль. Если мы включим макрорекордер на запись, а затем начнем создавать свой еженедельный отчет, то макрорекордер начнет записывать команды вслед за каждым нашим действием и, в итоге, мы получим макрос создающий отчет как если бы он был написан программистом. Такой способ создания макросов не требует знаний пользователя о программировании и VBA и позволяет пользоваться макросами как неким аналогом видеозаписи: включил запись, выполнил операци, перемотал пленку и запустил выполнение тех же действий еще раз. Естественно у такого способа есть свои плюсы и минусы:
- Макрорекордер записывает только те действия, которые выполняются в пределах окна Microsoft Excel. Как только вы закрываете Excel или переключаетесь в другую программу - запись останавливается.
- Макрорекордер может записать только те действия, для которых есть команды меню или кнопки в Excel. Программист же может написать макрос, который делает то, что Excel никогда не умел (сортировку по цвету, например или что-то подобное).
- Если во время записи макроса макрорекордером вы ошиблись - ошибка будет записана. Однако смело можете давить на кнопку отмены последнего действия (Undo) - во время записи макроса макрорекордером она не просто возрвращает Вас в предыдущее состояние, но и стирает последнюю записанную команду на VBA.
Чтобы включить запись необходимо:
- в Excel 2003 и старше - выбрать в меню Сервис - Макрос - Начать запись(Tools - Macro - Record New Macro)
- в Excel 2007 и новее - нажать кнопку Запись макроса (Record macro) на вкладке Разработчик (Developer)
Затем необходимо настроить параметры записываемого макроса в окне Запись макроса:
- Имя макроса - подойдет любое имя на русском или английском языке. Имя должно начинаться с буквы и не содержать пробелов и знаков препинания.
- Сочетание клавиш - будет потом использоваться для быстрого запуска макроса. Если забудете сочетание или вообще его не введете, то макрос можно будет запустить через меню Сервис - Макрос - Макросы - Выполнить(Tools - Macro - Macros - Run) или с помощью кнопки Макросы (Macros) на вкладке Разработчик (Developer) или нажав ALT+F8.
- Сохранить в. - здесь задается место, куда будет сохранен текст макроса, т.е. набор команд на VBA из которых и состоит макрос.:
- Эта книга - макрос сохраняется в модуль текущей книги и, как следствие, будет выполнятся только пока эта книга открыта в Excel
- Новая книга - макрос сохраняется в шаблон, на основе которого создается любая новая пустая книга в Excel, т.е. макрос будет содержаться во всех новых книгах, создаваемых на данном компьютере начиная с текущего момента
- Личная книга макросов - это специальная книга Excel с именем Personal.xls, которая используется как хранилище макросов. Все макросы из Personal.xls загружаются в память при старте Excel и могут быть запущены в любой момент и в любой книге.
После включения записи и выполнения действий, которые необходимо записать, запись можно остановить командой Остановить запись (Stop Recording) .
Запуск и редактирование макросов
Управление всеми доступными макросами производится в окне, которое можно открыть с помощью кнопки Макросы (Macros) на вкладке Разработчик (Developer) или - в старых версиях Excel - через меню Сервис - Макрос - Макросы (Tools - Macro - Macros) :
- Любой выделенный в списке макрос можно запустить кнопкой Выполнить(Run) .
- Кнопка Параметры(Options) позволяет посмотреть и отредактировать сочетание клавиш для быстрого запуска макроса.
- Кнопка Изменить(Edit) открывает редактор Visual Basic (см. выше) и позволяет просмотреть и отредактировать текст макроса на VBA.
Создание кнопки для запуска макросов
Чтобы не запоминать сочетание клавиш для запуска макроса, лучше создать кнопку и назначить ей нужный макрос. Кнопка может быть нескольких типов:
Кнопка на панели инструментов в Excel 2003 и старше
Откройте меню Сервис - Настройка (Tools - Customize) и перейдите на вкладку Команды (Commands) . В категории Макросы легко найти веселый желтый "колобок" - Настраиваемую кнопку (Custom button) :
Перетащите ее к себе на панель инструментов и затем щелкните по ней правой кнопкой мыши. В контекстом меню можно назначить кнопке макрос, выбрать другой значок и имя:
Кнопка на панели быстрого доступа в Excel 2007 и новее
Щелкните правой кнопкой мыши по панели быстрого доступа в левом верхнем углу окна Excel и выберите команду Настройка панели быстрого доступа (Customise Quick Access Toolbar) :
Затем в открывшемся окне выберите категорию Макросы и при помощи кнопки Добавить (Add) перенесите выбранный макрос в правую половину окна, т.е. на панель быстрого доступа:
Кнопка на листе
Этот способ подходит для любой версии Excel. Мы добавим кнопку запуска макроса прямо на рабочий лист, как графический объект. Для этого:
- В Excel 2003 и старше - откройте панель инструментов Формы через меню Вид - Панели инструментов - Формы (View - Toolbars - Forms)
- В Excel 2007 и новее - откройте выпадающий список Вставить (Insert) на вкладке Разработчик (Developer)
Выберите объект Кнопка (Button) :
Затем нарисуйте кнопку на листе, удерживая левую кнопку мыши. Автоматически появится окно, где нужно выбрать макрос, который должен запускаться при щелчке по нарисованной кнопке.
Создание пользовательских функций на VBA
Создание пользовательских функций или, как их иногда еще называют, UDF-функций (User Defined Functions) принципиально не отличается от создания макроса в обычном программном модуле. Разница только в том, что макрос выполняет последовательность действий с объектами книги (ячейками, формулами и значениями, листами, диаграммами и т.д.), а пользовательская функция - только с теми значениями, которые мы передадим ей как аргументы (исходные данные для расчета).
Чтобы создать пользовательскую функцию для расчета, например, налога на добавленную стоимость (НДС) откроем редактор VBA, добавим новый модуль через меню Insert - Module и введем туда текст нашей функции:
Обратите внимание, что в отличие от макросов функции имеют заголовок Function вместо Sub и непустой список аргументов (в нашем случае это Summa). После ввода кода наша функция становится доступна в обычном окне Мастера функций (Вставка - Функция) в категории Определенные пользователем (User Defined) :
После выбора функции выделяем ячейки с аргументами (с суммой, для которой надо посчитать НДС) как в случае с обычной функцией:
Здравствуйте! У Вас нет темы по работе с фильтром. Можно проконсультироваться на этот счёт?
Здравствуйте, Сергей!
Задавайте вопрос, постараюсь ответить.Спасибо, Евгений! Имеется в Excel столбец с включённым автофильтром. Можно ли программно запустить окно фильтра для выбора значений? Т.е. не руками нажимать на иконку фильтра, а заставить окно открываться с помощью макроса. Спасибо за ответ.
Да, это возможно:
Сергей, уточните вопрос: нужно программно нажать кнопки Ok и Отмена или отследить, какая из них была нажата?
Просто отследить, какая кнопка нажата.
По предыдущему вопросу. Я вставил sendkeys… в конец макроса, который запускается при нажатии кнопки на листе. Окно фильтра появляется и тут же закрывается. А как сделать, чтобы окно осталось, и пользователь мог выбрать данные?Евгений, я разобрался, почему не выводилось окно с фильтром.
Пример отслеживания нажатий кнопки «OK» автофильтра. На нажатие кнопки «Отмена» код не реагирует.
Вставьте в стандартный модуль (в примере — Module1) объявление глобальной переменной и код процедуры для кнопки:
Range("A1").CurrentRegion можно заменить на имя таблицы.
Евгений, а формулу в поле B2 оставлять или её можно удалить?
Можно удалить, если в таблице есть другие формулы. Я изменил код процедуры Worksheet_Calculate() в предыдущем примере, чтобы она не реагировала на изменение формул, а только на нажатие кнопки «OK» автофильтра. Range("A1") — это ячейка с кнопкой фильтра.
Евгений, спасибо за корректировку процедуры. Думаю, в ней и поле myString1 необязательно (и связанная проверка с ним), т.к. пользователь может выбрать все значения.
Но… после команды SendKeys "%" событие Worksheet_Calculate() отрабатывается только один раз :(.Сергей, событие Worksheet_Calculate() не зависит от команды SendKeys "%" . Ограничение стоит здесь:
Код в процедуре Worksheet_Calculate() срабатывает только когда активна ячейка Range("A1") . Если заменить в этой строке Range("A1") на диапазон строки заголовков таблицы, тогда код будет срабатывать при любой активной ячейке в заголовке.
В переменную myString записывается состояние таблицы до применения фильтра, в переменную myString1 — после применения. Затем их содержимое сравнивается: если они содержат разные значения — значит, фильтр был применен.
Здравствуйте! может я не туда пишу. вопрос
нужно посчитать кол-во строк в столбце «В» (от 100 до 5000) и вставить в формулу вместо 744
table = Range("B2:C744")
спасибо.В столбце «B» не должно быть пустых ячеек до последней строки таблицы.
Как определить в VBA есть узор в ячейке?
Спасибо за достаточно полную информацию.
Был бы очень вам признателен, если бы вы подсказали:
как изменить ширину блоков верхнего колонтитула.
«Введена слишком длинная строка. Уменьшите число знаков.»
При изменении шрифта с полужирного на обычный всё нормально
воспринимается,
Прошу прощения, если не по адресу.Добрый день! Никак не могу решить проблему с заблокированным автофильтром на защищенном макросом (нашел на форумах) листе. Подскажите пожалуйста, куда и какую строчку нужно добавить в макрос, чтобы при открытии файла был активен автофильтр:
Добрый день, Владислав!
Замените строкуДобрый день, Евгений!
ОГРОМНОЕ СПАСИБО. :))Здравствуйте, помогите, пожалуйста, решить задачу((
Разработать программу «Кредитный калькулятор» для расчета выплат по кредиту в условиях начисления процентов по аннуитетной схеме постнумерандо. Форма должна предусматривать ввод:
1) сумма кредита, допустимы 2 знака после запятой;
2) процентная ставка (годовая), допустимы 2 знака после запятой;
3) количество периодов (месяцев), целое положительное число.
Также форма должна содержать две кнопки:
1) «Ok» (выполнить расчет, заполнить лист Excel, освободить форму и закончить работу программы);
2) «Отмена» (освободить форму и закончить работу программы).
На лист Excel следует вывести 5 колонок:
1) номер периода;
2) остаток кредита;
3) сумма процентов за пользование кредитом, подлежащая к оплате;
4) сумма погашения основного долга (кредита);
5) общая сумма выплат за период.
Форма должна быть открыта из макроса «main» и там же освобождена по завершению своего использования. Форма должна содержать только код работы с формой и ввода данных. Логика верификации данных должна быть, по возможности, отделена от кода формы. Бизнес-логика обязательно должна быть отделена от кода формы.Здравствуйте, Рафия!
С разработкой кредитного калькулятора вам помогут только за плату на бирже фриланса.Добрый день, Евгений! Я только начинаю работать с VBA. Помогите, пожалуйста, прописать код для автоматического перемещения курсора на ячейку вправо после заполнения предыдущей.
Здравствуйте, Ева! Для перемещения фокуса в ячейку справа код VBA не нужен: используйте для этого клавишу «Tab» или настройте клавишу «Enter» для перехода вправо (Файл >> Параметры >> Дополнительно).
Спасибо за ответ! Да, но это надо делать вручную; речь идёт об автоматическом перемещении курсора.
добрый день, скажите как закрыть ексель (полностью выйти) с сохранением под таким же названием и без предупреждения
скажите что в этом коде не так((((Sub вава()
Range("A1") = 1
Workbooks.Application.DisplayAlerts = False
Excel.ActiveWorkbook.SaveAs ("rl.xlsm")
Workbooks.Close
End Subдобрый день, скажите как закрыть ексель (полностью выйти) с сохранением под таким же названием и без предупреждения
скажите что в этом коде не так((((Sub вава()
Range("A1") = 1
Workbooks.Application.DisplayAlerts = False
Excel.ActiveWorkbook.SaveAs ("rl.xlsm")
Workbooks.Close
End SubSub вава()
Range("A1") = 1
Workbooks.Application.DisplayAlerts = False
Excel.ActiveWorkbook.SaveAs ("rl.xlsm")
Workbooks.Close
End Sub' подавляет предупреждения Excel
Workbooks.Application.DisplayAlerts = False' сохраняет книгу в файл С ДРУГИМ именем
Excel.ActiveWorkbook.SaveAs ("rl.xlsm")' сохраняет книгу в файл С ТЕМ ЖЕ именем
Excel.ActiveWorkbook.Save' закрывает книгу
Workbooks.Close' закрыть с сохранением (без запроса подтверждения пользователя, даже если .DisplayAlerts = True)
Workbooks.Close True' закрыть без сохранения (без запроса подтверждения пользователя, даже если .DisplayAlerts = True)
Workbooks.Close False' закрыть Excel (закроется только если в этом же Application больше нет открытых и не сохраненных книг,
' иначе будет запрашивать подтверждения сохранения, при .DisplayAlerts = True)
Application.Quit' подавляет предупреждения Excel
Workbooks.Application.DisplayAlerts = False' сохраняет книгу в файл С ДРУГИМ именем
Excel.ActiveWorkbook.SaveAs ("rl.xlsm")' сохраняет книгу в файл С ТЕМ ЖЕ именем
Excel.ActiveWorkbook.Save' закрывает книгу
Workbooks.Close' закрыть с сохранением (без запроса подтверждения пользователя, даже если .DisplayAlerts = True)
Workbooks.Close True' закрыть без сохранения (без запроса подтверждения пользователя, даже если .DisplayAlerts = True)
Workbooks.Close False' закрыть Excel (закроется только если в этом же Application больше нет открытых и не сохраненных книг,
' иначе будет запрашивать подтверждения сохранения, при .DisplayAlerts = True)
Application.Quit' подавляет предупреждения Excel
Workbooks.Application.DisplayAlerts = False' сохраняет книгу в файл С ДРУГИМ именем
Excel.ActiveWorkbook.SaveAs ("rl.xlsm")' сохраняет книгу в файл С ТЕМ ЖЕ именем
Excel.ActiveWorkbook.Save' закрывает книгу
Workbooks.Close' закрыть с сохранением (без запроса подтверждения пользователя, даже если .DisplayAlerts = True)
Workbooks.Close True' закрыть без сохранения (без запроса подтверждения пользователя, даже если .DisplayAlerts = True)
Workbooks.Close False' закрыть Excel (закроется только если в этом же Application больше нет открытых и не сохраненных книг,
' иначе будет запрашивать подтверждения сохранения, при .DisplayAlerts = True)
Application.Quitвсе отлично)) спасибки. вот чего я хотел)
Workbooks.Application.DisplayAlerts = False
Excel.ActiveWorkbook.Save
Application.Quitвсе отлично)) спасибки. вот чего я хотел)
Workbooks.Application.DisplayAlerts = False
Excel.ActiveWorkbook.Save
Application.Quit 85Muslim85Workbooks.Application.DisplayAlerts = False
Excel.ActiveWorkbook.Save
Application.Quit Автор - 85Muslim85
Дата добавления - 21.03.2015 в 14:35Всем добрый день!
Столкнулся с решением вопроса по теме поста.
Исходные параметры работы моего макроса:
Запускаем LAB.xlsm - открывается userform, активная книга Excel скрыта.
Из userform по кнопке запрашиваю отдельный 346.xlsx (name файла разный, поэтому сохраняю каждый раз) с исходными данными для работы по их обогащению.
346.xlsx закрывается сам ,а данные из него вставляются в текущую активную книгу самого макроса (называю ее временной таблицей).
Далее используя userform дополняю данные во временной таблице.
По окончании закрываю userform стандартной кнопкой окна (крестик).
Запускается процедура:Private Sub UserForm_Terminate()
Dim Process As Object
For Each Process In GetObject("winmgmts:").ExecQuery("Select * from Win32_Process")
If Process.Caption Like "weigher_web_service*" Then ' ищу терминальную программу, которую запустил дополнительно макросом в самом начале работы
Label11.Caption = "Терминал INFOSCAN остановлен"
Process.Terminate ' завершаю процесс терминальной программы
End If
If Not Process.Caption Like "weigher_web_service*" Then
End If
NextCall Module1.SaveChangesToSourceFile ' сохраняем данные из временной таблицы активной книги в исходник откуда данные были взяты первично
Application.DisplayAlerts = False
Excel.ActiveWorkbook.Saved = False
Application.Quit' Dim WSH As Object
' Set WSH = VBA.CreateObject("WScript.Shell")
' WSH.Run "TASKKILL /F /IM excel.exe /T"Процедура, которая вызывается внутри - для переноса данных из временной таблицы в файл с исходными данными, чтобы записать сделанные изменения в данных.
После чего временная таблица очищается перед закрытием.If ThisWorkbook.Sheets("Buffer").Range("file_address").Value = "" Then Exit Sub 'если ячейка с адресом файла пуста, то выход из процедуры
Dim SFile As String
SFile = ThisWorkbook.Sheets("Buffer").Range("file_address").Value
Dim SourceTab()
If ThisWorkbook.Sheets("TempTab").Cells(1, 1).CurrentRegion.Columns.Count < 2 Then
Exit Sub
End If
SourceTab = ThisWorkbook.Sheets("TempTab").Cells(1, 1).CurrentRegion.Resize(ThisWorkbook.Sheets("TempTab").Cells(1, 1).CurrentRegion.Rows.Count, ThisWorkbook.Sheets("TempTab").Cells(1, 1).CurrentRegion.Columns.Count - 1).Value
Dim wb As Workbook
Set wb = Workbooks.Open(Filename:=SFile, UpdateLinks:=0, ReadOnly:=False)
Dim RowsCount, ColumnsCount
RowsCount = UBound(SourceTab, 1)
ColumnsCount = UBound(SourceTab, 2)wb.Sheets("Данные").Range(Cells(1, 1).Address, Cells(RowsCount, ColumnsCount).Address).NumberFormat = "@"
wb.Sheets("Данные").Range(Cells(1, 1).Address, Cells(RowsCount, ColumnsCount).Address).Value = SourceTabApplication.DisplayAlerts = False
wb.Close SaveChanges:=True
Application.DisplayAlerts = TrueОткрытие файла исходника данных макросом, перенос в него данных из временной таблицы - происходит отлично и незаметно для пользователя. Но не могу побороть проблему с закрытием самой активной книги с макросом без косяков после. А именно использование стандартного:
Исполняет, но результат - остается видимым стандартное окно приложения Excel пустое, то есть без отображения листа в нем. И нужно закрыть ручками окно в итоге.
Поэтому добрался до того, что в первом куске кода закомментировал, то есть жестко закрыть excel на компе. Все закрывает без вопросов, но это влияет на любые другие Excel файлы открытые в этот момент, путем их закрытия. И что самое еще плохое, то после закрытия таким кодом и открытия любого файла Excel в левой панели видишь восстановленный файл того где собственно макрос. Получается файл был поврежден при закрытии, но попытка увидеть элементы поврежденные, пишет что их нет и все норм. Но в результате сколько раз макрос запускал - столько восстановленных версий будет видно в левой панели любого потом открытого фала Excel.Application.DisplayAlerts = False
Excel.ActiveWorkbook.Saved = False
Dim WSH As Object
Set WSH = VBA.CreateObject("WScript.Shell")
WSH.Run "TASKKILL /F /IM excel.exe /T"Когда после вроде всего закрытого самим макросом открываешь любой файл Excel в нем есть панель с восстановленным файлом макроса.
Если есть мысли, как победить, чтобы процедура закрывала Excel с макросом без появления восстановленной версии и без влияния на другие открытые Excel файлы, то буду благодарен.
Всем добрый день!
Столкнулся с решением вопроса по теме поста.
Исходные параметры работы моего макроса:
Запускаем LAB.xlsm - открывается userform, активная книга Excel скрыта.
Из userform по кнопке запрашиваю отдельный 346.xlsx (name файла разный, поэтому сохраняю каждый раз) с исходными данными для работы по их обогащению.
346.xlsx закрывается сам ,а данные из него вставляются в текущую активную книгу самого макроса (называю ее временной таблицей).
Далее используя userform дополняю данные во временной таблице.
По окончании закрываю userform стандартной кнопкой окна (крестик).
Запускается процедура:Private Sub UserForm_Terminate()
Dim Process As Object
For Each Process In GetObject("winmgmts:").ExecQuery("Select * from Win32_Process")
If Process.Caption Like "weigher_web_service*" Then ' ищу терминальную программу, которую запустил дополнительно макросом в самом начале работы
Label11.Caption = "Терминал INFOSCAN остановлен"
Process.Terminate ' завершаю процесс терминальной программы
End If
If Not Process.Caption Like "weigher_web_service*" Then
End If
NextCall Module1.SaveChangesToSourceFile ' сохраняем данные из временной таблицы активной книги в исходник откуда данные были взяты первично
Application.DisplayAlerts = False
Excel.ActiveWorkbook.Saved = False
Application.Quit' Dim WSH As Object
' Set WSH = VBA.CreateObject("WScript.Shell")
' WSH.Run "TASKKILL /F /IM excel.exe /T"Процедура, которая вызывается внутри - для переноса данных из временной таблицы в файл с исходными данными, чтобы записать сделанные изменения в данных.
После чего временная таблица очищается перед закрытием.If ThisWorkbook.Sheets("Buffer").Range("file_address").Value = "" Then Exit Sub 'если ячейка с адресом файла пуста, то выход из процедуры
Dim SFile As String
SFile = ThisWorkbook.Sheets("Buffer").Range("file_address").Value
Dim SourceTab()
If ThisWorkbook.Sheets("TempTab").Cells(1, 1).CurrentRegion.Columns.Count < 2 Then
Exit Sub
End If
SourceTab = ThisWorkbook.Sheets("TempTab").Cells(1, 1).CurrentRegion.Resize(ThisWorkbook.Sheets("TempTab").Cells(1, 1).CurrentRegion.Rows.Count, ThisWorkbook.Sheets("TempTab").Cells(1, 1).CurrentRegion.Columns.Count - 1).Value
Dim wb As Workbook
Set wb = Workbooks.Open(Filename:=SFile, UpdateLinks:=0, ReadOnly:=False)
Dim RowsCount, ColumnsCount
RowsCount = UBound(SourceTab, 1)
ColumnsCount = UBound(SourceTab, 2)wb.Sheets("Данные").Range(Cells(1, 1).Address, Cells(RowsCount, ColumnsCount).Address).NumberFormat = "@"
wb.Sheets("Данные").Range(Cells(1, 1).Address, Cells(RowsCount, ColumnsCount).Address).Value = SourceTabApplication.DisplayAlerts = False
wb.Close SaveChanges:=True
Application.DisplayAlerts = TrueОткрытие файла исходника данных макросом, перенос в него данных из временной таблицы - происходит отлично и незаметно для пользователя. Но не могу побороть проблему с закрытием самой активной книги с макросом без косяков после. А именно использование стандартного:
Исполняет, но результат - остается видимым стандартное окно приложения Excel пустое, то есть без отображения листа в нем. И нужно закрыть ручками окно в итоге.
Поэтому добрался до того, что в первом куске кода закомментировал, то есть жестко закрыть excel на компе. Все закрывает без вопросов, но это влияет на любые другие Excel файлы открытые в этот момент, путем их закрытия. И что самое еще плохое, то после закрытия таким кодом и открытия любого файла Excel в левой панели видишь восстановленный файл того где собственно макрос. Получается файл был поврежден при закрытии, но попытка увидеть элементы поврежденные, пишет что их нет и все норм. Но в результате сколько раз макрос запускал - столько восстановленных версий будет видно в левой панели любого потом открытого фала Excel.Application.DisplayAlerts = False
Excel.ActiveWorkbook.Saved = False
Dim WSH As Object
Set WSH = VBA.CreateObject("WScript.Shell")
WSH.Run "TASKKILL /F /IM excel.exe /T"Когда после вроде всего закрытого самим макросом открываешь любой файл Excel в нем есть панель с восстановленным файлом макроса.
Если есть мысли, как победить, чтобы процедура закрывала Excel с макросом без появления восстановленной версии и без влияния на другие открытые Excel файлы, то буду благодарен. DZAZ
Столкнулся с решением вопроса по теме поста.
Исходные параметры работы моего макроса:
Запускаем LAB.xlsm - открывается userform, активная книга Excel скрыта.
Из userform по кнопке запрашиваю отдельный 346.xlsx (name файла разный, поэтому сохраняю каждый раз) с исходными данными для работы по их обогащению.
346.xlsx закрывается сам ,а данные из него вставляются в текущую активную книгу самого макроса (называю ее временной таблицей).
Далее используя userform дополняю данные во временной таблице.
По окончании закрываю userform стандартной кнопкой окна (крестик).
Запускается процедура:Private Sub UserForm_Terminate()
Dim Process As Object
For Each Process In GetObject("winmgmts:").ExecQuery("Select * from Win32_Process")
If Process.Caption Like "weigher_web_service*" Then ' ищу терминальную программу, которую запустил дополнительно макросом в самом начале работы
Label11.Caption = "Терминал INFOSCAN остановлен"
Process.Terminate ' завершаю процесс терминальной программы
End If
If Not Process.Caption Like "weigher_web_service*" Then
End If
NextCall Module1.SaveChangesToSourceFile ' сохраняем данные из временной таблицы активной книги в исходник откуда данные были взяты первично
Application.DisplayAlerts = False
Excel.ActiveWorkbook.Saved = False
Application.Quit' Dim WSH As Object
' Set WSH = VBA.CreateObject("WScript.Shell")
' WSH.Run "TASKKILL /F /IM excel.exe /T"Процедура, которая вызывается внутри - для переноса данных из временной таблицы в файл с исходными данными, чтобы записать сделанные изменения в данных.
После чего временная таблица очищается перед закрытием.If ThisWorkbook.Sheets("Buffer").Range("file_address").Value = "" Then Exit Sub 'если ячейка с адресом файла пуста, то выход из процедуры
Dim SFile As String
SFile = ThisWorkbook.Sheets("Buffer").Range("file_address").Value
Dim SourceTab()
If ThisWorkbook.Sheets("TempTab").Cells(1, 1).CurrentRegion.Columns.Count < 2 Then
Exit Sub
End If
SourceTab = ThisWorkbook.Sheets("TempTab").Cells(1, 1).CurrentRegion.Resize(ThisWorkbook.Sheets("TempTab").Cells(1, 1).CurrentRegion.Rows.Count, ThisWorkbook.Sheets("TempTab").Cells(1, 1).CurrentRegion.Columns.Count - 1).Value
Dim wb As Workbook
Set wb = Workbooks.Open(Filename:=SFile, UpdateLinks:=0, ReadOnly:=False)
Dim RowsCount, ColumnsCount
RowsCount = UBound(SourceTab, 1)
ColumnsCount = UBound(SourceTab, 2)wb.Sheets("Данные").Range(Cells(1, 1).Address, Cells(RowsCount, ColumnsCount).Address).NumberFormat = "@"
wb.Sheets("Данные").Range(Cells(1, 1).Address, Cells(RowsCount, ColumnsCount).Address).Value = SourceTabApplication.DisplayAlerts = False
wb.Close SaveChanges:=True
Application.DisplayAlerts = TrueОткрытие файла исходника данных макросом, перенос в него данных из временной таблицы - происходит отлично и незаметно для пользователя. Но не могу побороть проблему с закрытием самой активной книги с макросом без косяков после. А именно использование стандартного:
Исполняет, но результат - остается видимым стандартное окно приложения Excel пустое, то есть без отображения листа в нем. И нужно закрыть ручками окно в итоге.
Поэтому добрался до того, что в первом куске кода закомментировал, то есть жестко закрыть excel на компе. Все закрывает без вопросов, но это влияет на любые другие Excel файлы открытые в этот момент, путем их закрытия. И что самое еще плохое, то после закрытия таким кодом и открытия любого файла Excel в левой панели видишь восстановленный файл того где собственно макрос. Получается файл был поврежден при закрытии, но попытка увидеть элементы поврежденные, пишет что их нет и все норм. Но в результате сколько раз макрос запускал - столько восстановленных версий будет видно в левой панели любого потом открытого фала Excel.Application.DisplayAlerts = False
Excel.ActiveWorkbook.Saved = False
Dim WSH As Object
Set WSH = VBA.CreateObject("WScript.Shell")
WSH.Run "TASKKILL /F /IM excel.exe /T"Когда после вроде всего закрытого самим макросом открываешь любой файл Excel в нем есть панель с восстановленным файлом макроса.
Если есть мысли, как победить, чтобы процедура закрывала Excel с макросом без появления восстановленной версии и без влияния на другие открытые Excel файлы, то буду благодарен. Автор - DZAZ
Дата добавления - 08.08.2019 в 10:53Читайте также: