Показаны сообщения с ярлыком VBA. Показать все сообщения
Показаны сообщения с ярлыком VBA. Показать все сообщения

воскресенье, 12 сентября 2021 г.

Конфликт имен в Excel 2016

Я думаю вы уже сталкивались с такой проблемой при работе в Excel, когда вы копируете лист Excel, то при создании копии листа вы получаете окно «Конфликт имен» (Смотрите рисунок 1). Картинка взята с сайта.

Рисунок 1. Окно "Конфликт имен"

Данная проблема связана с тем, что в окне «Диспетчер имен» (открывается при нажатии сочетания клавиш Ctrl+F3), который можно открыть на ленте во вкладке «Формулы», раздел «Определенные имена», созданы большое число именованных диапазонов, они и конфликтуют при копирование листа. Эти именованные диапазоны создаются при генерации отчета в каких-нибудь бухгалтерских приложениях.  Чтобы лист скопировать без этого окна «Конфликт имен», то вам необходимо в окне «Диспетчер имен» удалить все именованные диапазоны, которые там есть. Но, даже если вы удалите все эти именованные диапазоны, то этого будет не достаточно, так как существуют скрытые именованные диапазоны, которые не видны в окне «Диспетчер имен» и поэтому вам необходимо воспользоваться специальным VBA-макросом, который удалит все скрытые именованные диапазоны. Для того чтобы создать и запустить макрос, вам необходима для начала включить вкладку «Разработчик» на ленте. Для этого зайдите в меню параметры (смотрите рисунок 2), в окне параметров Excel в разделе «Настроить ленту» вам нужно включить вкладку «Разработчик» (смотрите рисунок 3).

Рисунок 2. Открытие окна "Параметры Excel"

Рисунок 3. Окно "Параметры Excel"

 Далее во вкладке разработчик нажмите кнопку «Visual Basic» (смотрите рисунок 4).

Рисунок 4. Вкладка "Разработчик" на ленте

В приложение “Microsoft Visual Basic for Applications” на панели проектов дважды нажмите левой кнопкой мыши по разделу «Эта книга» в проекте VBAProject (Книга1(смотрите рисунок 5 цифра 1)то откроется окно ввода VBA-кода (смотрите рисунок 5 цифра 2). Скопируйте и вставьте в это окно следующий код, который я взял с этой страницы.


Рисунок 5. Окно приложения “Microsoft Visual Basic for Applications”

Sub do_loop_names()
    Dim vJunkName As Name
    Debug.Print ThisWorkbook.Names.Count
    
    For Each vJunkName In ThisWorkbook.Names
    vJunkName.Delete
    Next vJunkName
End Sub

Запустите данный код на исполнение (смотрите рисунок 5 цифра 3). После того как код отработает, все скрытые именованные диапазоны будут удалены и вы сможете копировать листы Excel без всяких проблем, и не будите получать окно «Конфликт имен».

На этой странице https://kompsekret.ru/q/why-does-excel-now-give-me-already-existing-name-range-warning-on-copy-sheet-24247/ вы можете взять другой пример VBA-кода для очистки именованного диапазона.

вторник, 21 июля 2020 г.

[VBA][LibreOffice] Макрос вывода списка файлов определенной папки по маске

Напишем пример VBA программы в LibreOffice 6.4.4.2. Я уже писал о том, как написать простой макрос в этой статье. Перейдите по этой ссылке и посмотрите с чего начать. Наш макрос будет читать имена файлов в выбранной директории и выводить их в ячейки таблицы по определенной маске. Маска будет задаваться в коде макроса. Директория будет выбираться при помощи стандартного диалога Windows. Код сопровождается необходимыми комментариями, что бы понять работу макроса.

Рисунок 1. Результат работы макроса

Код макроса:
Sub Main
 Dim oFP As Object
 Dim DirName As String
 'Вызываем диалог выбора директории и сохраним путь папки в переменной DirName
 DirName = ""
 oFP = CreateUnoService("com.sun.star.ui.dialogs.FolderPicker")
 oFP.DisplayDirectory = ConvertToURL("C:\")
 oFP.Description = "Select a directory"
 oFP.Title = "Select the backup directory"
 
 If oFP.execute = _
  com.sun.star.ui.dialogs.ExecutableDialogResults.OK Then
  DirName = oFP.Directory
 End If
 
    Dim TableHeaderRangeData(0, 2)
    Dim TableHeaderRangeObject as Object
    Dim MainDocument as Object 
    MainDocument = ThisComponent
    'Очистим весь контент
    MainDocument.CurrentSelection.ClearContents(1 OR 2 OR 4 OR 8 OR 16 OR 32 OR 64 OR 128 OR 256 OR 512)
    'Сформируем заголовки таблицы (Сканируемая папка, Фильтр, Список файлов)
    TableHeaderRangeData(0, 0) = "Scan Folder"
    TableHeaderRangeData(0, 1) = "Filter"
    TableHeaderRangeData(0, 2) = "List Files"
 
    TableHeaderRangeObject = MainDocument.Sheets(0).getCellRangebyName("A1:C1")
    TableHeaderRangeObject.charWeight = com.sun.star.awt.FontWeight.BOLD
    TableHeaderRangeObject.setDataArray(TableHeaderRangeData)
 'Сформируем маску
 ReDim TableHeaderRangeData(0, 1)
 Dim strMaskSearch as String
 strMaskSearch = "*.pdf*"
 'Выведем путь папки и фильтр в ячейки таблицы
 TableHeaderRangeData(0, 0) = DirName
    TableHeaderRangeData(0, 1) = strMaskSearch 
 TableHeaderRangeObject = MainDocument.Sheets(0).getCellRangebyName("A2:B2") 
 TableHeaderRangeObject.charWeight = com.sun.star.awt.FontWeight.NORMAL
 TableHeaderRangeObject.setDataArray(TableHeaderRangeData)
 'Выведем список файлов в ячейки таблицы
 Dim FileName As String
 Dim iCounter As Integer
 FileName = Dir(DirName & "/" & strMaskSearch, 0)
 iCounter = 0
 Do While (FileName <> "")
     iCounter = iCounter + 1
 
  MainDocument.Sheets(0).getCellByPosition(2,iCounter).String = ""
     MainDocument.Sheets(0).getCellByPosition(2,iCounter).String = FileName
     FileName = Dir()
 Loop
End Sub

понедельник, 5 марта 2018 г.

Написание VBA макросов в LibreOffice

Внимание! Написание макроса выполнялось в LibreOffice 4.4.3.2 и Windows XP.

Запустите LibreOffice Calc. Выберите пункт меню Сервис -> Макросы -> Управление макросами -> LibreOffice Basic

В окне Макросы Libre Office BASIC в поле "Имя макроса" пишем "Main". В поле "Макрос из" выбираем "Мои макросы" - "Standard" и нажимаем кнопку "Создать". Смотрите рисунок 1.

Рисунок 1. Окно макросы LibreOffice Basic

В окне Новый модуль задаем название "Module1" и нажимаем кнопку "OK". Смотрите рисунок 2.

Рисунок 2. Создание нового модуля

Далее в окне редактора макрасов LibreOffice Basic приступаем к созданию диалога и написанию макроса. Смотрите рисунок 3.

Рисунок 3. Редактор макросов LibreOffice Basic

Сам модуль Module1 с главной процедурой Main у нас созданы. Чтобы создать диалог выберите в редакторе макросов LibreOffice Basic пункт меню Сервис -> Макросы -> Управление диалогами...

Выбираем вкладку "Диалоги". В разделе "Диалог" выбираем "Мои диалоги" -> "Standard" и нажимаем кнопку "Создать". Смотрите рисунок 4.

Рисунок 4. Создание диалога макроса

В окне Новый диалог задаем название "Dialog1" и нажимаем кнопку "OK". Смотрите рисунок 5. Потом кнопку "Закрыть" окна Управление макросами LibreOffice Basic.

Рисунок 5. Создание нового диалога

Далее в окне редактора макросов LibreOffice Basic дважды нажимаем на нашем только что созданом диалоге с именем "Dialog1", смотрите цифру 1 на рисунке 6. После этого откроется визуальный редактор диалога, смотрите цифру 2 на рисунке 6.

Рисунок 6. Редактор диалога LibreOffice Basic

Теперь перенесите на наш диалог визуальный элемент под именем метка и визуалный элемент кнопка. Визуальные элементы можно перетащить из панели визуальных элементов, смотрите цифру 3 на рисунке 6.

Если выделить визуальный элемент Метку, то откроется набор свойств данного элемента. Через эти свойства можно настроить элемент. Присвоим имя lblNow элементу метка и текст оставим пустым. Для элемента кнопка имя присвоем OKButton и текст зададим OK. Смотрите цифры 1,2,3 рисунка 7.

Рисунок 7. Добавление визуальных элементов в редакторе диалогов LibreOffice Basic

Как я писал выше, модуль Module1 с главной процедурой Main создана (смотрите рисунок 8), но она еще не заполнена.

Рисунок 8. Добавляем исходный код макроса

Процедура Main является основной, в ней мы загружаем диалоговое окно с именем Dialog1, это следующие строчки кода:

DialogLibraries.LoadLibrary("Standard")
Dlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)

Формируем строку с текущей датой и временем, это следующие строчки кода:

Dim strNow As String

strNow = Format(Now(), "yyyy-mm-dd ")
strNow = strNow + Format(Time(), "hh:mm")

Присваеваем строку с датой и временем визуальному элементу метка с именем lblNow, это следующие строчки кода:

Dim clblNow As Object

clblNow = Dlg.getControl("lblNow")
clblNow.Text = strNow

Последней строчкой кода в процедуре Main мы выполняем диалоговое окно с именем Dialog1:

Dlg.Execute()

Есть еще одна процедура, ее имя OKButton_execute, это событийная процедура, она выполняется в момент нажатия кнопки с именем OKButton, и выполняет она закрытие диалогового окна с именем Dialog1, это следующая строчка кода:

Dlg.endExecute()

Теперь присвойте процедуру с именем OKButton_execute кнопке с именем OKButton как событие на "Отпускание клавишы мыши". Для этого откройте визкальный редактор диалога Dialog1, смотрите цифру 1 на рисунке 9. Выделите Кнопку с именем OKButton и перейдите на вкладку "События", смотрите цифру 2 на рисунке 9. В событие "Отпускание клавиши мыши" укажите процедуру с именем OKButton_execute, нажав конопку с тремя точками, смотрите цифру 3 на рисунке 9. 

Рисунок 9. Назначение события кнопке ОК

Все необходимое для запуска макроса мы сделали. Для начала посмотрим что у нас делает макрос. Под цифрой 2 рисунка 10 вы видите созданное диалоговое окно с отображаемой текущей датой и временем. Если нажать кнопку OK, то диалоговое окно закроется.

Рисунок 10. Окно нашего макроса

Далее рассмотрим все варианты запуска нашего макроса по порядку. 

1. Запуск макроса из редактора макросов LibreOffice Basic.Откройте в редакторе макросов LibreOffice Basic наш код и выполнтите его нажав клавишу F5 или нажав на кнопку выполнения макроса, смотрите цифру 1 рисунка 10.

2. Запуск макроса из диалогового окна "Выбор макроса", смотрите цифру 1 на рисунке 11. В диалоговом окне нам нужно выбрать наш макрос и нажать кнопку "Выполнить", смотрите цифру 2 на рисунке 11. 

Рисунок 11. Запуск макроса из диалога "Выбор макроса"


3. Запуск макроса из меню и подменю в приложениях LibreOffice Calc или LibreOffice Writer, смотрите цифру 0 рисунка 12. Для создания меню и подменю выберите пункт меню "Сервис" и подменю "Настройка", смотрите цифры 1 и 2 рисунка 12. В диалоговом окне "Настройка" на вкладке "Меню" нажмите кнопку "Создать...", введите имя нашего меню (например "Макросы"), смотрите цифру 3 рисунка 12. Чтобы создать подменю нашего меню "Макросы" нажмите кнопку "Добавить..." (смотрите цифру 4 рисунка 12.). 

Рисунок 12. Запуск макроса из меню и подменю в приложениях LibreOffice Calc или LibreOffice Writer

Потом в диалоговом окне "Добавить команды" выберите команду которая будет выполнятся при выборе нашего подменю (смотрите цифры 1 и 2 рисунка 13), т.е. мы выбираем наш макроc с именем Main. 

Рисунок 13. Добавляем команду для подменю

Переименуйте наше подменю выбрав пункт меню "Переименовать..." кнопки "Изменить"  диалогового окна "Настройка" вкладки "Меню" (смотрите цифры 1,2,3,4 рисунка 14). Подменю назовите "Макрос окно с датой".

Рисунок 14. Переименование подменю

4. Запуск макроса в приложениях LibreOffice Calc или LibreOffice Writer по нажатию сочетания клавиш на клавиатуре. Для это откройте диалог "Настройка" и выбирите вкладку "Клавиатура" (смотрите цифру 1 рисунка 15). Потом выбираем команду, которая является нашим макросом с именем "Main" (смотрите цифру 2 рисунка 15). Потом выбираем свободную комбинацию клавиш и назначаем их нашей команде, т.е. макросу с именем Main (смотрите цифры 3,4,5 рисунка 15).

Рисунок 15. Назначение комбинации клавиш для запуска макроса

5. Запуск макроса в приложениях LibreOffice Calc или LibreOffice Writer по нажатию кнопки на панели инструментов (смотрите цифру 4 рисунка 16). Для создания кнопки на панели инструментов выберите пункт меню "Сервис" и подменю "Настройка", смотрите цифру 1 рисунка 16. В диалоговом окне "Настройка" на вкладке "Панели инструментов" нажмите кнопку "Создать...", введите имя нашей панели инструментов (например "Панель макросов"), смотрите цифру 2 рисунка 16. Чтобы создать кнопку на панели инструментов нажмите кнопку "Добавить..." (смотрите цифру 3 рисунка 16). 

Рисунок 16. Запуск макроса из панели инструментов

Потом в диалоговом окне "Добавить команды" выберите команду которая будет выполнятся при нажатие по нашей кнопке нашей панели инструментов  (смотрите цифры 1 и 2 рисунка 13), т.е. мы выбираем наш макроc с именем Main. 

 Переименуйте нашу кнопку нашей панели инструментов выбрав пункт меню "Переименовать..." кнопки "Изменить"  диалогового окна "Настройка" вкладки "Панели инструментов" (смотрите цифры 1,2,3,4 рисунка 17). Кнопку назовите "Макрос окно с датой".

Рисунок 17. Переименование кнопки панели инструментов

6. Запуск макроса в приложениях LibreOffice Calc или LibreOffice Writer в ответ на какое-то событие, например события запуска приложения. Таким образам наш макрос выполняется когда запускается приложение LibreOffice Calc или LibreOffice Writer. Для создания события выберите пункт меню "Сервис" и подменю "Настройка", смотрите цифру 1 рисунка 18.  В диалоговом окне "Настройка" на вкладке "События" выберите событие "Запуск приложения" и нажмите кнопку "Макрос...", смотрите цифру 2 рисунка 18.

Рисунок 18. Назначение события для запуска макроса

Далее выберите макрос Main в окне "Выбор макроса" (смотрите цифры 1,2,3 рисунка 19). 

Рисуной 19. Диалог выбора макроса

Перезапустите приложение LibreOffice Calc или LibreOffice Writer и вы увидете что наш макрос запускается.

Ниже размещен полный код макроса.

REM  *****  BASIC  *****

Dim Dlg As Object

Sub OKButton_execute 
Dlg.endExecute()
End Sub


Sub Main

DialogLibraries.LoadLibrary("Standard")
Dlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
Dim strNow As String
strNow = Format(Now(), "yyyy-mm-dd ")
strNow = strNow + Format(Time(), "hh:mm")
Dim clblNow As Object
clblNow = Dlg.getControl("lblNow")
clblNow.Text = strNow
Dlg.Execute()

End Sub