Excel vba метод move
На этом шаге мы рассмотрим метод Move объекта Selection .
Рассмотрим метод Move(Unit, Count) объекта Selection . Он позволяет перемещать курсор на определенное количество символов, слов, предложений или абзацев, в конец или начало документа, а также по ячейкам таблицы. Этот метод позволяет достичь начала или конца документа, если вызывать его неоднократно (до тех пор, пока возвращаемое им значение не равно 0). У метода есть два аргумента (таблица 1): первый определяет выполняемое действие, а второй - величину и направление перемещения курсора (при отрицательном значении курсор перемещается по направлению к началу текста).
Значение аргумента Unit | Выполняемое действие |
---|---|
WdCharacter=1 | Переход к следующему символу |
WdWord=2 | Переход к следующему слову |
WdSentence=3 | Переход к следующему предложению |
WdParagraph=4 | Переход к следующему абзацу |
WdSection=8 | Переход к следующему разделу |
WdStory=6 | Переход в следующую текстовую область документа |
WdCell=12 | Переход к следующей ячейки |
WdColumn=9 | Переход к следующему столбцу |
WdRow=10 | Переход к следующей строке |
WdTable=15 | Переход к следующей таблице |
WdLine=5 | Переход к следующей линии |
Если вызвать метод Move без аргументов, то по умолчанию его выполнение переместит курсор вперед по тексту на один символ.
Рассмотрим использование метода Move в синтаксисе языка Delphi . Создадим в форме кнопку и поместим в процедуру обработки ее нажатия следующий программный код.
Результат работы приложения изображен на рисунке 1:
Рис.1. Результат работы приложения
Приведем полный текст приложения:
Задавая разные значения первого аргумента (см. таблицу 1), можно проверить работу этого метода и на более сложных документах, содержащих таблицы, рисунки и т. п.
Описание
Перемещает указатель текущей записи в объекте Recordset.
Параметры
наборЗаписей
Объектная переменная, представляющая объект Recordset, в котором изменяется положение указателя текущей записи.
строки
Значение типа Long со знаком, указывающее число строк, на которое перемещается указатель текущей записи. Если значение аргумента строки больше 0, то осуществляется перемещение вперед (по направлению к концу файла). При отрицательных значениях аргумента строки осуществляется перемещение назад (по направлению к началу файла).
начало
Необязательный. Значение типа Variant (подтип String), определяющее закладку. Если задан аргумент начало, то перемещение начнется с записи, на которую указывает закладка. В противном случае метод Move начинает перемещение с текущей записи.
Замечания
Если значения аргументов метода Move задают перемещение указателя текущей записи в положение, находящееся перед первой записью набора, то указатель текущей записи будет помещен в начало файла. Если объект Recordset не содержит записей и свойство BOF объекта имеет значение True, то вызов данного метода для перемещения назад вызывает ошибку.
Если заданные значения аргументов метода Move должны вызвать перемещение указателя текущей записи в положение, находящееся после последней записи набора, то указатель текущей записи будет помещен в положение конца файла. Если объект Recordset не содержит записей и свойство EOF объекта имеет значение True, то вызов данного метода для перемещения вперед вызывает ошибку.
Ошибка выполнения возникает также при попытке вызова метода Move без допустимой закладки, в то время как любое из свойств BOF или EOF имеет значении True.
При вызове метода Move для объекта Recordset типа статического набора записей с последовательным доступом аргумент строки должен иметь положительное целое значение, а использование закладок не допускается. В этом случае перемещение может проводиться только по направлению к концу набора.
Для того чтобы сделать текущей первую, последнюю, следующую или предыдущую запись объекта Recordset, следует применить, соответственно, методы MoveFirst, MoveLast, MoveNext или MovePrevious.
Вызов метода Move с нулевым значением аргумента строки является удобным способом загрузки значений из базового источника данных в текущую запись. Это позволяет быть уверенным в том, что запись содержит последние данные из базовых таблиц. При этом также отменяются любые отложенные вызовы методов Edit или AddNew.
Пример
Следующая программа использует метод Move для помещения указателя текущей записи в позицию, заданную пользователем.
Создание новых рабочих листов осуществляется с помощью метода 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, который для создания диаграмм уже не подойдет.
Примеры создания листов
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 Before : = Worksheets ( Worksheets . Count )- Лист1 в After:=Лист1 — это уникальное имя листа, указанное в проводнике редактора VBA без скобок.
- Лист1 в After:=Worksheets(«Лист1») — это имя на ярлыке листа, указанное в проводнике редактора VBA в скобках.
Создаваемый лист можно присвоить объектной переменной:
Set myList = Workbooks ( "Книга1.xlsm" ) . Worksheets . AddЕсли создаваемый лист присваивается объектной переменной, он будет помещен перед активным листом. Указать дополнительные параметры невозможно.
Копирование листов
Копирование рабочих листов осуществляется с помощью метода Worksheet.Copy.
Синтаксис метода Worksheet.Copy
expression.Copy [Before, After]
где expression — переменная, представляющая собой объект Worksheet.
Компоненты метода Worksheet.Copy
- Before* — необязательный параметр типа данных Variant, указывающий на лист, перед которым будет добавлена копия.
- After* — необязательный параметр типа данных Variant, указывающий на лист, после которого будет добавлена копия.
*Если Before и After не указаны, Excel создаст новую книгу и поместит копию листа в нее. Если скопированный лист содержит код в проекте VBA (в модуле листа), он тоже будет перенесен в новую книгу.
Примеры копирования листов
Worksheets ( "Лист1" ) . Copy Before : = Worksheets ( "Лист2" ) Workbooks ( "Книга1.xlsm" ) . Worksheets ( "Лист1" ) . Copy _Если рабочие книги указаны как элементы коллекции Workbooks, в том числе ActiveWorkbook и ThisWorkbook, листы нужно указывать как элементы коллекции Worksheets, использование уникальных имен вызовет ошибку.
Перемещение листов
Перемещение рабочих листов осуществляется с помощью метода Worksheet.Move.
Синтаксис метода Worksheet.Move
expression.Move [Before, After]
где expression — переменная, представляющая собой объект Worksheet.
Компоненты метода Worksheet.Move
- Before* — необязательный параметр типа данных Variant, указывающий на лист, перед которым будет размещен перемещаемый лист.
- After* — необязательный параметр типа данных Variant, указывающий на лист, после которого будет размещен перемещаемый лист.
*Если Before и After не указаны, Excel создаст новую книгу и переместит лист в нее.
Примеры перемещения листов
Простые примеры перемещения листов:
Worksheets ( "Лист1" ) . Move Before : = Worksheets ( "Лист2" ) Workbooks ( "Книга1.xlsm" ) . Worksheets ( "Лист1" ) . Move _Если рабочие книги указаны как элементы коллекции Workbooks, в том числе ActiveWorkbook и ThisWorkbook, листы нужно указывать как элементы коллекции Worksheets, использование уникальных имен вызовет ошибку.
Перемещение листа «Лист4» в позицию перед листом, указанным как по порядковому номеру, так и по имени ярлыка:
x = InputBox ( "Введите имя или номер листа" , "Перемещение листа «Лист4»" )Удаление листов
Удаление рабочих листов осуществляется с помощью метода Worksheet.Delete
Синтаксис метода Worksheet.Delete
где expression — переменная, представляющая собой объект Worksheet.
Примеры удаления листов
Workbooks ( "Книга1.xlsm" ) . Worksheets ( "Лист1" ) . DeleteЕсли рабочие книги указаны как элементы коллекции Workbooks, в том числе ActiveWorkbook и ThisWorkbook, листы нужно указывать как элементы коллекции Worksheets, использование уникальных имен вызовет ошибку.
Как обратиться к рабочему листу, переименовать, скрыть или отобразить его с помощью кода VBA Excel, смотрите в этой статье.
Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.48 комментариев для “VBA Excel. Рабочий лист (создание, копирование, удаление)”
А как удалить листы не указывая постоянно их название?:
Если по крупному
нет Проверки наличия Листа в книге
нет Переименования Листа
Добрый день, Эдуард!
Я правильно понял вопрос: нужно, чтобы макрос при каждом запуске создавал копию листа и присваивал ему новое имя, отличное от имени по умолчанию? Если так, то по каким правилам должно создаваться новое имя?
Здравствуйте. Не могу найти макрос может кто поможет.
Задача состоит в том что бы макрос читал все листы книги после чего делал копию этих листов и вставлял в эти же листы данные как значения. Т.е. фактически разрывал связи методом копи паст но на всех листах книги (колличество листов в книге может быть каждый раз разное.
Добрый день!
У меня вопрос.
Как перемещать лист перед другим листом, номер или название которого будет вводить пользователь?
Привет, Артур!
Перемещение листа «Лист2» на позицию перед листом, имя ярлыка которого вводится в текстовое поле информационного окна InputBox:
Спасибо!
У меня ещё вопрос. А если указывать номер листа, перед которым будет другой лист, какое изменение будет в коде?
А так можно вводить и номер, и имя:
x = InputBox ( "Введите имя или номер листа" , "Перемещение листа «Лист2»" ) x = InputBox ( "Введите имя или номер листа" , "Перемещение листа «Лист2»" )Добрый день! Возможно ли полное копирование листа на нужный мне лист? В январе заполняются данные каждый день и надо чтобы за каждый день создавалась копия на заранее созданные 31 лист по дням?
. PasteSpecial Paste : = xlPasteFormulasAndNumberFormatsДобрый день, Эдуард!
Это можно сделать двумя строками, но перед копированием следует проверить, не был ли исходный лист сегодня уже сохранен под новым именем:
Спасибо за помощь! Нашел другое решение более мне подходящее но не знаю как сделать чтобы созданые листы вставлялись по порядку нумерации 1,2,3 и т.д. после активного листа? Не поможете вот код
destSht . Move After : = Worksheets ( Worksheets . Count )Спасибо все работает!
Еще вопрос, можно ли скопировать лист не в конец книги а между листами, есть 12 месяцев в книге ексель чтобы копировалось после января, февраля?
И может еще чтобы кнопка с макросом не копировалась а создавалась гипперссылка обратно на лист?
Sheets . Add . Name = InputBox ( "Ввести дату - від 1 до 31" ) destSht . Move After : = Worksheets ( Worksheets . Count )Я добавил код перемещения нового листа относительно исходного листа с именем текущего месяца и удаления ненужного нового листа, который создается при повторном вводе одного и того же числа:
Sheets . Add . Name = InputBox ( "Ввести дату - від 1 до 31" ) destSht . Move After : = Worksheets ( CStr ( CByte ( destSht . Name ) - 1 ) )Евгений огромное спасибо это то что и требовалось весьма признателен за Вашу помощь.
Эдуард, представленный выше код будет работать только с одним месяцем. Excel не даст создать в одной книге несколько листов с одним именем (одно и то же число, но разных месяцев). Вам придется как-то изменить наименование листов, например: 1.01-31.01, 1.02-28.02. Тогда для перемещения новых листов придется использовать другой алгоритм или по окончании одного месяца, все его листы переименовать, например так:
MsgBox "Такой номер уже используется - введите другой"Я понял этого и не требуется по окончанию месяца листы будут сохранены отдельно.
А вот по предедущему коду нельзя ввести произвольное число т.е не по порядку 1,2,3 а сразу например 17 пропустив с 1 по 16?
Помогите с мелочью никак не пойму куда вставить умножить на 2,1 и на 1,9 чтобы не считалось +_ 20% в этой формуле?
=ДВССЫЛ(АДРЕС(СТРОКА();СТОЛБЕЦ()-1;1;1))
Эдуард, может быть у вас для ячейки с формулой установлен формат «Процентный»?
Нет числовой. условное форматирование со стрелками вверх вниз и вправо
=ДВССЫЛ(АДРЕС(СТРОКА();СТОЛБЕЦ()-1;1;1*2,6)) для стрелки вверх
=ДВССЫЛ(АДРЕС(СТРОКА();СТОЛБЕЦ()-1;1;1*2,4)) для стрелки вправо
но не работает может я не туда вставляю *2,6
Синтаксис функции АДРЕС:
АДРЕС(номер_строки;номер_столбца;[тип_ссылки];[A1];[имя_листа])
Там, где вы умножаете, должно быть логическое значение [A1]: ИСТИНА или ЛОЖЬ (1 или 0).
удаляю Лист по имени на ярлычке
Евгений, помогите пожалуйста со следующей задачей.
В папке несколько документов эксель, в каждом из которых несколько листов.
Необходимо, чтобы макрос открывал по порядку каждый документ, проходил по каждому листу и брал оттуда нужную информацию. Затем эта информация переносится в новый документ эксель в заданном порядке.
В целом программу я реализовал, но столкнулся с проблемой, что debug упирается в последний лист первого открытого документа и не может дальше перейти к следующему документу. Т.е. необходимо прописать условие, чтобы vba понимал, что данный лист в документе последний.
Подскажите пожалуйста, как это сделать?
Цикл будет завершен после обработки последнего листа.
Здравствуйте!
Возможно ли при копировании листа из другого файла перенести и пользовательский стиль таблицы?
Добрый день!
Если не ошибаюсь, пользовательский стиль таблицы всегда копируется вместе с листом, но внешний вид таблиц будет одинаков, если оба файла созданы и открыты в одной версии Excel.
Спасибо за ответ.
Увы, не так, и даже всё не так.
Стиль «пытается» копироваться, цвета отличаются оттенками, но это полбеды. Главное, что нужно мне, чтобы копировался цвет шрифта таблицы, а этого не происходит. Почему-то на листе-цели устанавливается на весь лист чёрный шрифт, который Эксель считает главнее табличного.
И даже больше. После ручной замены на всё листе-цели шрифта с чёрного на авто замены цвета шрифта в импортированной таблице не происходит. Что всегда есть при ручной работе с таблицами.
Ну, и совсем глюк. Пользовательский стиль переезжает и доступен в новой книге. Но даже при ручном его выборе на листе-цели для таблицы не происходит смены цвета шрифта.
Цвет можно поменять только руками (макросом) без учёта таблицы.
Всё это происходит на одном компьютере в одной ОС В10.
Хм. Эксель 2016, всё выше описанное по-прежнему.
Если не затруднит, скопируйте умную таблицу макросом на новый лист, перед этим созданный тем же макросом.
Ссылка на объект коллекции - это название коллекции, после которого в скобках указывается индекс объекта или его имя в кавычках. Например, ссылка Workbooks (1) выбирает первую из открытых рабочих книг , а Workbooks ("budget") ссылается на рабочую книгу с именем "budget" .
- Количество элементов коллекции заранее не фиксируется.
- Новый элемент может быть добавлен в произвольное место коллекции.
- Элементы коллекции перенумеровываются при удалении или добавлении элементов в коллекцию.
- Различные коллекции объектов имеют общие методы и свойства, но параметры вызова методов могут различаться.
Объекты Workbooks и Workbook
Документ MS Excel ( рабочая книга ) это объект Workbook . Можно одновременно работать с несколькими рабочими книгами . Открытые рабочие книги составляют коллекцию рабочих книг - Workbooks .
Свойство Workbooks объекта Application возвращает объект Workbooks .
При открытии или создании рабочей книги элемент Workbook автоматически добавляется в конец коллекции Workbooks , а при закрытии книги соответствующий элемент также автоматически удаляется из коллекции.
ActiveWorkbook.Colors = Workbooks (" AIR .XLS").Colors заменяет палитру активной книги на палитру цветов книги AIR .XLS .
Параметр SaveChanges сохраняет или отменяет сделанные изменения. Параметр Filename задает название новой рабочей книги
Событийные процедуры
Событийные процедуры записываются на процедурном листе, связанном с объектом. Каждый объект имеет свои собственные события.
Чтобы вставить событийную процедуру для объекта Workbook
- выделите объект ThisWorkbook (Эта книга) в окне проекта;
- перейдите на лист процедур, нажав клавишу F7. Можно выполнить команду View Code или сделать двойной щелчок на объект ThisWorkbook ;
- на процедурном листе в окне выбора объектов (вверху слева) выберите объект Workbook ;
- в окне выбора событий (вверху справа) выберите событие. Автоматически вставляется процедура со стандартным именем, которое состоит из названия объекта и названия события, разделенных нижним подчеркиванием (_), например, для события Open событийная процедура имеет имя Workbook_Open ;
- запишите текст процедуры.
При вставке нового листа в рабочую книгу процедура запрашивает имя нового листа и вставляет лист в начало рабочей книги .
Значение параметра, являющееся ссылкой на объект - новый лист, передается процедуре во время ее выполнения. Метод Move перемещает вставленный лист. Параметр before этого метода определяет новое месторасположение листа - начало рабочей книги .
Объекты Sheets, WorkSheets и WorkSheet
Коллекция Sheets представляет собой совокупность листов различных типов - рабочих листов (коллекция Worksheets ) и листов диаграмм (коллекция Charts ). Таким образом, каждый элемент коллекции Sheets является элементом коллекции WorkSheets или коллекции Charts и наоборот, любой элемент коллекции WorkSheets или коллекции Charts принадлежит коллекции Sheets .
Методы
Метод Add
Добавляет новый лист в коллекцию Sheets , WorkSheets . При создании рабочей книги коллекция WorkSheets содержит столько рабочих листов , сколько определено свойством SheetsInNewWorkbook объекта Application .
- Метод Add для объектов Workbooks и Sheets имеет различный синтаксис.
Cинтаксис метода для коллекций Sheets , WorkSheets
- expression - выражение, возвращающее коллекцию WorkSheets или Sheets . Указание обязательно;
- Before 1 Возможно задание только одного из двух параметров Before или After - специфицирует лист, перед которым вставляется новый лист;
- After 2 Возможно задание только одного из двух параметров Before или After - специфицирует лист, после которого вставляется новый лист;
- Count - количество вставляемых листов;
- Type - тип вставляемого листа. Используются константы: xlWorksheet (по умолчанию), xlChart (только для объекта Sheets ), xlExcel4MacroSheet , xlExcel4IntlMacroSheet .
- При отсутствии всех параметров один рабочий лист добавляется перед активным листом.
- При задании параметров Before и After указывается ссылка на лист как индекс или имя в коллекции листов, например, Sheets (1) или Sheets ("Лист1")
Методы Move и Select
Метод Move используется для перемещения листов.
Синтаксис expression.Move([Before] [,After])
- expression - ссылка на объект, представляющий перемещаемый лист. Указание обязательно;
- необязательные параметры before и after (ссылки на лист, см. описание метода Add ) определяют новое местоположение перемещаемого листа. Если не указан ни один из параметров, то лист перемещается во вновь создаваемую рабочую книгу .
Метод Select выделяет объект. При применении к одному листу методы Activate и Select активизируют указанный лист. Но метод Select используется для группировки листов, т.е. для расширения выделения.
Синтаксис expression.Select([ Replace ])
- expression - ссылка на объект, представляющий выделяемый лист. Указание обязательно;
- Replace - для расширения выделения аргумент устанавливается в False . Если аргумент не задан или принимает значение True , то вместо старой области выделения создается новая область выделения. Необязательный параметр.
- Для выделения листов с конкретными именами используйте функцию Array . Например, Sheets (Array("Лист8", "Лист12")).Select .
Процедура перемещает нечетные листы в конец рабочей книги . В цикле выделяются нечетные листы.
Событийные процедуры
Чтобы вставить событийную процедуру для объекта WorkSheet :
- выделите объект WorkSheet (например, Лист1 ) в окне проекта;
- перейдите на лист процедур этого объекта;
- на процедурном листе в окне объектов (вверху слева) выберите объект WorkSheet ;
- в окне выбора событий (вверху справа) выберите событие;
- запишите текст процедуры.
При выборе события автоматически вставляется процедура со стандартным именем, которое состоит из названия листа и названия события, разделенных нижним подчеркиванием (_).
При активизации листа Лист1 в ячейку A1 заноситcя название листа.
Рис. 8.8. Пример работы с событийной процедурой объекта WorkSheet
Объект Range
При работе в MS Excel чаще всего выполняются некоторые действия с группой ячеек рабочего листа . Объект Range - это отдельная ячейка , целиком строка или столбец рабочего листа , выделенный интервал ячеек, непрерывный интервал ячеек или интервал несмежных ячеек.
Для задания объекта Range существуют различные возможности. Например, благодаря свойству ActiveCell , активная ячейка представляется в качестве объекта Range . Свойство Selection определяет выделенный интервал ячеек в качестве объекта Range .
Читайте также: