Как создать поиск значений в Excel функцией ВПР по нескольким листам

Как создать поиск значений в Excel функцией ВПР по нескольким листам?

VPR v neskolkih listah 1 Как создать поиск значений в Excel функцией ВПР по нескольким листам? Добрый день!

Сегодня я хочу расширить границы использования функции ВПР и научить вас использовать эту функцию, что бы произвести поиск значений в Excel по нескольким листам вашего рабочего файла.

Как вы знаете или еще не знаете, я напоминаю, в чистом виде функция ВПР производит поиск только в одной таблице, а о том, что бы чистыми возможностями функции произвести поиск необходимого значения в нескольких листиках, это невозможно. Но, тем не менее, при большой необходимости можно схитрить и произвести поиск по двум листам. Для этого используем возможности логической функции ЕСЛИ и формула поиска будет выглядеть приблизительно так:

=ВПР (C3 ;ЕСЛИ (ЕНД (ВПР (C3 ;Таблица2!C3:D7 ;2; 0)); Таблица3! C3:D7 ;Таблица2! C3:D7 );2; 0).

Но такой вариант работает только с 2 таблицами, а в случае, когда листов больше, нужно увеличивать количество вложений для функции ЕСЛИ. Но при этом:

  • во-первых, если много листов, то есть огромный шанс что длина формулы будет больше допустимого размера и перестанет работать;
  • во-вторых, это просто непрактично, так как при работе такой мега-формулы возникает значительно риск ошибок и при изменениях придётся переделывать формулу.

Но, как всегда, выход есть. Рассмотрим небольшую хитрость с помощью, которой и будем искать в нужных листах. Начнем работу с создания перечня листов нашей книги, где будем производить поиск значений. В нашем случае это диапазон $E$3:$E$7. VPR v neskolkih listah 2 Как создать поиск значений в Excel функцией ВПР по нескольким листам? Теперь для получения значения в столбик «Найденная стоимость» согласно условию в столбике «Номенклатуру которую ищем» нам нужна формула:

VPR v neskolkih listah 3 Как создать поиск значений в Excel функцией ВПР по нескольким листам?

Как видите, формула выделена фигурными скобками, это означает, что её необходимо вводить как формулу массива с помощью горячего сочетания клавиш Ctrl+Shift+Enter. Это самое главное условие правильной работы этой формулы в других случаях она не будет работать. Формула объемная и требует объяснения принципа её работы. Функция ДВССЫЛ необходима, что бы конвертировать текстовые отображения ссылок на листы нашей книги в действительные. Сам принцип работы функции ДВССЫЛ, я описывать не буду, рассмотрим только необходимую формулу для этапа нашего вычисления: СЧЁТЕСЛИ (ДВССЫЛ («'»&$E$3:$E$7 &»'! C1:C50″); A3).

Как следствие, при вычислении этого блока у нас формируется массив из некоторого количества значений, которые мы ищем, и которые повторяются на листах нашего списка, и имеет вид: СЧЁТЕСЛИ(<2;0;0;0>;A3). О работе функции СЧЁТЕСЛИ я писал отдельно и более подробно.

Следующим рассматриваемым блоком нашей композиции будет формула: ПОИСКПОЗ (ИСТИНА; СЧЁТЕСЛИ (ДВССЫЛ («'»&$E$3:$E$7 &»'! C1:C50″); A3)>0;0), которая и работает с указанным выше блоком такого вида: ПОИСКПОЗ (ИСТИНА; СЧЁТЕСЛИ (<2;0;0;0>; A3)>0;0). Вследствие чего мы узнаем, какую позицию занимает имя листа в нашем массиве списке листов $E$3:$E$7. Теперь же при помощи функции ИНДЕКС мы получаем название листа, и можем применить его имя в структуре функции ДВССЫЛ, а она передаст полученное значение уже далее функции ВПР. Пошагово это будет выглядеть так:

  1. =ВПР (A3; ДВССЫЛ («'»&ИНДЕКС (<"Таблица1"; « Таблица2»; « Таблица3»; «Таблица4»; «Таблица5»>;1) &»'! C:D»); 2;0);
  2. =ВПР(A2;ДВССЫЛ(«'Таблица1'! C:D»);2;0);
  3. =ВПР(A2;'Таблица1'!C:D;2;0).

Ну, вот мы и получили универсальную формулу, которая производит поиск значений в Excel и является очень гибкой и удобной. В случаях, когда возникнет необходимость добавить в рабочую книгу еще листы с таблицами, то необходимо всего на всего прописать их в списке рабочих листов $E$3:$E$7, изменив предварительно ее размер или попросту изначально сделать ее динамическим диапазоном, и править формулу будет не нужно.

Для большего удобства в столбике С, в графе «Где было найдено» можно прописать формулу которая будет наглядно показывать где была взята цифра, с какой таблицы вы получили значение, что значительно облегчает поисковую навигацию. Для получения названия таблицы необходима формула:

18 готовых макросов VBA Excel

В этом уроке я покажу Вам самые популярные макросы в VBA Excel, которые вы сможете использовать для оптимизации своей работы. VBA — это язык программирования, который может использоваться для расширения возможностей MS Excel и других приложений MS Office. Это чрезвычайно полезно для пользователей MS Excel, поскольку VBA может использоваться для автоматизации вашей работы и значительно увеличить Вашу эффективность. В этой статье Вы познакомитесь с VBA и я вам покажу некоторые из наиболее полезных, готовых к использованию примеров VBA. Вы сможете использовать эти примеры для создания собственных скриптов, соответствующих Вашим потребностям.

Вам не нужен опыт программирования, чтобы воспользоваться информаций из этой статьи, но вы должны иметь базовые знания Excel. Если вы еще учитесь работать с Excel, я бы рекомендовал Вам прочитать статью 20 формул Excel, которые вам нeобходимо выучить сейчас, чтобы узнать больше о функциональных возможностях Excel.

Я подготовил для вас несколько самых полезных примеров VBA Excel с большой функциональностью, которую вы сможете использовать для оптимизации своей работы. Чтобы их использовать, вам необходимо записать их в файл. Следующий параграф посвящен установке макроса Excel. Пропустите эту часть, если вы уже знакомы с этим.

Table of Contents

Как включить макросы в Excel

В Excel нажмите комбинацию клавиш alt + F11. Это приведет вас к редактору VBA в MS Excel. Затем щелкните правой кнопкой мыши папку Microsoft Excel Objects слева и выберите Insert => Module. Это место, где сохраняются макросы. Чтобы использовать макрос, вам нужно сохранить документ Excel как макрос. Из табуляции File => Save as, выберите Save as macro-enabled Workbok (расширение .xlsm) Теперь пришло время написать свой первый макрос!

1. Копирование данных из одного файла в другой.

Очень полезный макрос, поскольку он показывает, как скопировать ряд данных изнутри vba и как создать и назвать новую книгу. Вы можете изменить этот макрос в соответствии с вашими собственными требованиями:

2. Отображение скрытых строк

Иногда большие файлы Excel можно содержать скрытые строки для большей ясности И для лучшего удобства пользователей. Вот один макрос, который отобразит все строки из активной рабочей таблицы:

3. Удаление пустых строк и столбов

Пустые строки в Excel — может быть проблемой для обработки данных. Вот как избавиться от них:

4. Нахождение пустых ячеек

13. Создание сводной таблицы

14. Отправка активного файла по электронной почте

Мой любимый код VBA. Он позволяет вам прикреплять и отправлять файл, с которым вы работаете, с предопределенным адресом электронной почты, заголовком сообщения и телом сообщения! Сначала Вам нужно сделать референцию в Excel на Microsoft Outlook (в редакторе Excel VBA, нажмите tools => references и выберите Microsoft Outlook).

15. Вставка всех графиков Excel в презентацию PowerPoint

Очень удобный макрос, который позволяет вам добавлять все ваши графики Excel в презентацию Powerpoint одним щелчком мыши:

16. Вставка таблицы Excel в MS Word

Таблицы Excel обычно помещаются внутри текстовых документов. Вот один автоматический способ экспорта таблицы Excel в MS Word:

17. Извлечение слов из текста

Мы можем использовать формулы, если хотим извлечь определенное количество символов. Но что, если мы хотим извлечь только одно слово из предложения или диапазон слов в ячейке? Для этого мы можем сами создать функцию Excel с помощью VBA. Это одна из самых удобных функций VBA, поскольку она позволяет создавать собственные формулы, которые отсутствуют в MS Excel. Давайте продолжим и создадим две функции: findword() и findwordrev():

Отлично, мы уже создали две новые функции в Excel! Теперь попробуйте использовать их в Excel. Функция = FindWordRev (A1,1) берет последнее слово из ячейки A1. Функция = FindWord (A1,3) берет третье слово из ячейки A1 и т. Д.

18. Защита данных в MS Excel

Иногда мы хотим защитить данных нашего файла, чтобы только мы могли его изменять. Вот как это сделать с VBA:

Поздравления! Поскольку вы все еще читаете это, вы действительно заинтересованы в изучении VBA. Как вы уже сами видели, язык программирования VBA чрезвычайно полезен и может сэкономить нам много времени. Надеюсь, вы нашли эту информацию полезной и использовали ее, чтобы стать мастером MS Excel, VBA и компьютерных наук в целом.

VBA excel вставка листа в excel из другой книги excel

данный макрос может вставлять скажем содержимое текстового файла txt в активную ячейку.
а вот как сделать, чтобы он вставлял содержимое файла excel xlsx xls, таким методом в активную ячейку вставляется непонятный набор символов, а не само содержимое файла.
макрос с импортом данных не подходит, так как вставляется таблица, но имеет совсем другой вид нежели в файле.

Твой макрос работает только с текстовыми файлами
Для того, чтобы открыть в VBA книгу, воспользуйся методом Open объекта workbooks:

dim xlb as workbook
set xlb = workbooks.open(«путь к книге»)

‘ чтобы получить доступ к ячейке открытой книги
‘ В текущий лист, в ячейку A1 вставляется полученное значение
activesheet.range(«A1»).Value = xlb.worksheets(«имя листа»).Range(«адрес ячейки»).Value

‘ не забыть закрыть книгу после копирования значений
xlb.close
‘ не забыть прибить ссылку на объект
set xlb = nothing

‘ У объекта Range есть метод Copy (копировать в буфер)
‘ и метод PasteSpecial (вставить из буфера) — очень
‘ удобно при необходимости копирования больших объемов

Пишем макрос на VBA Excel по формированию документов

Реализовывать нашу задачу будем на примере «Электронной карточке сотрудника» (я это просто придумал:), хотя может такие и на самом деле есть), т.е. документ в котором хранится личные данные сотрудника вашего предприятия, в определенном виде, именно в Excel.

Примечание! Программировать будем в Excel 2010.

И для начала приведем исходные данные, т.е. сами данные и шаблон

Данные.

Скриншот 1

Лист, на котором расположены эти данные так и назовем «Данные»

Шаблон.

Скриншот 2

Лист, на котором расположен шаблон, тоже так и назовем «Шаблон»

Далее, нам необходимо присвоить имена полей для вставки, так более удобней к ним обращаться чем, например, по номеру ячейки.

Это делается очень просто, выделяете необходимую ячейку или диапазон, и жмете правой кнопкой мыши и выбираете «Присвоить имя», пишите имя ячейки и жмете «ОК»

Скриншот 3

Свои поля я назвал следующим образом:

  • ФИО – fio;
  • № — number;
  • Должность – dolgn;
  • Адрес проживания – addres;
  • Тел. № сотрудника – phone;
  • Комментарий – comment.

Как сделать массовый поиск и замену в документах MS Office (Word и Excel)?

Имеется большое количество документов Word или Excel и в каждом документе нужно изменить несколько фраз. В каждом документе через замену (Найти и заменить ) это слишком долго.

    Вариант с использованием макроса

a) для Microsoft Excel:
Скопировать макрос в папку с файлами, запустить макрос, задать условия замены, заключая их в кавычки. выбрать любой файл из папки.

Программа пройдётся по всем листам всех книг (*.xls;*.xlsx) в этой папке, и поменяет текст в заданной графе. Недостатком способа очевиден – замена производится только в указанной графе. Скачать макрос можно по ссылке

б) для Microsoft Word:
Создать новый документ Word , открыть редактор Microsoft VBA , добавить новый модуль, скопировать текст процедуры ниже. О том как создать макрос более подробно написано здесь. При выполнении макроса нужно выбрать файлы, данные в которых подлежат замене:

Что изменить и на что изменить прописывается в теле макроса:
что_заменить = «123»
чем_заменить = «1234»

Для документов Word подойдет @Text Replacer — бecплaтнaя пpoгpaммa для быcтpoгo пoиcкa и зaмeны тeкcтa в фaйлax из выбpaннoй пaпки и влoжeнныx пoдпaпoк. Работает с дoкумeнтaми тeкcтoвoгo peдaктopa Word: *.doc, *.docx, *.rtf , фaйлaми тeкcтoвoгo фopмaтa: *.txt, *.ini, *.html, *.php и дp., paбoтa c кoтopыми вoзмoжнa чepeз cтaндapтный Блoкнoт Windows . Вce фaйлы дpугиx типoв oбpaбaтывaютcя пpoгpaммoй кaк тeкcтoвыe.

Пpoгpaммoй пoддepживaeтcя пoиcк и зaмeнa мнoгocтpoчныx фpaгмeнтoв тeкcтa c учeтoм peгиcтpa и игнopиpуeмыx cимвoлoв — тaкиx кaк пpoбeлы и пepeвoды cтpoки (windows / *nix) . Программа бесплатная, скачать можно по ссылке с официального сайта программы

Не пробуйте @Text Replacer для документов Excel – программа их портит!

Для документов Excel попробуйте FireBall.exe – небольшую программу, не требующую установки. Файлы Excel необходимо скопировать в папку с FireBall.exe .

В ходе работы программа создает новые файлы, добавляя к названию приставку new . Скачать программу можно по ссылке

Именованные диапазоны облегчают понимание расчетов и еще больше упрощают работу.

Абсолютные ссылки выглядят довольно некрасиво и не очень понятно и наглядно. Поэтому можно сделать ваши расчёты намного чище и проще для понимания, заменив абсолютные ссылки именованными диапазонами. И никакие возможные изменения на вашем листе Excel не смогут их «испортить».

Копировать и переносить их также можно без проблем.

В приведенном выше примере с данными о сотрудниках вы можете назвать входную ячейку B2 «фамилия», а затем выделить все ячейки с информацией и назвать диапазон B5:F100 как «ДанныеСлужащего». Затем перепишите свою формулу в C2 следующим образом:

Сравните сами — насколько понятнее стал расчет из совета №12 по сравнению с №11.

Пример 6

Следующая подпрограмма демонстрирует, как обрабатывать ошибки с помощью операторов OnError и Resume.

Также в этом коде описывается, как открывать и читать данные с файла.

‘ Подпрограмма, для для установки определенных значений

‘ в ячейках A1 и B1 документа “Data.xls” на диске C:\

Sub Set_Values(Val1 As Double, Val2 As Double)

Dim DataWorkbook As Workbook

On Error GoTo ErrorHandling

‘ Открытие документа с данными

Set DataWorkbook = Workbooks.Open(“C:\Documents and Settings\Data”)

‘ Выбрать переменные Val1 and Val2 с данных в книге Excel

Val1 = Sheets(“Sheet1”).Cells(1, 1)

Val2 = Sheets(“Sheet1”).Cells(1, 2)

DataWorkbook.Close

ErrorHandling:

‘ Если файл не найден, предложить пользователю найти правильную директорию

‘ после чего продолжить выполнение подпрограммы

MsgBox “Data Workbook not found;” & _

“Please add the workbook to C:\Documents and Settings and click OK”

После детального ознакомления с этими примерами будет значительно легче применять свои навыки на практике.

В папке, в которой хранятся файлы, нажмите Ctrl + f, чтобы использовать окно поиска в папке. Затем выполните поиск

для поиска этой строки в файлах в текущем каталоге.

Используйте IceTeaReplacer . Это бесплатная программа.

Поиск & Замените файлы .docx, .xlsx и .xls

IceTeaReplacer — простой, но мощный инструмент для поиска внутри несколько Microsoft Office Word 2007 (docx), Excel 2007 (xlsx) и Файлы Excel 2003 (xls) в каталоге (и это подкаталоги) и заменить предоставленную фразу. Поддерживает UTF-8.

введите описание изображения здесь>> </p> <p> Существует также более мощная альтернатива с различными функциями, но она является коммерческой: <a href=ExcelPipe .

После поиска в Интернете, я обнаружил, что не существует универсального решения проблемы поиска нескольких таблиц Excel в Интернете, поэтому я решил написать свою собственную таблицу Excel, которая ищет другие таблицы Excel, которые можно найти здесь .

Обратите внимание, что он был протестирован только в Excel 2010, но он должен работать в 2007 году и более ранних версиях. Если нет, не стесняйтесь изменять код, как вы считаете нужным.

Электронная таблица использует пользовательскую форму и использует код VBA (который вы можете использовать для любых целей). Естественно, макросы и т. Д. Должны быть включены, чтобы это работало, и форма появляется при открытии электронной таблицы (вы можете получить доступ к коду, нажав Alt + F11, перейдя к пользовательской форме и дважды щелкнув кнопку «Начать поиск» в окна дизайна).

Полное описание функций и функций можно найти в файле чтения Github, но в основном это позволяет вам указать два условия текстового поиска для поиска в пределах указанного каталога (к которому вы можете перейти), он может искать рекурсивно этот каталог, и открытые электронные таблицы, защищенные паролем (если вы предоставляете пароль).

Он будет искать отдельные листы в каждой книге при поиске на уровне ячейки. В зависимости от размера рабочей книги для сканирования каждой книги может потребоваться примерно одна секунда.

Он отображает все результаты поиска в боковом окне, включая любые электронные таблицы, которые он не смог открыть. Эти результаты можно сохранить в текстовом файле для последующей справки.

Пользовательская форма должна быть относительно понятной, однако readme для нее на Github очень подробно описывает, как ее использовать. Опять же, свободный для использования, это с открытым исходным кодом.

В Excel 2003 у вас была опция дополнительного поиска в меню файла, где вы могли искать файлы. Я больше не могу найти этот вариант в 2007 году, поэтому я думаю, что он ушел.

Если у вас есть Vista или Windows 7, вы сможете использовать встроенный поиск окна. В более старых версиях вы можете установить поисковое приложение, например Поиск рабочего стола Windows , Google Desktop Search , Copernic , . они могут свободно использовать.

Метод Find объекта Range предназначен для поиска ячейки и сведений о ней в заданном диапазоне по ее значению, формуле и примечанию. Чаще всего этот метод используется для поиска в таблице ячейки по слову, части слова или фразе, входящей в ее значение.

Синтаксис метода Range.Find

Expression – это переменная или выражение, возвращающее объект Range, в котором будет осуществляться поиск.

В скобках перечислены параметры метода, среди них только What является обязательным.

Метод Range.Find возвращает объект Range, представляющий из себя первую ячейку, в которой найдена поисковая фраза (параметр What). Если совпадение не найдено, возвращается значение Nothing.

Параметры метода Range.Find

Наименование Описание
Обязательный параметр
What Данные для поиска, которые могут быть представлены строкой или другим типом данных Excel. Тип данных параметра – Variant.
Необязательные параметры
After Ячейка, после которой следует начать поиск.
LookIn Уточняет область поиска. Список констант xlFindLookIn:
  • xlValues (-4163) – значения;
  • xlComments (-4144) – примечания*;
  • xlNotes (-4144) – примечания*;
  • [xlFormulas (-4123) – формулы]**.
  • xlWhole (1) – полное совпадение;
  • xlPart (2) – частичное совпадение.
  • xlByRows (1) – поиск по строкам;
  • xlByColumns (2) – поиск по столбцам.
  • xlNext (1) – поиск вперед;
  • xlPrevious (2) – поиск назад.
  • False (0) – поиск без учета регистра (по умолчанию);
  • True (1) – поиск с учетом регистра.
  • False (0) – двухбайтовый символ может соответствовать однобайтовому символу;
  • True (1) – двухбайтовый символ должен соответствовать только двухбайтовому символу.

* Примечания имеют две константы с одним значением. Проверяется очень просто: MsgBox xlComments и MsgBox xlNotes .
** Тесты показали неработоспособность метода Range.Find с константой xlFormulas в моей версии VBA Excel.

В справке Microsoft тип данных всех параметров, кроме SearchDirection, указан как Variant.

Excel works!

menu

При открытии Excel у вас открывается файл под названием Personal.*? Что же это все-таки такое? Файл Personal хранит данные о предыдущих заходах в Excel. С помощью него очень удобно запомнить макрос или формат для всех книг.

Файл Personal

На самом деле он нужен для того, чтобы при каждом заходе не выполнять одни и те же действия по форматированию, большинство настроек по виду листа, макросы и т.д. можно сохранить в файле, который открывается первоначально. Для этого есть возможность сохранять книгу с персональными настройками первой книги — Personal.

Проблемы начинаются, когда у вас тормозит работа программы. Возможно, вы используете все настройки (зачастую лишние) из файла Personal и они замедляют работу системы. Как же управлять этим файлом?

Файл Personal. Где найти?

Давайте сперва разберемся, куда он сохраняется.

По умолчанию папки хранения хранятся:
Microsoft Office 2003

Microsoft Office 2007

Как удалить файл из персональной книги макросов?

Чтобы удалить этот файл, сначала сделайте доступным показ скрытых файлов, т.к. сразу вы не сможете его увидеть (он имеет свойство скрытый):

В левом верхнем углу пройдите в меню Упорядочить

Персонал2

Выбирайте Параметры папок — вкладка Вид — Показывать скрытые файлы

Персонал3

Теперь переходим в указанные выше папки и удаляем файл в папке AppData — все просто 😉

Запись макроса для всех книг с помощью Personal

Если вам нужно сохранить макрос при любом открытии Excel для любой книги, сохраните его в Personal.

К примеру, запишем макрос или создадим его макрорекордером. На тему как записать макрос есть отдельная статья. В открывшемся окне находите в поле Сохранить в: «Личная книга макросов» и нажимаете ОК. Личная книга макросов = файл Personal.

Персонал4

Теперь сохраняете файл в формате *.xlsm или *.xlsb . В указанных выше папках при каждом открытии будет сохраняться новый файл Personal

Почему при заходе в Excel открывается файл?

Открывающийся каждый раз файл, это и есть файл о котором идет речь в статье — Personal. Попробуйте удалить его по ссылкам для каждой из версии программ, указанным выше.

Excel цикл по листам книги excel

Excel цикл по листам книги excel thumbnail

Добрый день! А как сделать цикл по листам? То есть мне с каждого листа надо взять инфу одну и ту же. Но листов очень много. Я знаю что они идут по порядку. Но что за переменная для листа?

Например если на листе А1=В1 то копировать в главный лист (назовём его так) значение С1. и так пробежаться по каждому листу.

Сообщений: 495
Регистрация: 9 янв 2013

В макросе?
For each sh in workbook.sheets
if sh.name<>”название главного листа” then
… ‘копируете что надо
end
next

Сообщений: 335
Регистрация: 1 янв 1970

Ага в макросе
А как вытащить в переменную название листа? Так как название листа это фамилия то эта фамилия при копировании значения должна ставить рядом. То есть если мы копируем с С1 то фамилия ставится в D1

Сообщений: 495
Регистрация: 9 янв 2013

sheets(“название главного листа”).[D1] = sh.name

(это внутри цикла)

Сообщений: 335
Регистрация: 1 янв 1970

Dim sh As Sheets

For Each sh In Workbook.Sheets
If sh.Name <> “Сводная” Then
Range(“A1:AK37”).Select
Selection.Copy
Sheets(“Ñâîäíàÿ”).Select
Range(“L28”).Select
ActiveSheet.Paste
End If
Next
End Sub

сделал такой макрос который копирует всё в одно место что бы посмоотреть F8 как он вставляет попеременно всё, выдаёт ошибку Метод ор дата мембер нот фаунд и выделяет строку с IF. А если не прописывать Dim sh as shеet то выдаёт Object Required и выделяет первую строку For each…. И ещё к End приписал If так как выдаёт Next whithout For

Сообщений: 22920
Регистрация: 22 дек 2012

Option Explicit
Sub tt()

Dim sh As Object

For Each sh In ThisWorkbook.Sheets
If sh.Name <> “Сводная” Then
sh.Range(“A1:AK37”).Copy Sheets(“Сводная”).Range(“L28”)
End If
Next
End Sub

Сообщений: 335
Регистрация: 1 янв 1970

Спасибо а для чего прописывается Option Explicit?

для обязательного объявления переменных. Иначе программа ругаться будет, что какая-либо переменная у вас не объявлена.

Пример объявления переменных
Dim Stroka As String
Dim m As Long
Dim выручка As Single

Сообщений: 22920
Регистрация: 22 дек 2012

Сообщений: 5192
Регистрация: 16 янв 2013

Dim sh As Sheets

For Each sh In Workbook.Sheets
If sh.Name <> “Сводная” Then
Range(“A1:AK37”).Select
Selection.Copy
Sheets(“Ñâîäíàÿ”).Select
Range(“L28”).Select
ActiveSheet.Paste
End If
Next
End Sub

сделал такой макрос который копирует всё в одно место что бы посмоотреть F8 как он вставляет попеременно всё, выдаёт ошибку Метод ор дата мембер нот фаунд и выделяет строку с IF. А если не прописывать Dim sh as shеet то выдаёт Object Required и выделяет первую строку For each…. И ещё к End приписал If так как выдаёт Next whithout For

просто вы обявили не тот тип

sheets – это коллекция листов, а вам нужно тип элементов этой коллекции, но и тут может быть засада – объекта sheet не существует, а если использовать worksheet , то не все листы могут быть рабочими, встречаются меж ними и листы диаграмм, макросов и т.п. так что использование универсального обявления object в данном случае самое оно, но я к тому, что можно вообще не объявлять тип, тогда транслятор сам присвоит тип вариант, кот очень даже прокатит..

Сообщений: 335
Регистрация: 1 янв 1970

Что то не получается присвоить нужноой ячейке название листа, что не так?

Sub Макрос1()
Dim sh As Sheets
Columns(“A”).Insert
Sheets(“Сводный отчёт”).[A1] = sh.name

Сообщений: 22920
Регистрация: 22 дек 2012

1. Опять: Dim sh As Object
2. И где задано имя этого sh?

Sub Макрос1()
Columns(“A”).Insert
Sheets(“Сводный отчёт”).[A1] = ActiveSheet.Name
End Sub

31 май 2010 16:28:29

Постановка задачи

Допустим, что у нас есть книга с большим количеством листов, где на каждом листе находится таблица с данными по сделкам в этом городе:

Исходный файл

Давайте будем исходить из следующих соображений:

  • Структура и столбцов на всех листах одинаковая.
  • Количество строк на всех листах разное.
  • Листы могут в будущем добавляться или удаляться.

Наша задача – собрать все данные со всех листов в одну таблицу, чтобы потом с ней работать (фильтровать, сортировать, построить сводную и т.д.) Сделать это можно разными способами, но самыми удобными будут, пожалуй, Power Query и макросы.

Способ 1. Сборка данных с листов с помощью Power Query

Если вы ещё не сталкивались в своей работе с Power Query, то очень советую копнуть в этом направлении. Использование этой бесплатной и уже встроенной по умолчанию в Excel надстройки, способно полностью перевернуть весь ваш процесс сбора и анализа данных, упростив всё в разы. С задачей сбора данных с листов Power Query справляется весьма успешно.

Шаг 1. Подключаемся к файлу

Для начала, создадим новый пустой файл в Excel, куда и будут собираться данные.

Если у вас Excel 2010-2013 и вы установили Power Query как отдельную надстройку, то откройте вкладку Power Query, если у вас Excel 2016 или новее, то вкладку Данные (Data). Нажмите кнопку Получить данные / Создать запрос – Из файла – Книга Excel (Get Data / New Query – From file – From Excel) и укажите наш файл с исходными листами:

Указываем файл

В появившемся окне Навигатора (Navigator) выберите слева любой лист и нажмите в правом нижнем углу кнопку Преобразовать данные (Transform Data) или Изменить (Edit):

Выбираем любой лист

Должно появиться окно редактора запросов Power Query, где отобразятся данные с выбранного листа. Поскольку нам нужен, на самом деле, не один лист, а все, то удалим в правой панели все шаги, кроме первого шага Источник (Source) используя крестик слева от названия шага:

Удаляем лишние шаги

То, что останется после удаления шагов – это список всех объектов, которые Power Query “видит” во внешних файлах, а это:

  • листы (Sheet)
  • “умные таблицы” (Table)
  • именованные диапазоны (Defined Name)
  • области печати (Print Area), которые, по сути, являются одним из видов именованного диапазона

Шаг 2. Отбираем нужные листы

В исходном файле может быть много всего лишнего, что нам не требуется собирать: случайные ненужные листы, служебные именованные диапазоны, побочные умные таблицы и т.п. Очень важно отфильтровать этот “информационный мусор”, т.к. в будущем из-за любого подобного объекта наш запорс будет, скорее всего, вылетать с ошибкой или некорректно собирать данные. Для решения этой задачи можно использовать несколько подходов.

Во-первых, легко можно отфильтровать нужные объекты по типу по столбцу Kind. Например, если вам нужны только листы:

Фильтруем листы

Во-вторых, если нам нужны только видимые листы, то дополнительно можно отфильтровать ещё по столбцу Hidden.

В-третьих, если вы точно знаете размер таблиц, которые вам нужны, то можно легко добавить к нашему списку вычисляемый столбец с формулой, выводящей количество столбцов или строк и использовать потом эти числа для отбора. Для этого выберем на вкладке Добавление столбца – Настраиваемый столбец (Add Column – Custom Column) и введём в открывшееся окно следующую формулу (с учётом регистра):

Подсчет числа столбцов

Для подсчёта количества строк можно использовать аналогичную функцию Table.RowCount. Получившийся столбец затем можно использовать для фильтрации “мусорных” таблиц.

В-четвёртых, можно извлечь с каждого листа содержимое любой ячейки (например, А1) и использовать его для отбора. Например, если там нет слова “Товар“, то это не наш лист. Для извлечения нужно будет также добавить вычисляемый столбец с такой конструкцией:

  • [Data] – имя столбца, где в каждой ячейке лежат таблицы с содержимым каждого листа (убийственная формулировка для рядового пользователя Excel, да, я знаю)
  • [Column1] – имя столбца на листе, из которого мы хотим извлечь данные
  • – номер строки (считая с нуля), откуда мы хотим взять данные

Извлекаем содержимое А1 с каждого листа

После фильтрации “мусора” все добавленные вспомогательные столбцы можно, конечно же, спокойно удалить, оставив только колонки Name и Data.

Шаг 3. Разворачиваем таблицы

Теперь развернём содержимое таблиц в одно целое, используя кнопку с двойными стрелками в заголовке столбца Data, отключив флажок Использовать исходное имя столбца как префикс (Use original column name as prefix):

Разворачиваем вложенные таблицы

После нажатия на ОК Power Query соберёт для нас все данные в одну мегатаблицу со всех отобранных листов нашего файла:

Собранные данные

Останется лишь “навести блеск”, а именно:

  1. Поднять первую строку в шапку таблицы кнопкой Использовать первую строку в качестве заголовков (Use first row as headers) на вкладке Главная (Home).
  2. Переименовать первый столбец в Город двойным щелчком на заголовку.
  3. Удалить повторяющиеся шапки таблиц, попавшие в одну кучу вместе с данными, используя фильтр по столбцу Товар.

Всё. Осталось только дать нашему запросу подходящее имя (например, Сборка) в панели справа и выгрузить затем собранные данные обратно в Excel кнопкой Закрыть и загрузить на вкладке Главная (Home – Close & Load):

Собранные данные

В будущем, при любых изменениях в исходном файле достаточно будет лишь обновить наш запрос, щелкнув по собранной таблице правой кнопкой мыши и выбрав команду Обновить (Refresh) или такой же кнопкой на вкладке Данные (Data) или сочетанием клавиш Ctrl+Alt+F5.

Плюсы такого подхода:

  • Не нужно уметь программировать, всё делается быстро и почти без использования клавиатуры.
  • Последовательность столбцов на разных листах может быть различной – это не играет роли, столбцы правильно встанут друг под друга в итоговой сборке.
  • Можно быстро обновлять запрос при изменении исходных данных.

Минусы этого способа:

  • Собираются только значения, т.е. формулы с исходных листов не сохраняются.
  • Названия столбцов должны на всех листах совпадать с точностью до регистра.
  • Нельзя выбрать какой именно диапазон берётся с каждого листа – это определяется автоматически (берётся всё, что есть).
  • Для обновления нужен Excel 2016 или новее или установленная надстройка Power Query.

Способ 2. Сборка данных с листов макросом на VBA

Похожего результата можно добиться и с помощью более “классического” подохода – макросом на VBA. Для этого на вкладке Разработчик (Developer) нажмите кнпоку Visual Basic или воспользуйтесь сочетанием клавиш Alt+F11. В открывшемся окне добавьте новый модуль через меню Insert – Module и скопируйте туда текст вот такого макроса:

Sub CollectDataFromAllSheets()
Dim ws As Worksheet

Set wbCurrent = ActiveWorkbook
Workbooks.Add
Set wbReport = ActiveWorkbook

‘копируем на итоговый лист шапку таблицы из первого листа
wbCurrent.Worksheets(1).Range(“A1:D1”).Copy Destination:=wbReport.Worksheets(1).Range(“A1”)

‘проходим в цикле по всем листам исходного файла
For Each ws In wbCurrent.Worksheets

‘определяем номер последней строки на текущем листе и на листе сборки
n = wbReport.Worksheets(1).Range(“A1”).CurrentRegion.Rows.Count

‘задаем исходный диапазон, который надо скопировать с каждого листа – любой вариант на выбор:
Set rngData = ws.Range(“A1:D5”) ‘фиксированный диапазон или
Set rngData = ws.UsedRange ‘всё, что есть на листе или
Set rngData = ws.Range(“F5”).CurrentRegion ‘область, начиная от ячейки F5 или
Set rngData = ws.Range(“A2”, ws.Range(“A2”).SpecialCells(xlCellTypeLastCell)) ‘от А2 и до конца листа

‘копируем исходный диапазон и вставляем в итоговую книгу со следующей строки
rngData.Copy Destination:=wbReport.Worksheets(1).Cells(n + 1, 1)

Next ws
End Sub

Запустить созданный макрос можно на вкладке Разработчик кнопкой Макросы (Developer – Macros) или с помощью сочетания клавиш Alt+F8. Макрос автоматически создаст новую книгу и скопирует туда нужные вам данные.

Плюсы такого подхода:

  • Формулы с исходных листов сохраняются в сборке.
  • Имена столбцов не играют роли.
  • Макрос будет работать в любой версии Excel.
  • Можно выбирать, что именно брать с каждого листа (конкретный фиксированный диапазон или весь лист).

Минусы этого способа:

  • Последовательность столбцов на всех листах должна быть одинаковой, т.к. происходит, по сути, тупое копирование таблиц друг-под-друга.
  • Защита от макросов должна быть отключена.
  • Быстрого обновления, как это было с Power Query, здесь, к сожалению, не будет. При изменении исходных данных придётся запустить макрос повторно.

Способ 3. Готовый макрос из надстройки PLEX

Если лень возиться с макросами или Power Query, то можно пойти по пути наименьшего сопротивления – использовать готовый макрос (кнопка Собрать) из моей надстройки PLEX для Excel. Это, может, и не спортивно, но зато эффективно:

Сборка данных с листов через PLEX

В общем, выбирайте любой удобный вам вариант и действуйте. Выбор – это всегда хорошо.

Макрос для поиска ближайшего значения заданному на всех листах книги Excel

Как добавить новую книгу?

Добавить новую пустую книгу:

Delphi:

В первом параметре метода Add можно указать стандартный тип шаблона Excel. Если же в нем указать имя (с полным путем) подготовленного файла (шаблоном может быть и «обычный» файл XLS, а не только файл XLT), то можно открыть книгу на диске как шаблон.

Delphi:

Откроет файл «MyTemplate1.xls», т.е. точно как обычный шаблон «Книга1.xls», но свой со своим форматированием, что позволит ускорить процесс экспорта данных в Excel, т.к. не придется форматировать ячейки и вызывать другие настройки листа.

Как задать количество листов в новой книге?

Задать количество листов в новой книге можно перед добавлением новой книги:

Delphi:

Как открыть книгу, имеющуюся на диске?

Если книга находится не в папке, указанной в Excel.Application.DefaultFilePath, то нужно указывать полный путь к открываемому файлу .xls, даже если файл находится в текущей папке вашего приложения, т.к. Excel ничего про него не знает.

Delphi:

Как сохранить книгу?

Как закрыть книгу без вопросов о сохранении? Как закрыть все книги?

Delphi:

Как узнать имена всех открытых книг?

Узнать имена всех книг экземпляра Excel.Application можно в цикле, например, так:

Delphi:

Как найти определенную открытую книгу?

Точно так же, как в предыдущем ответе — по имени в свойстве Name. Если вы хотите сделать найденную книгу активной, то вызовите метод Activate

Как переименовать книгу?

Переименовать книгу никак нельзя — только сохранить под другим именем методом SaveAs (смотрите «Как сохранить книгу»).

Как спрятать книгу?

Delphi:

Как открыть текстовый файл в Excel’е?

Практически, так же как и обычную книгу, только внимательно указав дополнительные параметры в методе OpenText.

Как узнать имена всех листов в книге и их количество?

Узнать количество листов в книге можно в цикле по коллекции Workbook.Sheets. Количество листов — свойство Sheets.Count. Имя листа — свойство Worksheet.Name.

Как получить ссылку на активный лист в активной книге?

Обращаеясь к Excel.Application.ActiveSheet или WorkBook.ActiveSheet, вы получите ссылку на интерфейс IDispatch. Это происходит из-за того, что коллекция Excel.Application.Sheets может содержать объекты WorkSheet, Chart, Excel4MacroSheet (для поддержки Excel 4).

Delphi:

Определить тип листа можно, проверив свойство Worksheet.Type:

Delphi:

Как добавить новый лист в книгу? Как удалить лист?

При добавлении можно указать тип нового листа (WorkSheet, Chart, Excel4MacroSheet) и текущее положение. Добавленный лист будет активизирован автоматически (на него будет указывать свойство ActiveSheet)

Нужно ли делать лист активным, чтобы записать в него данные?

Не нужно — переключение (активация) листов только замедлит экспорт данных. Получите ссылку на любой лист в книге (активной или нет) и работайте c ней, как с активной. Активизировать лист нужно только в случае необходимости, например, при вставке из буфера обмена, предварительном просмотре и др.

Как задать имя листу в книге?

Как выделить один или несколько листов в книге?

Delphi:

Как скопировать/переместить лист в одной книге? В другую книгу?

Delphi:

Как задать/убрать область печати? Как вызвать PrintPreview? Как напечатать лист?

Delphi:

Как установить параметры печати: отступы на листе, ориентацию листа и др.?

Установка параметров печати — довольно продолжительный процесс, поэтому советую настроить их в предварительно подготовленном шаблоне. Все параметры печати задаются в свойстве PageSetup объекта Worksheet. Но учтите, что текст в свойствах Footer или Header для Left, Right, Center суммарно не должен превышать 255 символов.

Для задания отступов в сантиметрах используйте функцию Excel.Application.CentimetersToPoints

Delphi:

Если вы выполните данный код, то заметите, как долго Excel настраивает все границы печати.

Как установить свои разрывы страниц (HPageBreaks) в области печати? Как узнать номер строки HpagePreak?

Для того, чтобы «появились» автоматические разрывы страниц, нужно перейти в режим разметки.

Delphi:

Также вы можете «переместить» разрыв, присвоив новое значение свойству Location объекта HPageBreak

Delphi:

Как сделать так, чтобы на каждой странице повторялись заголовки колонок таблицы?

Нужно задать «сквозные» строки заголовка таблицы.

Delphi:

Как спрятать рабочий лист?

Delphi:

Как установить пароль на существующий лист/книгу?

Как создать макрос из Delphi? Как выполнить макрос, имеющийся в книге?

Вам не удастся создать макрос программно, т.к. по умолчанию в Excel VBA Project отключен доступ к VBA из программ. Как включить эту возможность, читайте «PRB: Programmatic Access to Office XP VBA Project Is Denied»

Пример создания макроса с параметром и вызов его из программы:

Delphi:

Если все же вам очень нужно добавить макрос, независимо от настроек доступа к VBA Project, то можно воспользоваться листом макросов xlExcel4MacroSheet. Макроязык представляет собой «команды».

Delphi:

Будет ли работать макрос при выставленной «Очень высокая безопасность макросов» в Excel’е пользователя?

Записанные макросы в книге, открытой вашей программой всегда будут работать, независимо от выставленного в Excel’е «Уровня безопасности» для макросов.

Почему не работает макрос, записанный в книге?

Записанный в книге макрос может не работать по причине установленного антивируса. Например, установленный «Kaspersky Office Guard», входящий в состав «Антивирус Касперского», начисто отключает все вызовы VBA.

Excel. Создание указателя листов в книге

Один посетитель сайта (Валерий) недавно спросил: «Есть ли инструмент поиска листа в книге по его названию». Возможное решение – просто выбрать лист из списка (рис. 1). Для этого кликните правой кнопкой мыши в левом нижнем углу экрана на одной из кнопок прокрутки.

Рис. 1. Выбор листа из списка

Рис. 1. Выбор листа из списка

Скачать заметку в формате Word или pdf, примеры в формате Excel2013 (с макросами)

Однако, если у вас десятки (а то и сотни) листов, а также, если вы хотите найти лист с определенным названием, такой метод вряд ли будет хорош. Создайте отдельную страницу в книге, на которой разместите указатель, связав гиперссылкой каждую строку с соответствующим листом. Вы сможете создать фильтр или находить листы контекстным поиском. Указатель можно создать двумя способами. [1]

Возможно, вам покажется привлекательной идея создать указатель вручную. Создайте новый лист, назовите его Указатель или подобным именем, введите имена всех остальных листов и свяжите записи гиперссылками с соответствующими листами, пройдя по меню ВставкаГиперссылка (рис. 2) или нажав сочетание клавиш Ctrl+K (К английское). Этот способ подойдет для книг с небольшим числом листов, которые будут меняться нечасто. Но даже в этом случае может быть затруднительно поддерживать актуальность указателя.

Рис. 2. Можно создать указатель вручную с помощью гиперссылок

Рис. 2. Можно создать указатель вручную с помощью гиперссылок

Более универсальный, но и более сложный путь – добавить код VBA. В этом случае указатель будет создаваться заново каждый раз при переходе на лист с указателем (к сожалению, это может замедлять работу, если листов много).

1. Сохраните вашу книгу как файл с поддержкой макросов (рис. 3)

Рис. 3. Книга Excel с поддержкой макросов

Рис. 3. Книга Excel с поддержкой макросов

2. Вставьте в вашу книгу новый лист и назовите его удобным именем — например, Указатель.

3. Правой кнопкой мыши щелкните ярлычок листа и в контекстном меню выберите команду Исходный текст (рис. 4).

Рис. 4. Исходный текст

Рис. 4. Исходный текст

4. В открывшемся окне введите код VВА (рис. 5). Во избежания ошибок, рекомендую код скопировать из модуля в файле Excel.

Private Sub Worksheet_Activate()

Dim wSheet As Worksheet

.Cells(l, 1) = » INDEX «

.Cells(l, 1).Name = » INDEX «

For Each wSheet In Worksheets

If wSheet.Name <> Me.Name Then

.Range( » A1 » ).Name = » Start » & wSheet.Index

.Hyperlinks.Add Anchor:=.Range( » A1 » ), Address:= » » , SubAddress:= _

» Index » , TextToDisplay:= » Назад к указателю «

Me.Hyperlinks.Add Anchor:=Me.Cells(l, 1), Address:= » » , _

SubAddress:= » Start » & wSheet.Index, TextToDisplay:=wSheet.Name

Рис. 5. Код VBA

5. Нажмите Alt+Q, чтобы вернуться обратно к рабочей книге, и сохраните изменения. Не пугайтесь, что на листе Указатель ничего не произошло, и что вы не увидите ни одного макроса, если пройдете по меню ВидМакросы. Код устроен таким образом, что его нельзя запустить никаким образом, кроме как перейдя на лист Указатель. Поэтому перейдите на любой лист, а затем вернитесь на лист Указатель. Наблюдайте, как работает макрос!

Обратите внимание, что ячейкам А1 на каждом листе присваивается имя Start#, где # – уникальное целое число, представляющее номер листа в указателе. Это гарантирует, что у ячейки А1 каждого листа будет уникальное имя. Если у ячейки А1 на вашем листе уже есть имя, необходимо каждое упоминание ячейки А1 в коде изменить на что-то более подходящее — например, любую неиспользуемую ячейку листа. Увидеть образовавшийся список имен можно, пройдя по меню ФормулыДиспетчер имен (рис. 6).

Рис. 6. Диспетчер имен

Рис. 6. Диспетчер имен

Дополнение от 23 сентября 2016 г.

Еще один способ создания указателя использует макрофункцию в именованной формуле (подробнее см. Функция Получить.Ячейку). [2] Откройте книгу, в которой много рабочих листов и/или листов с диаграммами, и выполните следующее:

  1. Вставьте новый лист, на котором будет находиться список (назовите его, например, Указатель).
  2. Выполните команду Формулы –> Присвоитьимя, чтобы открыть диалоговое окно Созданиеимени.
  3. Впишите в поле Имя название Список.
  4. Введите следующую формулу в поле Диапазон (рис. 7): =ЗАМЕНИТЬ(ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1);1;НАЙТИ(«]»;ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1));»»)
  5. Нажмите ОК, чтобы закрыть диалоговое окно Создание имени.

%d1%80%d0%b8%d1%81-7-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b8%d0%bc%d0%b5%d0%bd%d0%b8-%d0%b4%d0%bb%d1%8f-%d0%b8%d0%bc%d0%b5%d0%bd%d0%be%d0%b2%d0%b0%d0%bd%d0%bd%d0%be%d0%b9-%d1%84

Рис. 7. Создание имени для именованной формулы

Обратите внимание: в формуле используется функция ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ, которая не относится к числу стандартных функций рабочего листа. Это макрофункция, написанная в сравнительно старом XLM-стиле и предназначенная для применения на специальном листе макросов. При использовании аргумента 1 она возвращает массив имен листов, причем перед именем каждого листа указано название книги, откуда он взят. Функции ЗАМЕНИТЬ и НАЙТИ удаляют имя книги, сопутствующее названию листа.

Чтобы сгенерировать имена листов, введите в ячейку А1 следующую формулу, а затем скопируйте ее ниже по столбцу: =ИНДЕКС(Слисок;СТРОКА()). На рис. 8 приведена данная формула для диапазона А1:А24. В книге 21 лист, поэтому формула возвращает ошибку #ССЫЛКА! при попытке отобразить имя несуществующего листа. Чтобы избежать этого, измените формулу следующим образом: =ЕСЛИОШИБКА(ИНДЕКС(Список;СТРОКА()));»»)

%d1%80%d0%b8%d1%81-8-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%80%d0%bc%d1%83%d0%bb%d1%8b-%d0%b4%d0%bb%d1%8f-%d0%be%d1%82%d0%be%d0%b1%d1%80%d0%b0

Рис. 8. Использование формулы для отображения списка имен листов

Список названий листов можно откорректировать, если вы переименовываете, добавляете или удаляете листы, но это не происходит автоматически. Чтобы принудительно обновить формулы, нажмите Ctrl+Alt+F9. Если вы хотите, чтобы имена листов обновлялись автоматически, измените формулу, чтобы сделать ее меняющейся: =ЗАМЕНИТЬ(ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1);1;НАЙТИ(«]»; ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1));»»)&Т(ТДАТА()). Функия Т проверяет, является ли значение текстовым, и возвращает сам текст, если да, либо две кавычки «» (пустой текст), если нет.

Зачем может понадобиться список названий листов? На рис. 9 показано оглавление, созданное как указано выше, а таже ссылки на ячейку А1 соответствующего листа. Например, в ячейке В2 записана формула =ГИПЕРССЫЛКА(«#»&A2&»!A1″;»Перейти по ссылке»). Щелкнув на гиперссылке, вы активизируете лист и выделяете ячейку А1. К сожалению, Excel не поддерживает гиперссылки, ведущие на лист с диаграммами, поэтому при попытке сослаться на такой лист программа выдаст ошибку.

Если вы пользуетесь такими приемами, то книгу нужно сохранить как файл с поддержкой макросов (в формате *.xlsm).

%d1%80%d0%b8%d1%81-9-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d1%81%d0%bf%d0%b8%d1%81%d0%ba%d0%b0-%d0%b3%d0%b8%d0%bf%d0%b5%d1%80%d1%81%d1%81%d1%8b%d0%bb%d0%be%d0%ba

Рис. 9. Создание списка гиперссылок

[1] По материалам книги Р.Холи, Д.Холи. Excel. Трюки, стр. 38–40

[2] По материалам книги Джон Уокенбах. Excel 2013. Трюки и советы. – СПб.: Питер, 2014. – С. 46–48.

Сравнение таблиц в Excel с помощью макросов VBA

В предыдущей статье Сравнение таблиц в Excel мы рассмотрели подход к сравнению сложных таблиц с использованием формул и без программирования.

В данной статье рассмотрим способ сравнения таблиц Excel с помощью VBA макросов на примере тех же исходных данных.

Проиллюстрируем задачу картинкой из первой статьи.

задача сравнения двух таблиц в Excel

Для начала напишем алгоритм наших действий по сравнению таблиц.

  1. Определим диапазоны данных первой и второй таблицы, то есть найдем последние значимые строки и сохраним их номера в переменных (последняя строка таблицы 1 — last_i и последняя строка таблицы 2 — last_j).
  2. Начнем проходить по каждой строке таблицы 2 (внешний цикл), данные из которой нужно перенести в таблицу 1. С первой строки данных (в примере это строка 3) до последней строки таблицы 2.
  3. Для каждой строки таблицы 2 определим идентификатор строки, путем формирования строки, содержащей полный адрес квартиры (значения из нескольких колонок, разделенные дефисами).
  4. Начнем проходить по каждой строке таблицы 1 (внутренний цикл) с первой строки данных (в примере это строка 3) до последней строки таблицы 1, определяя при этом идентификатор строки.
  5. Сравним значения идентификаторов строк таблицы 1 и таблицы 2.
  6. Если идентификаторы равны, перепишем ФИО покупателя из ячейки таблицы 2 в соответствующую ячейку таблицы 1; прервем внутренний цикл по таблице 1 и перейдем к следующей строке таблицы 2 (переход к п.2).

Теперь остается реализовать алгоритм в виде программного кода макроса.

Для этого откроем вкладку Вид ленты функций Excel. Щелкнем на нижнюю часть со стрелкой кнопки Макросы. В открывшемся подменю выберем Запись макроса. В результате начнется запись нового макроса. Поскольку код мы будем формировать вручную, то еще раз зайдем в подменю макросов и выберем Остановить запись. Далее еще раз войдем в подменю макросов и выберем Макросы.

В появившемся диалоге выделим наш макрос и нажмем Изменить.

На экране откроется окно редактора макросов Visual Basic for Applications. В области кода (правая верхняя область) отображается код только что созданного пустого макроса.

Редактор макросов Visual Basic For Applications

В процедуру Макрос1 (между объявлениями начала и конца процедуры: Sub и End Sub) необходимо вставить код, решающий поставленную задачу. Образец кода представлен ниже.

Результат решения задачи:
результат сравнения таблиц в Excel

Что я предлагаю

Для тех, кто спешит, сразу сообщаю, что, если тема актуальна, то я предлагаю вам воспользоваться своей пользовательской функцией рабочего листа, которая называется FS_GetClosestWord и имеет 2 обязательных параметра и 4 необязательных.

Формат вызова: = FS_GetClosestWord ( What ; Where ; [NumItem] ; [MinLen] ; [Compare] ; [Dbg] ) , где:

What — ссылка на ячейку, которая содержит искомую строку. Обратите внимание, что текстовая константа в формуле не будет воспринята, только ссылка на ячейку;

Where — ссылка на диапазон, содержащий словарь, в котором необходимо подобрать наиболее близкое к What слово. Словарь может быть в виде столбца, строки или состоять из произвольного размера диапазона. Имейте только в виду, что, задав словарь из большого количества слов (скажем больше 10000), или, если словарь содержит много очень длинных слов, то вы рискуете надолго подвесить систему;

[ NumItem ] — в процессе поиска строится коллекция наиболее подходящих слов, которые ранжируются по определенному алгоритму. NumItem определяет номер возвращаемого слова из этой коллеции. NumItem=1 возвращает наиболее близкое по мнению используемого алгоритма слово. Если указанный номер слишком велик и результирующая коллекция не содержит такого числа элементов, то возвращается ошибка #Н/Д;

[ MinLen ] — минимальная длинна буквенных комбинаций, на которые разбиваются слова из словаря и, которые потом ищутся в слове из What. Не может быть меньше 3. Если укажете меньше 3 или не укажете вовсе, то будет использовано значение 3;

[ Compare ] — тип сравнения строк: с учётом регистра или без учёта. 0 — с учётом регистра, 1 — без учёта регистра;

1 — стандартное поведение, возвращающее близкое слово из Where;

2 — найденная подстрока;

3 — слепок найденного словарного слова;

4 — разница по модулю между слепком найденного и искомого слова, которая используется для ранжирования найденных слов по уровню схожести с оригинальным словом (чем меньше разница, тем считаются более похожими слова).

Большинство пользователей обойдутся первыми двумя параметрами.

Книга: Excel. Трюки и эффекты

Поиск максимального значения на всех листах книги

В данном подразделе мы рассмотрим, каким образом можно быстро найти максимальное значение указанной ячейки среди всех листов текущей рабочей книги.

Следует отметить, что для решения данной задачи можно воспользоваться штатными средствами программы, а именно – функцией МАКС. Например, с помощью формулы =МАКС (Лист2: Лист7! A3) осуществляется поиск максимального значения ячейки A3 среди рабочих листов с Л ист2 по Л ист7 включительно. Однако данный способ имеет следующий недостаток: при добавлении в книгу новых листов (после Лист7) формулу придется соответствующим образом корректировать.

Поэтому для решения подобных задач целесообразно создать и применять пользовательскую функцию, код которой приведен в листинге 2.70.

Дополнительные параметры поиска слов и фраз

Когда таблица достаточно большая и нужно выполнить поиск по определенным параметрам, их можно задать в специальных настройках поиска. Нажмите кнопку Параметры.

Здесь можно указать дополнительные параметры поиска.

  • на листе — только на текущем листе;
  • в книге — искать во всем документе Excel, если он состоит из нескольких листов.

  • по строкам — искомая фраза будет искаться слева направо от одной строки к другой;
  • по столбцам — искомая фраза будет искаться сверху вниз от одного столбца к другому.

Выбор варианта, как просматривать, актуален, если в таблице много данных и есть какая-то необходимость просматривать по строкам или столбцам. Пользователь увидит, как именно просматривается таблица, когда будет нажимать кнопку Найти далее для перехода к следующему найденному совпадению.

Область поиска — определяет, где именно нужно искать совпадения:

  • в формулах;
  • в значениях ячеек (уже вычисленные по формулам значения);
  • в примечаниях, оставленных пользователями к ячейкам.

А также дополнительные параметры:

  • Учитывать регистр — означает, что заглавные и маленькие буквы будут считаться как разные.

Например, если не учитывать регистр, то по запросу «excel» будет найдены все вариации этого слова, например, Excel, EXCEL, ExCeL и т.д.

Если поставить галочку учитывать регистр, то по запросу «excel» будет найдено только такое написание слова и не будет найдено слово «Excel».

  • Ячейка целиком — галочку нужно ставить в том случае, если нужно найти те ячейки, в которых искомая фраза находится целиком и нет других символов. Например, есть таблица со множеством ячеек, содержащих различные числа. Поисковый запрос: «200». Если не ставить галочку ячейка целиком, то будут найдены все числа, содержащие 200, например: 2000, 1200, 11200 и т.д. Чтобы найти ячейки только с «200», нужно поставить галочку ячейка целиком. Тогда будут показаны только те, где точное совпадение с «200».
  • Формат… — если задать формат, то будут найдены только те ячейки, в которых есть искомый набор символов и ячейки имеют заданный формат (границы ячейки, выравнивание в ячейке и т.д.). Например, можно найти все желтые ячейки, содержащие искомые символы.

Формат для поиска можно задать самому, а можно выбрать из ячейки-образца — Выбрать формат из ячейки.

Чтобы сбросить настройки формата для поиска нужно нажать Очистить формат поиска.

Это меню вызывается, если нажать на стрелочку в правой части кнопки Формат.

Как этот код работает

  1. На шаге 1 объявляются две переменные объекта Range, одна из которых называется MyRange для хранения всей цели диапазона, а другая называется MyCell для хранения каждой ячейки в диапазоне.
  2. Шаг 2 заполняет переменную MyRange целевым диапазоном. В этом примере мы используем выбранный диапазон — диапазон, который был выбран в электронной таблице. Вы можете легко установить переменную MyRange для определенного диапазона, например Range («A1: Z100»). Кроме того, если ваша цель — именованный диапазон, вы можете просто ввести его имя: Range («MyNamedRange»).
  3. Шаг 3 макрос начинает проходить по каждой ячейке в целевом диапазоне, активируя каждую ячейку.
  4. Объект WorksheetFunction позволяет нам запускать многие из Excel функции электронных таблиц в VBA. Шаг 4 использует объект WorksheetFunction для запуска Функция СЧЕТЕСЛИ в VBA.
    В этом случае мы рассчитываем, сколько раз значение активной ячейки (MyCell.Value) найдено в заданном диапазоне (MyRange). Если выражение СЧЕТЕСЛИ оценивается больше 1, макрос изменяет цвет ячейки.
  5. Шаг 5 возвращается к следующей ячейке. После активации всех ячеек в целевом диапазоне макрос заканчивается.

Макрос Excel: поиск значения на всем рабочем листе и очистка этого значения

У меня есть набор файлов csv. Все, что мне нужно – это код для поиска по всему рабочему листу, чтобы найти значение -999.999 в любой ячейке, а затем очистить эту ячейку. Не удалить, но очистить. Это не повлияет на вычисления.

Я ценю вашу помощь.

Нажмите Ctrl + H Затем -999.999 затем нажмите Alt + A

Затем нажмите Enter

Затем нажмите Esc

Альтернативно, если вы хотите только заменить первый экземпляр -999.999 выполните то же самое, что и выше, но вместо Alt + A Используйте Alt + R

Если по какой-то причине вам действительно нужно это в коде, это простая одна строка для замены всех:

Поиск последней используемой строки, столбца или ячейки — это одна из самых распространенных задач при написании макросов и приложений VBA. Как и все в Excel и VBA, есть много различных способов.

Выбор правильного метода в основном зависит от того, как выглядят ваши данные.

В этой статье я объясняю три различных метода VBA объекта Range, которые мы можем использовать для поиска последней ячейки на листе. Каждый из этих методов имеет плюсы и минусы, а некоторые выглядят страшнее других. 🙂

Но понимание того, как работает каждый метод, поможет вам узнать, когда их использовать и почему.

#1 – The Range.End() Method

Range.End() очень похож на сочетание клавиш Ctrl+Arrow. В VBA можно использовать этот метод, чтобы найти последнюю не пустую ячейку в одной строке или столбце.

Диапазон.Пример кода End VBA

Чтобы найти последнюю использованную строку в столбце, этот метод начинается с последней ячейки столбца и идет вверх (xlUp), пока не найдет первую непустую ячейку.

Оператор Rows.Count возвращает количество всех строк на рабочем листе. Поэтому мы в основном указываем последнюю ячейку в столбце A листа (ячейка A1048567) и поднимаемся до тех пор, пока не найдем первую непустую ячейку.

Это работает так же с поиском последнего столбца. Он начинается с последнего столбца в строке, затем идет влево, пока в столбце не будет найдена последняя непустая ячейка. Columns.Count возвращает общее количество столбцов на листе. Итак, мы начинаем с последнего столбца и идем налево.

Аргумент для метода End указывает, в каком направлении идти. Возможные варианты: xlDown, xlUp, xlToLeft, xlToRight.

Плюсы Range.End

  • Range.End прост в использовании и понимании, так как он работает так же, как сочетания клавиш Ctrl+Arrow.
  • Может использоваться для поиска первой пустой ячейки или последней непустой ячейки в одной строке или столбце.

Минусы Range.End

  • Range.End работает только с одной строкой или столбцом. При наличии диапазона данных, содержащего пробелы в последней строке или столбце, может быть трудно определить, в какой строке или столбце выполнять метод.
  • Если вы хотите найти последнюю используемую ячейку, то вы должны оценить по крайней мере два оператора. Один, чтобы найти последнюю строку и один, чтобы найти последний столбец. Затем их можно объединить для ссылки на последнюю ячейку.

Вот справочные статьи для Range.End

#2 – The Range.Find() Method

Последнее значение в столбце Excel

Метод Range.Find — я предпочитаю этот способ, чтобы найти последнюю строку, столбец или ячейку. Он самый универсальный, но и самый страшный.

Последнее значение в столбце Excel

У Range.Find много аргументов, но пусть это вас не пугает. Когда вы знаете, что они делают, вы можете использовать Range.Find для многих вещей в VBA.

Range.Find — это в основном способ программирования меню «Find» в Excel. Он делает то же самое, и большинство аргументов Range.Find являются опциями в меню Find.

Последнее значение в столбце Excel

Пример кода Range.Find

Ниже приведен код для поиска последней непустой строки.

Метод Range.Find. Пояснения

Метод Find ищет первую непустую ячейку («*»). Звездочка представляет собой символ подстановки, который ищет любой текст или числа в ячейке.

Начиная с ячейки A1, он перемещается назад (xlPrevious) и фактически начинает поиск в самой последней ячейке на листе. Затем он перемещается справа налево (xlByRows) и проходит по каждой строке, пока не найдет непустую ячейку. При обнаружении непустого он останавливается и возвращает номер строки.

Range.Find VBA Excel

Вот подробное объяснение каждого аргумента.

  • What:=”*” — звездочка — это символ подстановки, который находит любой текст или число в ячейке. Это в основном то же самое, что и поиск непустой ячейки.
  • After:=Range(“A1”)— начать поиск после ячейки А1, первой ячейки на листе. Это означает, что A1 не будет искать. Поиск начнется после A1, и следующая ячейка, которую он ищет, зависит от SearchOrder и SearchDirection. Этот аргумент можно изменить, чтобы он начинался в другой ячейке, просто помните, что поиск фактически начинается в ячейке после указанной.
  • LookAt: = xlPart — это будет смотреть на любую часть текста внутри ячейки. Другой вариант — xlWhole, который будет пытаться соответствовать всему содержимому ячейки.
  • LookIn: = xlFormulas — Это заставляет Find искать в формулах, и это важный аргумент. Другой вариант — xlValues, который будет искать только значения. Если у вас есть формулы, которые возвращают пробелы (= IF (A2> 5, «Ok», «»), то вы можете считать это непустой ячейкой. При указании LookIn в качестве xlFormulas эта формула будет считаться непустой, даже если возвращаемое значение пустое.
  • SearchOrder: = xlByRows — это говорит Find, чтобы искать через каждую целую строку прежде, чем перейти к следующей. Направление поиска слева направо или справа налево зависит от аргумента SearchDirection. Другой вариант здесь — xlByColumns, который используется при поиске последнего столбца.
  • SearchDirection: = xlPrevious — указывает направление поиска. xlPrevious означает, что он будет искать справа налево или снизу вверх. Другой вариант — xlNext, который перемещается в противоположном направлении.
  • MatchCase: = False — это говорит Find, чтобы не рассматривать заглавные или строчные буквы. Если установить значение True, это поможет. Этот аргумент не является необходимым для этого сценария.

Да, я знаю, что это много, но надеюсь, у вас будет лучшее понимание того, как использовать эти аргументы, чтобы найти что-нибудь на листе.

Плюсы Range.Find

  • Find ищет во всем диапазоне последнюю непустую строку или столбец. Он НЕ ограничен одной строкой или столбцом.
  • Последняя строка в наборе данных может содержать пробелы, и Range.Find все равно найдет последнюю строку.
  • Аргументы могут использоваться для поиска в разных направлениях и для определенных значений, а не только пустых ячеек.

Минусы Range.Find

  • Это ужасно. Метод содержит 9 аргументов. Хотя требуется только один из этих аргументов (Что), вы должны привыкнуть использовать хотя бы первые 7 аргументов. В противном случае метод Range.Find по умолчанию будет использовать ваши последние использованные настройки в окне поиска. Это важно. Если вы не укажете необязательные аргументы для LookAt, LookIn и SearchOrder, тогда метод Find будет использовать те параметры, которые вы использовали последними в окне поиска Excel.
  • Нахождение последней ячейки требует двух утверждений. Один, чтобы найти последний ряд и один, чтобы найти последний столбец. Затем вы должны объединить их, чтобы найти последнюю ячейку.

Macro Recorder выручит!

Range.Find — все еще мой любимый метод для нахождения последней ячейки из-за ее универсальности. Но нужно много напечатать и запомнить. К счастью, вам это не нужно.

Вы можете использовать макро рекордер, чтобы быстро создать код со всеми аргументами.

  1. Запустить макро рекордер
  2. Нажмите Ctrl + F
  3. Затем нажмите кнопку «Найти далее»

Код для метода Find со всеми аргументами будет сгенерирован устройством записи макросов.

Используйте пользовательскую функцию для метода Find

Вы также можете использовать пользовательскую функцию (UDF) для метода поиска. Последняя функция Ron de Bruin — прекрасный пример. Вы можете скопировать эту функцию в любой проект или модуль кода VBA и использовать ее для возврата последней строки, столбца или ячейки.

У меня также есть аналогичная функция в примере рабочей книги. Моя функция просто имеет дополнительные аргументы для ссылки на лист и диапазон для поиска.

Вот справочные статьи для Range.Find

  • MSDN Help Article for Range.Find Method

#3 – Range.SpecialCells (xlCellTypeLastCell)

Метод SpecialCells делает то же самое, что и нажатие сочетания клавиш Ctrl + End, и выбирает последнюю использованную ячейку на листе.

Пример кода SpecialCells (xlCellTypeLastCell)

На самом деле это самый простой способ найти последнюю использованную ячейку. Однако этот метод находит последнюю использованную ячейку, которая может отличаться от последней непустой ячейки.

Часто вы будете нажимать Ctrl + End на клавиатуре и попадете в какую-нибудь ячейку вниз в конце листа, который определенно не используется. Это может произойти по ряду причин. Одной из распространенных причин является то, что свойства форматирования для этой ячейки были изменены. Простое изменение размера шрифта или цвета заливки ячейки помечает ее как использованную ячейку.

Плюсы Range.SpecialCells

  • Вы можете использовать этот метод, чтобы найти «используемые» строки и столбцы в конце листа и удалить их. Сравнение результата Range.SpecialCells с результатом Range.Find для непробелов может позволить вам быстро определить, существуют ли какие-либо неиспользуемые строки или столбцы на листе.
  • Удаление неиспользуемых строк / столбцов может уменьшить размер файла и увеличить полосу прокрутки.

Минусы Range.SpecialCells

  • Excel только сбрасывает последнюю ячейку при сохранении книги. Поэтому, если пользователь или макрос удаляет содержимое некоторых ячеек, этот метод не найдет истинную последнюю ячейку, пока файл не будет сохранен.
  • Он находит последнюю использованную ячейку, а НЕ последнюю непустую ячейку.

Другие методы поиска последней ячейки

Что ж, это должно охватывать основы поиска последней использованной или непустой ячейки на листе. Если ваш лист содержит объекты (таблицы, диаграммы, сводные таблицы, слайсеры и т. Д.), Вам может потребоваться использовать другие методы для поиска последней ячейки. Я объясню эти методы в отдельном посте.

У меня также есть статья о том, как найти ПЕРВУЮ ячейку в листе.

Пожалуйста, оставьте комментарий ниже, если у вас есть какие-либо вопросы, или вы все еще не можете найти последнюю ячейку. Я буду рад помочь!

Ссылка на основную публикацию