paha83 Пользователь Сообщений: 12 |
Доброго времени суток уважаемые форумчане! Задача. С помощью VBA: Спасибо! Прикрепленные файлы
|
CAHO Пользователь Сообщений: 2183 |
Пункт 3 и 4 противоречат друг другу. Или я не так понял. Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. |
paha83 Пользователь Сообщений: 12 |
Приветствую, САНО! |
kakaccc Пользователь Сообщений: 5 |
#4 22.09.2015 15:38:18 paha83
, если еще актуально:
Здесь первые 3 пункта. Прикрепленные файлы
Изменено: kakaccc — 22.09.2015 18:11:32 |
||
kakaccc Пользователь Сообщений: 5 |
#5 23.09.2015 15:35:13 Для 5 пункта:
Хотя, по-моему, без макроса будет даже проще. Пока он настроен так, что его надо запустить на каждом листе, который будет затем защищен. Прикрепленные файлы
|
||
paha83 Пользователь Сообщений: 12 |
Доброго времени суток, kakaccc! Большое спасибо за ответ и помощь. Еще раз спасибо!!! |
rSkrin Пользователь Сообщений: 3 |
Добрый день! |
kakaccc Пользователь Сообщений: 5 |
#8 27.02.2016 17:38:57
Немного громоздкий макрос получился. Изменено: kakaccc — 28.02.2016 02:18:56 |
||
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
#9 27.02.2016 18:36:24 kakaccc, чем по-Вашему будут отличаться результаты, если блок:
записать так:
Я сам — дурнее всякого примера! … |
||||
TheBestOfTheBest Пользователь Сообщений: 2366 Excel 2010 +PLEX +SaveToDB +PowerQuery |
Файл должен находиться в папке c:1. На таблице ПКМ-Обновить. Прикрепленные файлы
Неизлечимых болезней нет, есть неизлечимые люди. |
kakaccc Пользователь Сообщений: 5 |
KuklP, потому что я нуб в vba Спасибо! Буду теперь знать и использовать эту функцию. |
rSkrin Пользователь Сообщений: 3 |
Спасибо друзья! Но есть вопрос. Уважаемый kakaccc, правильно ли я понял про «таблица должна начинаться с ячейки А1»- т.е. начало всей таблицы, в том числе и шапки. |
rSkrin Пользователь Сообщений: 3 |
Вопрос отменяю. Чуть подправил, проверил работу, все отлично!!! Спасибо. |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
#14 28.02.2016 13:55:14
Да, это destination.
можно записать буквально:
в этом слуячае родительский объект вычисляется 3 раза вместо одного в предыдущем примере. Я сам — дурнее всякого примера! … |
||||||
kakaccc Пользователь Сообщений: 5 |
KuklP, все, раз это destination, то вопросов нет. Более менее разобрался. Буду теперь пользоваться. Красиво и лаконично получилось. Спасибо за объяснение! rSkrin, да, вся таблица должна начинаться с А1 (шапка в вашемслучае). Можно сделать независимо от находжения таблицы, используя свойство CurrentRegion, например. Но тогда перед запуском макроса надо будет выделять какую-нибудь ячейку из таблицы. Первоначально я так и записал макрос. Не знал как для вас проще будет. Если хотите, можно так сделать. |
0mega Пользователь Сообщений: 170 |
#16 06.11.2022 11:54:18 KuklP
, здравствуйте
почему команда начинается с точки
Какое у них отличие ? |
||||
MikeVol Пользователь Сообщений: 230 Ученик |
#17 06.11.2022 12:29:09 0mega, Думаю если вы прочтёте справку то возможно поймёте что к чему. почему команда начинается с точки |
How to copy and paste data using a Macro in Excel. I’ll show you multiple ways to do this, including across worksheets and workbooks.
Sections:
Simple Copy/Paste
Copy Entire Range
Copy between Worksheets
Copy between Workbooks
Notes
Simple Copy/Paste
Range("A1").Copy Range("B1")
This copies cell A1 to cell B1.
Range(«A1»).Copy is the part that copies the cell.
Range(«B1») is the cell where the data will be copied.
This is a simple one line piece of code and it’s very easy to use.
Notice that there is a space between these two parts of the code.
Copy Entire Range
Range("A1:A5").Copy Range("B1:B5")
Range(«A1:A5»).Copy is the part that copies the range.
Range(«B1:B5») is the range where the data will be copied.
You can also write it like this:
Range("A1:A5").Copy Range("B1")
Notice that the range to where you will copy the data has only a reference to cell B1.
You only have to reference the very first cell to which the range will be copied and the entire range will copy in the cells below there.
NOTE: if you do it like this, you may end up overwriting data and Excel will not give you a warning about this; the data will simply be filled down as far as it needs to go to copy the first range.
Copy between Worksheets
Sheets("Sheet1").Range("A1").Copy Sheets("Sheet2").Range("B1")
This follows the same pattern as the above examples except that we need to tell the macro from which sheet we want to get the data and to which sheet we want to copy the data.
Sheets(«Sheet1»). is placed in front of the first range and that means to get the data from Sheet1, which is the name of a worksheet in the workbook.
Sheets(«Sheet2»). is placed in front of the range to which we want to copy the data and Sheet2 is the name of the worksheet where the data will be copied.
Copy between Workbooks
Workbooks("Copy and Paste Data using Macro VBA in Excel.xlsm").Sheets("Sheet1").Range("A1").Copy Workbooks("Copy and Paste Data using Macro VBA in Excel.xlsm").Sheets("Sheet3").Range("A1")
Here, we follow the above examples and, this time, add a reference to the workbooks from which we want to get the data and to which we want to place the data.
Workbooks(«Copy and Paste Data using Macro VBA in Excel.xlsm»). is the code that says in which workbook we want to place the data. Copy and Paste Data using Macro VBA in Excel.xlsm is the name of the workbook. In this example I used this for both parts, the workbook from which the data comes and where it goes. This allows you to run this macro within a single workbook and still show you how it works. In a real-world example, the first part contains the name of the workbook where you get the data from and the second contains the name of the workbook where you want to place the data.
Read this tutorial to copy values from another workbook, even if it’s closed.
Notes
All examples in the attached workbook have been commented out. Simply remove the single quote from the line of code you want to test and then run the macro.
Download the attached file to get these examples in Excel.
Similar Content on TeachExcel
Activate or Navigate to a Worksheet using Macros VBA in Excel
Tutorial: Make a particular worksheet visible using a macro in Excel.
This is called activating a wo…
Get the Name of a Worksheet in Macros VBA in Excel
Tutorial: How to get the name of a worksheet in Excel using VBA and Macros and also how to store tha…
Get the Last Row using VBA in Excel
Tutorial:
(file used in the video above)
How to find the last row of data using a Macro/VBA in Exce…
Remove Dashed Lines from Copy Paste VBA in Excel
Tutorial: How to remove the flashing dashes from a copy/paste range using VBA in Excel; this removes…
Copy one range and paste in another range
Tutorial: Below is a macro, just copy and paste it into a module in your workbook and go from there…
Guide to Combine and Consolidate Data in Excel
Tutorial: Guide to combining and consolidating data in Excel. This includes consolidating data from …
Subscribe for Weekly Tutorials
BONUS: subscribe now to download our Top Tutorials Ebook!
0 / 0 / 0 Регистрация: 02.12.2018 Сообщений: 99 |
|
1 |
|
Excel Макрос для копирования информации с одного листа на другой по определенным условиям31.05.2019, 13:30. Показов 44379. Ответов 23
Доброго времени суток, Гуру excel!!! Помогите написать макрос который будет копировать нужные данные по определенным условиям с одного листа и вставлять на другой, если конечно это возможно… Файл с примером прилагаю в нем все цветами выделено что копировать и куда вставлять. заранее спасибо!!!
0 |
370 / 268 / 93 Регистрация: 18.11.2015 Сообщений: 990 |
|
31.05.2019, 13:31 |
2 |
А файл не приложили )
0 |
0 / 0 / 0 Регистрация: 02.12.2018 Сообщений: 99 |
|
31.05.2019, 13:32 [ТС] |
3 |
ArtNord, сейчас минутку вот файл
0 |
370 / 268 / 93 Регистрация: 18.11.2015 Сообщений: 990 |
|
31.05.2019, 13:43 |
4 |
Да, вижу, а что куда и по какому условию.
0 |
0 / 0 / 0 Регистрация: 02.12.2018 Сообщений: 99 |
|
31.05.2019, 13:45 [ТС] |
5 |
то что желтым выделено это условия, а синим это нужно перенести на лист 2
0 |
370 / 268 / 93 Регистрация: 18.11.2015 Сообщений: 990 |
|
31.05.2019, 14:07 |
6 |
Сообщение было отмечено Александр_80 как решение РешениеПроверьте
1 |
370 / 268 / 93 Регистрация: 18.11.2015 Сообщений: 990 |
|
31.05.2019, 14:08 |
7 |
Александр_80, проверьте
0 |
0 / 0 / 0 Регистрация: 02.12.2018 Сообщений: 99 |
|
31.05.2019, 14:21 [ТС] |
8 |
ArtNord, ДА ВСЕ РАБОТАЕТ ЭТО ПРОСТО МАГИЯ КАКАЯ ТО , ВОТ ТОЛЬКО Я ЗАБЫЛ УКАЗАТЬ НА КОЛОНКУ ДЮЙМЫ, МОЖНО ИХ ТОЖЕ КОПИРОВАТЬ? ПО ТЕМ ЖЕ УСЛОВИЯМ
0 |
370 / 268 / 93 Регистрация: 18.11.2015 Сообщений: 990 |
|
31.05.2019, 14:25 |
9 |
Добавил
1 |
Александр_80 0 / 0 / 0 Регистрация: 02.12.2018 Сообщений: 99 |
||||
31.05.2019, 14:46 [ТС] |
10 |
|||
ArtNord, Вы просто супер!!!! Спасибо огромное вам!!!!! Еще одна просьба, вы не могли бы разъяснить по вашему макросу, что какая команда делает?
0 |
ArtNord 370 / 268 / 93 Регистрация: 18.11.2015 Сообщений: 990 |
||||
31.05.2019, 14:57 |
11 |
|||
Спасибо за оценку!
1 |
0 / 0 / 0 Регистрация: 02.12.2018 Сообщений: 99 |
|
31.05.2019, 15:01 [ТС] |
12 |
ArtNord, вам спасибо за помощь!!! на самом деле в этой таблице более 50000 строк и она с каждым днем становится больше. Макрос будет работать на все эти строки?
0 |
ArtNord 370 / 268 / 93 Регистрация: 18.11.2015 Сообщений: 990 |
||||||||
31.05.2019, 15:01 |
13 |
|||||||
Да, вот эта строчка как раз и опреляет сколько сейчас записей:
1 |
0 / 0 / 0 Регистрация: 02.12.2018 Сообщений: 99 |
|
31.05.2019, 15:04 [ТС] |
14 |
ArtNord, а если копировать нужно не на лист 2 а на другой лист который находится в другой книге, что нужно сделать?
0 |
ArtNord 370 / 268 / 93 Регистрация: 18.11.2015 Сообщений: 990 |
||||
31.05.2019, 15:06 |
15 |
|||
Если книга эта открыта то:
0 |
0 / 0 / 0 Регистрация: 02.12.2018 Сообщений: 99 |
|
31.05.2019, 15:12 [ТС] |
16 |
простите меня я такой овощь в этом деле, я не пойму куда мне нужно эту строчку вставить?
0 |
ArtNord 370 / 268 / 93 Регистрация: 18.11.2015 Сообщений: 990 |
||||||||||||
31.05.2019, 15:15 |
17 |
|||||||||||
Где присваиваете значения:
Заменить на:
Добавлено через 1 минуту
0 |
0 / 0 / 0 Регистрация: 02.12.2018 Сообщений: 99 |
|
31.05.2019, 15:16 [ТС] |
18 |
ArtNord, Вы просто супер!!!! Я если честно даже не ожидал, что мне так сразу тут помогут!!! Дай вам бог здоровья!!!
0 |
370 / 268 / 93 Регистрация: 18.11.2015 Сообщений: 990 |
|
31.05.2019, 15:17 |
19 |
Спасибо! Взаимно! Просто коротаю время до конца рабочего дня ))))
1 |
0 / 0 / 0 Регистрация: 02.12.2018 Сообщений: 99 |
|
31.05.2019, 15:23 [ТС] |
20 |
ArtNord, нет не просто коротаете, вы людям помогаете!!!! Еще раз огромное спасибо ВАМ!!!! Добавлено через 4 минуты
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
31.05.2019, 15:23 |
20 |
Despite many posts I have looked through being of along the same lines as my question, none of the answers satisfy what I am looking for. If you can link me to one I’d gladly read it.
I have a workbook with worksheets. For simplicity, let’s say my workbook has a worksheet. And in my worksheet which is called «Sheet1», there is data in cells A1 to A4.
What I want my VBA code to do is:
- Copy row 1 (or specifically cells A1 to A4) of Workbook ‘A’ into Range variable ‘myRange’
- Create a new workbook, let’s call this one Workbook ‘B’
- Give Workbook ‘B’s default «sheet1» a new name to «Test Name»
- Open Workbook ‘B’ (though I realise that VBA code «Workbooks.Add» opens a new book so this step may be redundant since Workbooks.Add covers half of point 2 and 3)
- Paste ‘myRange’ into first row of ‘Workbook B’
- Save ‘Workbook B’ with name «Test Book» and a timestamp enclosed in square brackets. The file must also be of the file extension «xls»
- Close ‘Workbook B’ and return to ‘Workbook A’
What I have so far is this:
Sub OpenAndSaveNewBook()
'Declarations
Dim MyBook As String
Dim MyRange As Range
Dim newBook As Workbook
'Get name of current wb
MyBook = ThisWorkbook.Name
Set MyRange = MyBook.Sheets("Sheet1").Range("A1,F1")
'Create/Open new wb
newBook = Workbooks.Add
'Save new wb with XLS extension
ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "/" & "TEST-BOOK", _
FileFormat:=xlNormal, CreateBackup:=False
'===NOTE: BEFORE THE FOLLOWING RUNS I NEED TO PERFORM ACTIONS ON CELLS VIA VBA ON
'===WORKBOOK 'A'. DOES THE NEWLY CREATE WORKBOOK BECOME THE PRIMARY/ACTIVE WORKBOOK
'===? AND SO THEN DO I NEED TO ACTIVATE WORKBOOK 'A'?
ActiveWorkbook.Close savechanges:=True
'Return focus to workbook 'a'
MyBook.Activate
End Sub
As you can see, I am lacking the code that will handle:
- the pasting of my copied data to the new workbook
- the changing of the new workbook’s sheet1 name to something else
- adding a timestamp to the filename string on save
Lastly, I have included a question in my code as I think I may have a misunderstanding of the ActiveWorkbook method. AFAIK when the code «Workbooks.Add» runs this becomes the Active Workbook, i.e. one with the focus. Does this effect how the VBA code running on Workbook ‘A’? Does this mean that if I wanted to add code to manipulate cells of Workbook ‘A’ then I would need to use «MyBook.Activate» where ‘MyBook’ holds the string of Workbook ‘A’s actual title?
Any help will be greatly appreciated.
Thanks,
QF
Содержание
- Использование функции Dir
- Условие задачи по копированию данных
- Создание новых листов
- Синтаксис метода Sheets.Add
- Компоненты метода Sheets.Add
- Примеры создания листов
- Как макросом скопировать листы в Excel
- Что нельзя сделать с помощью макрорекодера?
- Что такое макрос?
- Решение с использованием массивов
- Что записывает макрос?
- Используем объект FileSystemObject
Использование функции Dir
Этот способ хорош тем, что в данном случае мы не подключаем дополнительных библиотек, а пользуемся только предустановленным функционалом. Способ подойдет, если вам необходимо просто получить список файлов в папке и не нужно выводить их размер, определять тип файла, дату его создания/изменения и т.п. Тут мы получаем только наименования файлов и больше ничего.
Вот там код данной функции, который выводит на лист 1 перечень файлов.
'************************************************************** ' Sub : ExampleOne ' Author : Алексей Желтов ' Date : 15.06.2020 ' Purpose : Вывод всех файлов в папке на лист '************************************************************** Sub ExampleOne() Dim Sh As Worksheet Dim Folder As String Dim FileName As String Dim i As Long Set Sh = ThisWorkbook.Sheets(1) Folder = Sh.Cells(3, 2) ' Проверка корректности введенных данных If PathExists(Folder) = False Then MsgBox "Указанной папки не существует", 16, "Ошибка исходных данных" Exit Sub End If ' Удаляем содержимое Sh.Rows("7:" & Sh.Range("A7").End(xlDown).Row).Delete Shift:=xlUp i = 7 FileName = Dir(Folder & "/", vbNormal) Do While FileName <> "" Sh.Cells(i, 1) = i - 6 Sh.Cells(i, 2) = FileName i = i + 1 ' переход к следующему файлу FileName = Dir Loop End Sub
Тут мы проверяем существование папки с помощью дополнительной функции. Опять таки не используем сторонних библиотек, а используем туже функцию Dir.
'************************************************************** ' Function : PathExists ' Author : Алексей Желтов ' Date : 15.06.2020 ' Purpose : Возвращает ИСТИНА если путь pname существует '************************************************************** Private Function PathExists(pname As String) As Boolean On Error Resume Next If Dir(pname, vbDirectory) = "" Then PathExists = False Else PathExists = (GetAttr(pname) And vbDirectory) = vbDirectory End If End Function
Вот так выглядит результат работы функции. Программа записала список файлов на текущий лист Excel.
Здесь мы не делали проверку на тип файла и вывели все файлы которые у нас были.
Если же необходимо отобрать только определенные типы файлов, например Excel файлы, то в нашем коде необходимо сделать дополнительную проверку:
Do While FileName <> "" If LCase(FileName) Like "*xls*" Then Sh.Cells(i, 1) = i - 6 Sh.Cells(i, 2) = FileName i = i + 1 End If ' переход к следующему файлу FileName = Dir Loop
Знак “*” означает любой набор символов. Таким образом, мы учли различные версии файлов Excel (xls, xlsx, xlsm).
Условие задачи по копированию данных
На одном листе расположен список повторяющихся городов с информацией о предприятиях общепита:
Исходная таблица задания №1
Необходимо данные по каждому городу перенести в одну строку на другом листе (таблица обрезана справа):
Часть результирующего списка задания №1
Создание новых листов
Создание новых рабочих листов осуществляется с помощью метода Sheets.Add.
Синтаксис метода Sheets.Add
expression.Add [Before, After, Count, Type]
где expression – переменная, представляющая собой объект Sheet.
Компоненты метода Sheets.Add
- Before* – необязательный параметр типа данных Variant, указывающий на лист, перед которым будет добавлен новый.
- After* – необязательный параметр типа данных Variant, указывающий на лист, после которого будет добавлен новый.
- Count – необязательный параметр типа данных Variant, указывающий, сколько листов будет добавлено (по умолчанию – 1).
- Type – необязательный параметр типа данных Variant, указывающий тип листа: xlWorksheet** (рабочий лист) или xlChart (диаграмма), по умолчанию – xlWorksheet.
*Если Before и After не указаны, новый лист, по умолчанию, будет добавлен перед активным листом.
**Для создания рабочего листа (xlWorksheet) можно использовать метод Worksheets.Add, который для создания диаграмм уже не подойдет.
Примеры создания листов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
‘Создание рабочего листа: Sheets.Add Worksheets.Add ThisWorkbook.Sheets.Add After:=ActiveSheet, Count:=2 Workbooks(“Книга1.xlsm”).Sheets.Add After:=Лист1 Workbooks(“Книга1.xlsm”).Sheets.Add After:=Worksheets(1) Workbooks(“Книга1.xlsm”).Sheets.Add After:=Worksheets(“Лист1”) ‘Создание нового листа с заданным именем: Workbooks(“Книга1.xlsm”).Sheets.Add.Name = “Мой новый лист” ‘Создание диаграммы: Sheets.Add Type:=xlChart ‘Добавление нового листа перед ‘последним листом рабочей книги Sheets.Add Before:=Worksheets(Worksheets.Count) ‘Добавление нового листа в конец Sheets.Add After:=Worksheets(Worksheets.Count) |
- Лист1 в After:=Лист1 – это уникальное имя листа, указанное в проводнике редактора VBA без скобок.
- Лист1 в After:=Worksheets(«Лист1») – это имя на ярлыке листа, указанное в проводнике редактора VBA в скобках.
Создаваемый лист можно присвоить объектной переменной:
Dim myList As Object ‘В активной книге Set myList = Worksheets.Add ‘В книге «Книга1.xlsm» Set myList = Workbooks(“Книга1.xlsm”).Worksheets.Add ‘Работаем с переменной myList.Name = “Listok1” myList.Cells(1, 1) = myList.Name ‘Очищаем переменную Set myList = Nothing |
Если создаваемый лист присваивается объектной переменной, он будет помещен перед активным листом. Указать дополнительные параметры невозможно.
Допустим необходимо приготовить планы работ для сотрудников вашего отдела. Иметься шаблон таблицы для заполнения документа плана в виде одного рабочего листа Excel:
Но вам необходимо создать 12 планов и соответственно 12 листов. В программе Excel нет встроенного инструмента для многократного создания копий рабочих листов за одну операцию. А копировать и вставлять 12 (а в практике встречаются случаи что и 120) листов вручную, да еще их все нужно переименовать – это потребует много рабочего времени и пользовательских сил. Определенно лучше в таком случае воспользоваться собственным макросом. А чтобы его написать воспользуйтесь VBA-кодом, который будет представлен ниже в данной статье.
Сначала откройте редактор макросов Visual Basic:
Создайте в нем стандартный модуль с помощью опций меню: «Insert»-«Module» и введите в него этот код, который ниже представленный на листинге:
SubCopyList()
DimkolvoAs Variant
DimiAs Long
DimlistAsWorksheet
kolvo = InputBox("Укажите необходимое количество копий для данного листа")
Ifkolvo =""Then Exit Sub
IfIsNumeric(kolvo)Then
kolvo = Fix(kolvo)
Setlist = ActiveSheet
Fori = 1Tokolvo
list.Copy after:=ActiveSheet
ActiveSheet.Name = list.Name & i
Next
Else
MsgBox"Неправильно указано количество"
End If
End Sub
Теперь если нам нужно скопировать 12 (или любое другое количество) раз листов содержащие шаблон для заполнения плана работы сотрудника, кликните по исходному листу, чтобы сделать его активным и выберите инструмент: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«CopyList»-«Выполнить». Сразу после запуска макроса появиться диалоговое окно, в котором следует указать количество копий листа:
Введите, например, число 12 и нажмите ОК:
Лист с шаблоном плана скопируется 12 раз, а все названия листов будут иметь такое же как название исходного листа только со своим порядковым номером от 1 до12.
Внимание! Если название исходного листа слишком длинное, тогда может возникнуть ошибка в процессе выполнения макроса. Ведь в Excel название листа не может содержать более чем 31 символ. То есть ориентируйтесь так чтобы название исходного листа было меньше чем 27 символов. Так же ошибка может возникнуть если текущая рабочая книга Excel уже содержит листы с таким названием как у копий. Ведь в Excel все листы должны иметь уникальные названия.
Примечание. В новых версиях Excel (начиная от 2010 версии) одна рабочая книга может содержать максимальное количество листов, которое ограничивается лишь размером свободной оперативной памяти системы.
Что нельзя сделать с помощью макрорекодера?
Макро-рекордер отлично подходит для вас в Excel и записывает ваши точные шаги, но может вам не подойти, когда вам нужно сделать что-то большее.
- Вы не можете выполнить код без выбора объекта. Например, если вы хотите, чтобы макрос перешел на следующий рабочий лист и выделил все заполненные ячейки в столбце A, не выходя из текущей рабочей таблицы, макрорекодер не сможет этого сделать. В таких случаях вам нужно вручную редактировать код.
- Вы не можете создать пользовательскую функцию с помощью макрорекордера. С помощью VBA вы можете создавать пользовательские функции, которые можно использовать на рабочем листе в качестве обычных функций.
- Вы не можете создавать циклы с помощью макрорекордера. Но можете записать одно действие, а цикл добавить вручную в редакторе кода.
- Вы не можете анализировать условия: вы можете проверить условия в коде с помощью макрорекордера. Если вы пишете код VBA вручную, вы можете использовать операторы IF Then Else для анализа условия и запуска кода, если true (или другой код, если false).
Что такое макрос?
Для начала немного о терминологии.
Макрос – это код, написанный на встроенном в Excel языке VBA (Visual Basic for Application). Макросы могут создаваться как вручную, так и записываться автоматически с помощью так называемого макрорекодера.
Макрорекодер – это инструмент в Excel, который пошагово записывает все что вы выполняете в Excel и преобразует это в код на языке VBA. Макрорекодер создает очень подробный код (как мы увидим позже), который вы сможете при необходимости отредактировать в дальнейшем.
Записанный макрос можно будет запускать неограниченное количество раз и Excel повторит все записанные шаги. Это означает, что даже если вы ничего не знаете о VBA, вы можете автоматизировать некоторые задачи, просто записав свои шаги и затем повторно использовать их позже.
Теперь давайте погрузимся и посмотрим, как записать макрос в Excel.
Решение с использованием массивов
Циклы в массивах работают очень быстро, но решение с ними может быть сложнее, чем при простом присваивании значений одних ячеек другим. В этом примере для упрощения кода две процедуры записаны отдельно и в нужные моменты вызываются для исполнения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
‘Объявление глобальных переменных ‘в разделе Declarations Dim massiv1 As Variant, n2 As Long, _ n3 As Long, i1 As Long, txt1 As Variant ‘Исполняемая процедура для решения ‘задания вторым способом Sub Resheniye2() Dim n1 As Long, gorod As Variant With Sheets(“Лист1”).Cells(1, 1) massiv1 = .CurrentRegion n1 = .CurrentRegion.Rows.Count n2 = .CurrentRegion.Columns.Count End With n3 = 0 txt1 = “” For i1 = 1 To n1 If gorod <> massiv1(i1, 1) Then If txt1 <> “” Then Call Vstavka End If gorod = massiv1(i1, 1) txt1 = massiv1(i1, 1) Call Kopirovanie Else Call Kopirovanie End If If i1 = n1 Then Call Vstavka End If Next End Sub ‘Копирование данных из массива в ‘строковую переменную через разделитель Sub Kopirovanie() Dim i2 As Long For i2 = 2 To n2 If massiv1(i1, i2) <> Empty Then txt1 = txt1 & “|” & massiv1(i1, i2) End If Next End Sub ‘Обработка данных из строковой ‘переменной в дополнительных массивах и ‘вставка очередной строки на второй лист Sub Vstavka() Dim n4 As Long, massiv2 As Variant, _ massiv3 As Variant, i3 As Long n3 = n3 + 1 massiv2 = Split(txt1, “|”) n4 = UBound(massiv2) ReDim massiv3(0 To 0, 0 To n4) For i3 = 0 To n4 massiv3(0, i3) = massiv2(i3) Next Sheets(“Лист2”).Range(Cells(n3, 1), _ Cells(n3, n4 + 1)).Value = massiv3 End Sub |
Подпрограммы Kopirovanie
и Vstavka
используются в цикле For... Next
процедуры Resheniye2
по два раза, поэтому их коды вынесены за пределы процедуры Resheniye2
и вызываются по мере необходимости.
Переменные:
- massiv1 – его элементам присваиваются значения ячеек исходной таблицы;
- massiv2 – одномерный массив, заполняемый данными из переменной txt1;
- massiv3 – двумерный массив, заполняемый данными из одномерного массива massiv2 и используемый для вставки очередной строки на второй лист;
- txt1 – сюда копируются через разделитель значения элементов массива massiv1, предназначенные для заполнения очередной строки на втором листе;
- n1 – количество строк в исходной таблице;
- n2 – количество столбцов в исходной таблице;
- n3 – номер текущей строки на втором листе;
- n4 – количество столбцов текущей строки на втором листе (соответствует количеству элементов массива massiv2);
- i1, i2, i3 – счетчики цикла For… Next
- gorod – переменная с наименованием города, предназначенная для контроля за сменой текущего города, который обрабатывается циклом.
Что записывает макрос?
Теперь перейдем к редактору кода и посмотрим что у нас получилось.
Вот шаги по открытию редактора VB в Excel:
- Перейдите на вкладку “Разработчик”.
- В группе “Код” нажмите кнопку “Visual Basic”.
Вы также можете использовать комбинацию клавиш Alt + F11 и перейти в редактор кода VBA.
Рассмотрим сам редактор кода. Далее коротко опишем интерфейс редактора.
- Панель меню: содержит команды, которые можно использовать во время работы с редактором VB.
- Панель инструментов – похожа на панель быстрого доступа в Excel. Вы можете добавить к ней дополнительные инструменты, которыми часто пользуетесь.
- Окно проектов (Project Explorer) – здесь Excel перечисляет все книги и все объекты в каждой книге. Например, если у нас есть книга с 3 рабочими листами, она появится в Project Explorer. Здесь есть несколько дополнительных объектов, таких как модули, пользовательские формы и модули классов.
- Окно кода – собственно сам код VBA размещается в этом окне. Для каждого объекта, указанного в проводнике проекта, есть окно кода, например, рабочие листы, книги, модули и т. д. В этом уроке мы увидим, что записанный макрос находится в окне кода модуля.
- Окно свойств – вы можете увидеть свойства каждого объекта в этом окне. Я часто использую это окно для обозначения объектов или изменения их свойств.
- Immediate Window (окно предпросмотра) – На начальном этапе оно вам не пригодится. Оно полезно, когда вы хотите протестировать шаги или во время отладки. Он по умолчанию не отображается, и вы можете его отобразить, щелкнув вкладку «View» и выбрав опцию «Immediate Window».
Когда мы записали макрос “ВводТекста”, в редакторе VB произошли следующие вещи:
- Был добавлен новый модуль.
- Макрос был записан с именем, которое мы указали – “ВводТекста”
- В окне кода добавлена новая процедура.
Поэтому, если вы дважды щелкните по модулю (в нашем случае модуль 1), появится окно кода, как показано ниже.
Вот код, который записан макрорекодером:
Sub ВводТекста() ' ' ВводТекста Макрос ' ' Range("A2").Select ActiveCell.FormulaR1C1 = "Excel" Range("A3").Select End Sub
В VBA, любая строка , которая следует за ‘ (знак апострофа) не выполняется. Это комментарий, который предназначен только для информационных целей. Если вы удалите первые пять строк этого кода, макрос по-прежнему будет работать.
Теперь давайте пробежим по каждой строке кода и опишем что и зачем.
Код начинается с Sub, за которым следует имя макроса и пустые круглые скобки. Sub – сокращение для подпрограммы. Каждая подпрограмма (также называемая процедурой) в VBA начинается с Sub и заканчивается End Sub.
- Range(“A2”).Select – эта строка выбирает ячейку A2.
- ActiveCell.FormulaR1C1 = «Excel» – эта строка вводит текст “Excel” в активной ячейке. Поскольку мы выбрали ячейку A2 в качестве первого шага, она становится нашей активной ячейкой.
- Range(“A3”).Select – выбор ячейки A3. Это происходит, когда мы нажимаем клавишу Enter после ввода текста, результатом которого является выбор ячейки A3.
Надеюсь, что у вас есть некоторое базовое понимание того, как записывать макрос в Excel.
Обращаем внимание, что код, записанный через макрорекордер, как правило, не является эффективным и оптимизированным кодом. Макрорекордер часто добавляет дополнительные ненужные действия. Но это не значит, что не нужно пользоваться макрорекодером. Для тех, кто только изучает VBA , макрорекордер может быть отличным способом проанализировать и понять как все работает в VBA.
Используем объект FileSystemObject
В данном случае мы будем не просто получать названия файлов, но также определять тип файла, получать его размер и дату создания. Для этого нам потребуется использовать объект FileSystemObject. Он предоставляет нам сведения о файловой системе компьютера.
Однако, чтобы начать его использовать придется подключить одну библиотеку. Не пугайтесь, она есть на всех компьютерах с Windows, потому скачивать ничего не придется. Чтобы подключить ее необходимо:
- Открыть пункт меню Tools и выбрать пункт References.
- Выбрать ссылку на библиотеку Microsoft Scripting Runtime.
- Нажать Ок.
Теперь перейдем к коду. Он немного упростился:
'************************************************************** ' Sub : ExampleTwo ' Author : Алексей Желтов ' Date : 15.06.2020 ' Purpose : Вывод всех файлов в папке на лист '************************************************************** Sub ExampleTwo() Dim Sh As Worksheet Dim FSO As New FileSystemObject Dim FolderPath As String Dim MyFolder As Folder Dim iFile As File Dim i As Long Set Sh = ThisWorkbook.Sheets(2) FolderPath = Sh.Cells(3, 2) ' Проверка корректности введенных данных If Not FSO.FolderExists(FolderPath) Then MsgBox "Указанной папки не существует", 16, "Ошибка исходных данных" Exit Sub End If ' Удаляем содержимое Sh.Rows("7:" & Sh.Range("A7").End(xlDown).Row).Delete Shift:=xlUp Set MyFolder = FSO.GetFolder(FolderPath) i = 7 For Each iFile In MyFolder.Files Sh.Cells(i, 1) = i - 6 Sh.Cells(i, 2) = iFile.Name Sh.Cells(i, 3) = iFile.Type Sh.Cells(i, 4) = iFile.DateCreated Sh.Cells(i, 5) = iFile.Size i = i + 1 Next End Sub
Обратите внимание на переменные. Переменная FSO – это новый экземпляр объекта FileSystemObject. Тут мы его объявляем и сразу создаем. Директива New очень важна, многие тут допускают ошибку. Также создаем объекты MyFolder и iFile – это тоже объекты FileSystemObject
Dim Sh As Worksheet Dim FSO As New FileSystemObject ' объявляем и создаем новый экземпляр объекта Dim FolderPath As String Dim MyFolder As Folder Dim iFile As File Dim i As Long
Далее делаем проверку на существование папки. В данном случае нам не нужна дополнительная функция , мы пользуемся методом FolderExists объекта (класса) FileSystemObject.
Ну и остается аналогично перебрать все файлы в директории. Тут удобно использовать цикл For Each – Next.
For Each iFile In MyFolder.Files Sh.Cells(i, 1) = i - 6 Sh.Cells(i, 2) = iFile.Name ' название файла Sh.Cells(i, 3) = iFile.Type ' тип файла Sh.Cells(i, 4) = iFile.DateCreated ' дата создания Sh.Cells(i, 5) = iFile.Size ' размер i = i + 1 Next
Результат работы программы следующий:
Источники
- https://micro-solution.ru/excel/vba/get-files-in-folder
- https://vremya-ne-zhdet.ru/vba-excel/resheniye-zadaniya-1/
- https://vremya-ne-zhdet.ru/vba-excel/rabochiy-list-sozdaniye-kopirovaniye-udaleniye/
- https://exceltable.com/vba-macros/makros-kopirovanie-lista
- https://micro-solution.ru/excel/vba/first-macros