Vba определить другой excel

Содержание

  1. Метод Range.Find (Excel)
  2. Синтаксис
  3. Параметры
  4. Возвращаемое значение
  5. Примечания
  6. Примеры
  7. Поддержка и обратная связь
  8. Метод WorksheetFunction.Match (Excel)
  9. Синтаксис
  10. Параметры
  11. Возвращаемое значение
  12. Замечания
  13. Пример
  14. Поддержка и обратная связь
  15. Метод Application.Intersect (Excel)
  16. Синтаксис
  17. Параметры
  18. Возвращаемое значение
  19. Пример
  20. Поддержка и обратная связь
  21. Поиск на листе Excel
  22. Поиск перебором значений
  23. Поиск функцией Find
  24. Примеры поиска функцией Find
  25. Поиск последней заполненной ячейки с помощью Find
  26. Поиск по шаблону (маске)
  27. Поиск в скрытых строках и столбцах
  28. Поиск даты с помощью Find
  29. Книги по теме:
  30. Посмотреть все книги по программированию
  31. Комментарии к статье:

Метод Range.Find (Excel)

Находит определенные сведения в диапазоне.

Хотите создавать решения, которые расширяют возможности Office на разнообразных платформах? Ознакомьтесь с новой моделью надстроек Office. Надстройки Office занимают меньше места по сравнению с надстройками и решениями VSTO, и вы можете создавать их, используя практически любую технологию веб-программирования, например HTML5, JavaScript, CSS3 и XML.

Синтаксис

выражение.Find (What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

выражение: переменная, представляющая объект Range.

Параметры

Имя Обязательный или необязательный Тип данных Описание
What Обязательный Variant Искомые данные. Может быть строкой или любым типом данных Microsoft Excel.
After Необязательный Variant Ячейка, после которой нужно начать поиск. Соответствует положению активной ячейки, когда поиск выполняется из пользовательского интерфейса.

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

Если не указать этот аргумент, поиск начинается после ячейки в левом верхнем углу диапазона. LookIn Необязательный Variant Может быть одной из следующих констант XlFindLookIn: xlFormulas, xlValues, xlComments или xlCommentsThreaded. LookAt Необязательный Variant Может быть одной из следующих констант XlLookAt: xlWhole или xlPart. SearchOrder Необязательный Variant Может быть одной из следующих констант XlSearchOrder: xlByRows или xlByColumns. SearchDirection Необязательный Variant Может быть одной из следующих констант XlSearchDirection: xlNext или xlPrevious. MatchCase Необязательный Variant Значение True, чтобы выполнять поиск с учетом регистра. Значение по умолчанию — False. MatchByte Необязательный Variant Используется только в том случае, если выбрана или установлена поддержка двухбайтовых языков. Значение True, чтобы двухбайтовые символы сопоставлялись только с двухбайтовым символами. Значение False, чтобы двухбайтовые символы сопоставлялись с однобайтовыми эквивалентами. SearchFormat Необязательный Variant Формат поиска.

Возвращаемое значение

Объект Range, представляющий первую ячейку, в которой обнаружены требуемые сведения.

Примечания

Этот метод возвращает значение Nothing, если совпадения не найдены. Метод Find не влияет на выделенный фрагмент или активную ячейку.

Параметры для аргументов LookIn, LookAt, SearchOrder и MatchByte сохраняются при каждом использовании этого метода. Если не указать значения этих аргументов при следующем вызове метода, будут использоваться сохраненные значения. Установка этих аргументов изменяет параметры в диалоговом окне Найти, а изменение параметров в диалоговом окне Найти приводит к изменению сохраненных значений, которые используются, если опустить аргументы. Чтобы избежать проблем, устанавливайте эти аргументы явным образом при каждом использовании этого метода.

Для повторения поиска используйте методы FindNext и FindPrevious.

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

Чтобы найти ячейки, отвечающие более сложным шаблонам, используйте инструкцию For Each. Next с оператором Like. Например, следующий код выполняет поиск всех ячеек в диапазоне A1:C5, где используется шрифт, имя которого начинается с букв Cour. Когда Microsoft Excel находит соответствующее значение, шрифт изменяется на Times New Roman.

Примеры

В этом примере показано, как найти все ячейки в диапазоне A1:A500 на листе 1, содержащие значение 2, и изменить значение ячейки на 5. Таким образом, значения 1234 и 99299 содержали 2 и оба значения ячеек станут 5.

В этом примере показано, как найти все ячейки в диапазоне A1:A500 на листе 1, содержащие подстроку «abc», и изменить ее на «xyz».

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Метод WorksheetFunction.Match (Excel)

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

Синтаксис

expression. Match (Arg1, Arg2, Arg3)

Выражение Переменная, представляющая объект WorksheetFunction .

Параметры

Имя Обязательный или необязательный Тип данных Описание
Arg1 Обязательный Variant Lookup_value: значение, используемое для поиска нужного значения в таблице.
Arg2 Обязательный Variant Lookup_array: непрерывный диапазон ячеек, содержащих возможные значения подстановки. Lookup_array должен быть массивом или ссылкой на массив.
Arg3 Необязательный Variant Match_type: число -1, 0 или 1. Match_type указывает, как Microsoft Excel сопоставляет lookup_value со значениями в lookup_array.

Возвращаемое значение

Double

Замечания

Lookup_value — это значение, которое нужно сопоставить в lookup_array. Например, при поиске номера в телефонной книге в качестве значения подстановки используется имя человека, но номер телефона — это нужное значение.

Lookup_value может быть значением (число, текст или логическое значение) или ссылкой на ячейку числа, текста или логического значения.

Если match_type равно 1, функция Match находит наибольшее значение, которое меньше или равно lookup_value. Lookup_array должны располагаться в порядке возрастания: . -2, -1, 0, 1, 2, . A–Z, FALSE, TRUE.

Если match_type равно 0, функция Match находит первое значение, которое точно равно lookup_value. Lookup_array может быть в любом порядке. Обратите внимание, что значение Match не учитывает регистр.

Если match_type равно -1, функция Match находит наименьшее значение, больше или равное lookup_value. Lookup_array должны размещаться в порядке убывания: TRUE, FALSE, Z-A, . 2, 1, 0, -1, -2, . и т. д.

Если match_type опущен, предполагается, что значение равно 1.

Функция Match возвращает позицию соответствующего значения в lookup_array, а не само значение. Например, MATCH(«b»,<«a»,»b»,»c»>,0) возвращает значение 2, относительное положение «b» в массиве <«a»,»b»,»c»>.

Сопоставление не различает буквы верхнего и нижнего регистров при сопоставлении текстовых значений.

Если найти совпадение не удалось, возвращается значение ошибки #N/A.

Если match_type равно 0, а lookup_value — текст, в lookup_value можно использовать подстановочные знаки, вопросительный знак (?) и звездочку (*). Вопросительный знак соответствует любому одному символу; звездочка соответствует любой последовательности символов. Если вы хотите найти фактический вопросительный знак или звездочку, введите тильду (

Пример

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

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Метод Application.Intersect (Excel)

Возвращает объект Range , представляющий прямоугольное пересечение двух или более диапазонов. Если указан один или несколько диапазонов с другого листа, возвращается ошибка.

Синтаксис

выражение: переменная, представляющая объект Application.

Параметры

Имя Обязательный или необязательный Тип данных Описание
Arg1 Обязательный Range Пересекающиеся диапазоны. Необходимо указать по крайней мере два объекта Range .
Arg2 Обязательный Range Пересекающиеся диапазоны. Необходимо указать по крайней мере два объекта Range .
Arg3Arg30 Необязательный Variant Пересекающийся диапазон.

Возвращаемое значение

Пример

В следующем примере выбирается пересечение двух именованных диапазонов, rg1 и rg2, на Листе 1. Если диапазоны не пересекаются, в примере отображается сообщение.

В следующем примере сравнивается свойство Worksheet.Range , метод Application.Union и метод Intersect .

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Поиск на листе Excel

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

Поиск перебором значений

Довольно простой в реализации способ. Например, найти в колонке «A» ячейку, содержащую «123» можно примерно так:

Минусами этого так сказать «классического» способа являются: медленная работа и громоздкость. А плюсом является его гибкость, т.к. таким способом можно реализовать сколь угодно сложные варианты поиска с различными вычислениями и т.п.

Поиск функцией Find

Гораздо быстрее обычного перебора и при этом довольно гибкий. В простейшем случае, чтобы найти в колонке A ячейку, содержащую «123» достаточно такого кода:

Вкратце опишу что делают строчки данного кода:
1-я строка: Выбираем в книге лист «Данные»;
2-я строка: Осуществляем поиск значения «123» в колонке «A», результат поиска будет в fcell;
3-я строка: Если удалось найти значение, то fcell будет содержать Range-объект, в противном случае — будет пустой, т.е. Nothing.

Полностью синтаксис оператора поиска выглядит так:

Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

What — Строка с текстом, который ищем или любой другой тип данных Excel

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

LookIn — Тип искомых данных. Может принимать одно из значений: xlFormulas (формулы), xlValues (значения), или xlNotes (примечания).

LookAt — Одно из значений: xlWhole (полное совпадение) или xlPart (частичное совпадение).

SearchOrder — Одно из значений: xlByRows (просматривать по строкам) или xlByColumns (просматривать по столбцам)

SearchDirection — Одно из значений: xlNext (поиск вперед) или xlPrevious (поиск назад)

MatchCase — Одно из значений: True (поиск чувствительный к регистру) или False (поиск без учета регистра)

MatchByte — Применяется при использовании мультибайтных кодировок: True (найденный мультибайтный символ должен соответствовать только мультибайтному символу) или False (найденный мультибайтный символ может соответствовать однобайтному символу)

SearchFormat — Используется вместе с FindFormat. Сначала задается значение FindFormat (например, для поиска ячеек с курсивным шрифтом так: Application.FindFormat.Font.Italic = True), а потом при использовании метода Find указываем параметр SearchFormat = True. Если при поиске не нужно учитывать формат ячеек, то нужно указать SearchFormat = False.

Чтобы продолжить поиск, можно использовать FindNext (искать «далее») или FindPrevious (искать «назад»).

Примеры поиска функцией Find

Пример 1: Найти в диапазоне «A1:A50» все ячейки с текстом «asd» и поменять их все на «qwe»

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

Пример 2: Правильный поиск значения с использованием FindNext, не приводящий к зацикливанию.

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

Пример 3: Продолжение поиска с использованием Find с параметром After.

Следующий пример демонстрирует применение SearchFormat для поиска по формату ячейки. Для указания формата необходимо задать свойство FindFormat.

Пример 4: Найти все ячейки с шрифтом «курсив» и поменять их формат на обычный (не «курсив»)

Примечание: В данном примере намеренно не используется FindNext для поиска следующей ячейки, т.к. он не учитывает формат (статья об этом: https://support.microsoft.com/ru-ru/kb/282151)

Коротко опишу алгоритм поиска Примера 4. Первые две строки определяют последнюю строку (lLastRow) на листе и последний столбец (lLastCol). 3-я строка задает формат поиска, в данном случае, будем искать ячейки с шрифтом Italic. 4-я строка определяет область ячеек с которой будет работать программа (с ячейки A1 и до последней строки и последнего столбца). 5-я строка осуществляет поиск с использованием SearchFormat. 6-я строка — цикл пока результат поиска не будет пустым. 7-я строка — меняем шрифт на обычный (не курсив), 8-я строка продолжаем поиск после найденной ячейки.

Хочу обратить внимание на то, что в этом примере я не стал использовать «защиту от зацикливания», как в Примерах 2 и 3, т.к. шрифт меняется и после «прохождения» по всем ячейкам, больше не останется ни одной ячейки с курсивом.

Свойство FindFormat можно задавать разными способами, например, так:

Поиск последней заполненной ячейки с помощью Find

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

Пример 5: Найти последнюю колонку и столбец, заполненные данными

В этом примере используется UsedRange, который так же как и SpecialCells возвращает все используемые ячейки, в т.ч. и те, что были использованы ранее, а сейчас пустые. Функция Find ищет ячейку с любым значением с конца диапазона.

Поиск по шаблону (маске)

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

Пример 6: Выделить красным шрифтом ячейки, в которых текст начинается со слова из 4-х букв, первая и последняя буквы «т», при этом после этого слова может следовать любой текст.

Для поиска функцией Find по маске (шаблону) можно применять символы:
* — для обозначения любого количества любых символов;
? — для обозначения одного любого символа;

— для обозначения символов *, ? и

. (т.е. чтобы искать в тексте вопросительный знак, нужно написать

?, чтобы искать именно звездочку (*), нужно написать

* и наконец, чтобы найти в тексте тильду, необходимо написать

Поиск в скрытых строках и столбцах

Для поиска в скрытых ячейках нужно учитывать лишь один нюанс: поиск нужно осуществлять в формулах, а не в значениях, т.е. нужно использовать LookIn:=xlFormulas

Поиск даты с помощью Find

Если необходимо найти текущую дату или какую-то другую дату на листе Excel или в диапазоне с помощью Find, необходимо учитывать несколько нюансов:

  • Тип данных Date в VBA представляется в виде #[месяц]/[день]/[год]#, соответственно, если необходимо найти фиксированную дату, например, 01 марта 2018 года, необходимо искать #3/1/2018#, а не «01.03.2018»
  • В зависимости от формата ячеек, дата может выглядеть по-разному, поэтому, чтобы искать дату независимо от формата, поиск нужно делать не в значениях, а в формулах, т.е. использовать LookIn:=xlFormulas

Приведу несколько примеров поиска даты.

Пример 7: Найти текущую дату на листе независимо от формата отображения даты.

Пример 8: Найти 1 марта 2018 г.

Искать часть даты — сложнее. Например, чтобы найти все ячейки, где месяц «март», недостаточно искать «03» или «3». Не работает с датами так же и поиск по шаблону. Единственный вариант, который я нашел — это выбрать формат в котором месяц прописью для ячеек с датами и искать слово «март» в xlValues.

Тем не менее, можно найти, например, 1 марта независимо от года.

Пример 9: Найти 1 марта любого года.

Книги по теме:

Посмотреть все книги по программированию

Комментарии к статье:

10.09.17 Дмитрий Очень толковая и полезная статья. Помогла мне существенно ускорить мой код. Спасибо!
23.11.17 Гость Спасибо, хорошая статья.
03.12.17 Владимир Спасибо! Использую в своих проектах.
07.12.17 Эд Спасибо, очень пригодилась Ваша статья!
19.01.18 Николай .find не ищет значение в ячейке, если ячейка в скрытой строке.
.match позволяет не беспокоится о том, что на листах с источниками данных строка с искомым значением будет скрыта из-за установленного фильтра.
05.02.18 Владимир Большое спасибо! Очень толково и понятно.
11.03.18 Гость Здравствуйте,
А если мне требуется найти ячейку в определенном столбце с определенным значением, например «строка 1» и если я нахожу такую, то через несколько строк(неизвестно сколько) мне нужно раскрасить следующую ячейку в другом столбце(самую ближайшую) и остановить цикл, и опять по новой искать дальше «строка 1». Можете посоветовать?
26.03.18 Гость Спасибо! Все бы так описывали! Все доступно и понятно))
23.05.18 Аркадий В VBA я новичок. Активно использую интернет для своих вопросов, однако таких информативных, лаконичных и простых в понимании сайтов не много. Огромное спасибо автору! Адрес уже в закладках.
21.07.18 Гость Спасибо! Уже несколько недель искала подобное!
25.07.18 Joann Метод .find (в случае далнейших множественных обращений к этому механизму) разумно вынести в отдельную функцию, как из управляющей процедуры передать в эту функцию ее параметры (обязательный текстовый параметр ‘what:=’ — передается без проблем, а вот значения (‘xlValues’, ‘xlWhole’, . ) для ‘LookIn:=’, ‘LookAt:=’, . — приводят к ошибке)?
15.08.18 Марат Спасибо за статью, пополнил свои знания в части метода Find. Простые переборы хороши на небольших диапазонах. А когда нужно обработать сотни тысяч ячеек, Find — хороший инструмент!
28.08.18 Гость Познавательно и подробно. Спасибо за статью.
16.10.18 Гость Хорошая статья. Спасибо
29.10.18 Sega Полезная статейка. Спасибо.
14.11.18 Гость Статья для начинающих, а тонкости поиска по дате нет ни одного примера
02.02.19 Ибрагим Чушь полная, плагиат!
01.03.19 inexsu.wordpress.com Loop While Not c Is Nothing And c.Address <> firstResult
Когда c станет Nothing, c.Address даст ошибку
Решение https://inexsu.wordpress.com/2018/03/05/range-findnext-method/
01.03.19 Администратор Вы правы, такое действительно может произойти, например, если менять значения найденных ячеек. Т.е., например, ищем значения «asd» и меняем их на «qwe». При замене последнего значения, FindNext ничего уже не найдет, вернет Nothing и произойдет ошибка в условии.
Внес изменения в статье. Спасибо вам за подсказку.
07.04.19 Гость Добрый день. есть 2 таблица на разных листах. макрос нашел нужные ячейки с ИНН по 1 условию, затем мне надо чтобы макрос нашел в таблице 2 на листе 2 все названия клиентов с инн по условию 1 из таблицы 1 с листа 1. как тогда использовать find.
07.04.19 Гость Лучше использовать функцию ВПР
21.05.19 Гость Очень подробная статья. Отдельное спасибо за множество примеров.
17.10.19 Михаил Спасибо большое все понятно доступно и очень полезно
31.10.19 Гость Спасибо.
01.11.19 Гость ку
01.11.19 Гость 2 раза
19.11.19 Kamol Отлично.
Поиск с двумя значениями Пример в колонке А=»123″ и В=»456″
25.12.19 Гость Спасибо!
05.03.20 Гость Добрый день!
Спасибо за код автору
Вопрос

Как сделать поиск слова по, но с любым регистром и любым набором символов
Пример: Я ввожу слово через Textbox
В таблице есть слово компьютер, колодец, ком
Нужно, чтобы программа находила по запросу «омпьюте», «пьюте» слово компьютер а по запросу «ком» слова компьютер и ком 19.05.20 ГостьSpenser.Hebe as long as the kung fu is deep, the iron shovel is ground into a needle. 07.06.20 Светлана Добрый день! Подскажите, пожалуйста, в примере №7 «Найти текущую дату. «
как найти ячейку с текущей датой и выделить эту ячейку цветом? Очень надо. 07.06.20 Светлана Всё сделала. Спасибо за примеры. 19.06.20 Гость Статья толковая, жаль своего примера не нашел 11.09.20 Гость Спасибо! 18.10.20 Гость Спасибо, очень толково и полезно!! 09.11.20 Александр 1. В примерах 2, 3 и 6 проверка «If c Is Nothing Then Exit Do» не нужна, потому что НИКОГДА не сработает и не приведёт к выходу из цикла. Раз мы попали в цикл — значит была найдена хотя бы одна ячейка с искомым значением и значит последующий поиск заведомо даст результат, даже если такая ячейка всего одна.
Значения в ячейках не меняются, поэтому для выхода из цикла достаточно условия «c.Address = firstResult». А это условие будет выполнено, как только поиск вернётся на первую найденную ячейку с искомым значением.
2. В примере 3 продолжение поиска выполнено оператором «Set c = .Find(«asd», After:=c, lookin:=xlValues)». Такой вариант, разумеется, работает, но на мой взгляд лишь затуманивает головы. В ДАННОМ СЛУЧАЕ надо не городить огород, а воспользоваться оператором FindNext, который и предназначен для того, чтобы продолжить поиск с ячейки, следующей после последней найденной: «Set c = .FindNext(c)». Я исхожу из простого принципа: если в языке есть специальный инструмент для выполнения специальных действий, то эти действия и надо выполнять с помощью этого инструмента.
Гвоздь можно забить пассатижами, но для этого больше подойдёт молоток ) 24.11.20 Гость » Добрый день!
Спасибо за код автору
Вопрос

Как сделать поиск слова по, но с любым регистром и любым набором символов
Пример: Я ввожу слово через Textbox
В таблице есть слово компьютер, колодец, ком
Нужно, чтобы программа находила по запросу «омпьюте», «пьюте» слово компьютер а по запросу «ком» слова компьютер и ком»

Источник

  • Советы по Excel
  • Функции Excel
  • Формулы Excel
  • Excel Диаграммы
  • Советы по словам
  • Советы по Outlook

Как искать / находить значения в другой книге?

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

  • Данные Vlookup и возвращаемые значения из другой книги в Excel
  • Данные Vlookup и возвращаемые значения из другой закрытой книги с VBA

Данные Vlookup и возвращаемые значения из другой книги в Excel

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

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

2. Выберите пустую ячейку, в которую вы вернете цену, введите формулу = ВПР (B2; [Price.xlsx] Sheet1! $ A $ 1: $ B $ 24,2; FALSE) в него, а затем перетащите его маркер заполнения, чтобы применить эту формулу к диапазону по мере необходимости.

Заметки:
(1) В приведенной выше формуле B2 — это плод, который вы будете искать в другой книге, Price.xlsx указывает имя файла книги, из которой вы будете искать, Sheet1 означает имя листа, из которого вы будете искать, и A $ 1 : $ B $ 24 — это диапазон, из которого вы будете искать. Вы можете изменить их по своему усмотрению.
(2) После закрытия книги, из которой вы искали, формула автоматически обновится до = ВПР (B2; ‘W: test [Price.xlsx] Sheet1’! $ A $ 1: $ B $ 24,2, FALSE), W: test — это путь сохранения книги, из которой вы искали.

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


Данные Vlookup и возвращаемые значения из другой закрытой книги с VBA

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

1. нажмите другой + F11 клавиши, чтобы открыть окно Microsoft Visual Basic для приложений.

2. Нажмите Вставить > Модули, а затем вставьте ниже код VBA в открывающееся окно модуля.

VBA: данные Vlookup и возвращаемые значения из другой закрытой книги

Private Function GetColumn(Num As Integer) As String
If Num <= 26 Then
GetColumn = Chr(Num + 64)
Else
GetColumn = Chr((Num - 1)  26 + 64) & Chr((Num - 1) Mod 26 + 65)
End If
End Function
Sub FindValue()
Dim xAddress As String
Dim xString As String
Dim xFileName As Variant
Dim xUserRange As Range
Dim xRg As Range
Dim xFCell As Range
Dim xSourceSh As Worksheet
Dim xSourceWb As Workbook
On Error Resume Next
xAddress = Application.ActiveWindow.RangeSelection.Address
Set xUserRange = Application.InputBox("Lookup values :", "Kutools for Excel", xAddress, Type:=8)
If Err <> 0 Then Exit Sub
Set xUserRange = Application.Intersect(xUserRange, Application.ActiveSheet.UsedRange)
xFileName = Application.GetOpenFilename("Excel Files (*.xlsx), *.xlsx", 1, "Select a Workbook")
If xFileName = False Then Exit Sub
Application.ScreenUpdating = False
Set xSourceWb = Workbooks.Open(xFileName)
Set xSourceSh = xSourceWb.Worksheets.Item(1)
xString = "='" & xSourceWb.Path & Application.PathSeparator & _
"[" & xSourceWb.Name & "]" & xSourceSh.Name & "'!$"
For Each xRg In xUserRange
Set xFCell = xSourceSh.Cells.Find(xRg.Value, , xlValues, xlWhole, , , False)
If Not (xFCell Is Nothing) Then
xRg.Offset(0, 2).Formula = xString & GetColumn(xFCell.Column + 1) & "$" & xFCell.Row
End If
Next
xSourceWb.Close False
Application.ScreenUpdating = True
End Sub

Внимание: Этот VBA будет возвращать значения в столбце, который находится на 2 столбца позади выбранного столбца. Например, я выбираю столбец B при применении этого VBA, значения возвращаются в столбце D. Если вам нужно изменить столбец назначения, узнайте код xRg.Offset (0, 2) .Formula = xString & GetColumn (xFCell.Column + 1) & «$» & xFCell.Row и заменить 2 на другой номер по мере необходимости.

3. нажмите F5 ключ или щелкните Run кнопку для запуска этого VBA.

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

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

Теперь все выбранные значения ищутся в указанной закрытой книге, и соответствующие значения возвращаются в указанном столбце. Смотрите скриншот:


Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Комментарии (1)


Оценок пока нет. Оцените первым!

Подписывайтесь на Нас

Copyright © 2009 —

www.extendoffice.ком. | Все права защищены. Питаться от ExtendOffice, | Карта сайта

Microsoft и логотип Office являются товарными знаками или зарегистрированными товарными знаками Microsoft Corporation в США и / или других странах.

Защищено Sectigo SSL

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

Данная функция помогает получить ссылку на другую, открытую в текущий момент, книгу:

Sub ПримерИспользования_GetAnotherWorkbook()
    Dim WB As Workbook
    Set WB = GetAnotherWorkbook
    If Not WB Is Nothing Then
        MsgBox "Выбрана книга: " & WB.FullName, vbInformation
    Else
        MsgBox "Книга не выбрана", vbCritical: Exit Sub
    End If
    ' обработка данных из выбранной книги
    x = WB.Worksheets(1).Range("a2")
    ' ...
End Sub
 
Function GetAnotherWorkbook() As Workbook
    ' если в данный момент открыто 2 книги, функция возвратит вторую открытую книгу
    ' если помимо текущей, открыто более одной книги - будет предоставлен выбор
    On Error Resume Next
    Dim coll As New Collection, WB As Workbook
    For Each WB In Workbooks
        If WB.Name <> ThisWorkbook.Name Then
            If Windows(WB.Name).Visible Then coll.Add CStr(WB.Name)
        End If
    Next WB
    Select Case coll.Count
        Case 0    ' нет других открытых книг
            MsgBox "Нет других открытых книг", vbCritical, "Function GetAnotherWorkbook"
        Case 1    ' открыта ещё только одна книга - её и возвращаем
            Set GetAnotherWorkbook = Workbooks(coll(1))
        Case Else    ' открыто несколько книг - предоставляем выбор
            For i = 1 To coll.Count
                txt = txt & i & vbTab & coll(i) & vbNewLine
            Next i
            msg = "Выберите одну из открытых книг, и введите её порядковый номер:" & _
                  vbNewLine & vbNewLine & txt
            res = InputBox(msg, "Открыто более двух книг", 1)
            If IsNumeric(res) Then Set GetAnotherWorkbook = Workbooks(coll(Val(res)))
    End Select
End Function
  • 37376 просмотров

Не получается применить макрос? Не удаётся изменить код под свои нужды?

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

Проверка открыт ли XLS другим пользователем

Валерьянка

Дата: Воскресенье, 23.03.2014, 15:10 |
Сообщение № 1

Группа: Пользователи

Ранг: Участник

Сообщений: 71


Репутация:

2

±

Замечаний:
0% ±


Excel 2010

Добрый день! Уважаемые форумчане!
Есть книга .xls которая размещена на рабочей локалке (SharePoint)
Работа в книге ведется несколькими пользователями.

Имеется следующая задача, определить средствами VBA открыт ли этот файл другим пользователем.

Пробую макрос, взят здесь: http://support.microsoft.com/kb/213299/ru
Не работает ни при каком раскладе, т.е. всегда -«Книга доступна», даже если там кто-то сдит :(

[vba]

Код

Sub ПроверкаКниги()
     If IsOpen(«http://adress/DocLib1/ОбщаяКнига1.xls») Then ‘ так не работает
     ‘If IsOpen(«ОбщаяКнига1.xls») Then — и так тоже не работает
        MsgBox «Книга открыта другим пользователем.»
     Else
        MsgBox «Книга доступна.»
     End If
End Sub

Function IsOpen(FileName As String) As Boolean
     Dim wb As Workbook
     For Each wb In Application.Workbooks
         If UCase(wb.Name) = UCase(FileName) Then
             IsOpen = True
             Exit Function
         End If
     Next wb
     IsOpen = False
End Function

[/vba]

Помогите, пожалуйста

 

Ответить

RAN

Дата: Воскресенье, 23.03.2014, 15:53 |
Сообщение № 2

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

попробуйте
[vba][/vba]
А вообще, пару лет назад ZVI на Планете выкладывал вариант Function IsOpen, но найти не могу.


Быть или не быть, вот в чем загвоздка!

 

Ответить

Serge_007

Дата: Воскресенье, 23.03.2014, 15:59 |
Сообщение № 3

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

RAN

Дата: Воскресенье, 23.03.2014, 16:25 |
Сообщение № 4

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Нашел в загашнике.

Я тогда начал делать постучаться — файл отдай, но забросил.

К сообщению приложен файл:

1435848.xls
(42.0 Kb)


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RANВоскресенье, 23.03.2014, 16:27

 

Ответить

Валерьянка

Дата: Воскресенье, 23.03.2014, 16:31 |
Сообщение № 5

Группа: Пользователи

Ранг: Участник

Сообщений: 71


Репутация:

2

±

Замечаний:
0% ±


Excel 2010

 

Ответить

nilem

Дата: Воскресенье, 23.03.2014, 17:24 |
Сообщение № 6

Группа: Авторы

Ранг: Старожил

Сообщений: 1612


Репутация:

563

±

Замечаний:
0% ±


Excel 2013, 2016


Яндекс.Деньги 4100159601573

 

Ответить

Валерьянка

Дата: Воскресенье, 23.03.2014, 18:47 |
Сообщение № 7

Группа: Пользователи

Ранг: Участник

Сообщений: 71


Репутация:

2

±

Замечаний:
0% ±


Excel 2010

RAN, спасибо, завтра на работе попробую

 

Ответить

DJ_Marker_MC

Дата: Воскресенье, 23.03.2014, 20:22 |
Сообщение № 8

Группа: Друзья

Ранг: Ветеран

Сообщений: 991


Репутация:

213

±

Замечаний:
0% ±


Excel 2019

А разве при открытии файла (если он уже кем то открыт) не предлагается открытие в режиме «ТОЛЬКО ЧТЕНИЕ» ??? (конечно если в файле не открыт общий доступ).

 

Ответить

doober

Дата: Понедельник, 24.03.2014, 02:54 |
Сообщение № 9

Группа: Друзья

Ранг: Ветеран

Сообщений: 913


Репутация:

317

±

Замечаний:
0% ±


Excel 2010

Код в модуль книги ОбщаяКнига1.xls
Вам остается только файлик прочитать S.txt и определить статус книги.
Проверил у себя в сети,все работает правильно.

[vba]

Код

Private Sub Workbook_BeforeClose(Cancel As Boolean)
F$ = Me.Path & «S.txt»
   Open F$ For Output As #1
     Print #1, «Close»
     Close #1
End Sub

Private Sub Workbook_Open()
F$ = Me.Path & «S.txt»
   Open F$ For Output As #1
     Print #1, «Open»
     Close #1
End Sub

[/vba]


 

Ответить

Валерьянка

Дата: Понедельник, 24.03.2014, 11:21 |
Сообщение № 10

Группа: Пользователи

Ранг: Участник

Сообщений: 71


Репутация:

2

±

Замечаний:
0% ±


Excel 2010

doober, Спасибо
У меня получилось не так изящно

Код в Общей книге:
[vba]

Код

Sub auto_open()
Sheets(1).[z1] = «Занят»
ActiveWorkbook.Save
End Sub
Sub auto_close()
Sheets(1).[z1] = «Свободен»
ActiveWorkbook.Save
End Sub

[/vba]

Пришлось создать файл indikator.xls (в ячейке A1 ссылка на значение Z1 Общей книги)

[vba]

Код

Sub Проверка()
Workbooks.Open Filename:=»http://…/indikator.xls», UpdateLinks:=3
Dim kontroller As String
kontroller = Sheets(1).[a1].Value
Workbooks(«indikator.xls»).Close False
If kontroller = «Занят» Then
MsgBox «Журнал регистрации ЗАНЯТ (открыт другим пользователем)!»
Else
MsgBox «Журнал регистрации ДОСТУПЕН !»
End If
End Sub

[/vba]

Сообщение отредактировал ВалерьянкаПонедельник, 24.03.2014, 11:24

 

Ответить

Валерьянка

Дата: Понедельник, 24.03.2014, 12:47 |
Сообщение № 11

Группа: Пользователи

Ранг: Участник

Сообщений: 71


Репутация:

2

±

Замечаний:
0% ±


Excel 2010

doober, странно, но при программном открытии общей книги (макросом) возникает ошибка при выполнении Workbook_Open()
Как это можно обойти?

 

Ответить

doober

Дата: Понедельник, 24.03.2014, 15:06 |
Сообщение № 12

Группа: Друзья

Ранг: Ветеран

Сообщений: 913


Репутация:

317

±

Замечаний:
0% ±


Excel 2010

У меня такая проблема не возникает.
Возможно не правильно получаете статус книги
ActiveWorkbook.Save-вы уверены на 100%,что в этот момент активная книга та, на которую вы расчитываете.
Проверте правильность пути к книге,проанализируйте код в общей книга.
И перейдите на текстовик,так проще и надежнее
Видео здесь


Сообщение отредактировал dooberПонедельник, 24.03.2014, 15:06

 

Ответить

Валерьянка

Дата: Понедельник, 24.03.2014, 15:56 |
Сообщение № 13

Группа: Пользователи

Ранг: Участник

Сообщений: 71


Репутация:

2

±

Замечаний:
0% ±


Excel 2010

doober,

И перейдите на текстовик,так проще и надежнее

Да да использую именно ваш метод указанный выше
[vba]

Код

Private Sub Workbook_Open()
F$ = Me.Path & «S.txt»
Open F$ For Output As #1
     Print #1, «Open»
     Close #1
End Sub

[/vba]
Путь указан верно, общая книга открывается вручную без проблем
При открытии Обшей книги макросом (для внесения изменений программно) возникает ошибка

 

Ответить

doober

Дата: Понедельник, 24.03.2014, 15:59 |
Сообщение № 14

Группа: Друзья

Ранг: Ветеран

Сообщений: 913


Репутация:

317

±

Замечаний:
0% ±


Excel 2010

Текст ошибки?


 

Ответить

Валерьянка

Дата: Понедельник, 24.03.2014, 17:08 |
Сообщение № 15

Группа: Пользователи

Ранг: Участник

Сообщений: 71


Репутация:

2

±

Замечаний:
0% ±


Excel 2010

doober,

При открытии общей книги
run time error 52 bad fail name or number
Желтая строка Open F$ For Output As #1

При закрытии
runtime error 75 path/file access error
Желтая строка Open F$ For Output As #1

Код вставлен в ЭтаКнига(не в отдельном модуле)

Сообщение отредактировал ВалерьянкаПонедельник, 24.03.2014, 17:32

 

Ответить

doober

Дата: Понедельник, 24.03.2014, 19:36 |
Сообщение № 16

Группа: Друзья

Ранг: Ветеран

Сообщений: 913


Репутация:

317

±

Замечаний:
0% ±


Excel 2010

Цитата

Filename:=»http://…/indikator.xls»

У вас скорее всего файл где-то на сервере лежит,а не в сети.
Путь не понимает,поэтому и ругается


 

Ответить

Alex_ST

Дата: Понедельник, 24.03.2014, 21:44 |
Сообщение № 17

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

У меня такая функция в заначке лежит (автора, к сожалению, не помню):[vba]

Код

Function FileIsBusy(File$) As Boolean   ‘ не открывая файла проверяет, открыт ли он вообще кем-либо
    Dim FN%: FN = FreeFile
    On Error Resume Next
    Open File For Random Access Write Lock Write As #FN
    Close #FN
    FileIsBusy = (Err <> 0)
End Function

[/vba]



С уважением,
Алексей
MS Excel 2003 — the best!!!

 

Ответить

Валерьянка

Дата: Вторник, 25.03.2014, 12:59 |
Сообщение № 18

Группа: Пользователи

Ранг: Участник

Сообщений: 71


Репутация:

2

±

Замечаний:
0% ±


Excel 2010

Alex_ST, а код макроса подскажите для проверки? %)

 

Ответить

Hugo

Дата: Вторник, 25.03.2014, 14:09 |
Сообщение № 19

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

Замечаний:
0% ±


2010, теперь уже с PQ

Я не Alex, но тоже с заначкой :)
[vba]

Код

Sub Test()
      MsgBox FileIsBusy([b9])
End Sub

[/vba]
В B9 путь к файлу.

P.S. Автора не записал, но кажется это ZVI


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

Валерьянка

Дата: Вторник, 25.03.2014, 15:13 |
Сообщение № 20

Группа: Пользователи

Ранг: Участник

Сообщений: 71


Репутация:

2

±

Замечаний:
0% ±


Excel 2010

Hugo, спасибо :D

 

Ответить

 

Здраствуйте. Помогите пожалуйста решить проблему:  
Есть Книга 1. Нужно написать програмку на Visual Basic которая перекачивает данные из Листа 1 Книги 1 в Лист 1 Книги 2. Открыта может быть только Книга 2. Книга 1 закрыта.  

  Вот код который переносит данные из одного листа в другой :  

  Sub Перекачка_организаций()  
   For i = 2 To 50  
       Имя_Организации = Sheets(«Организации»).Cells(i, 1).Value  
       ИНН_Организации = Sheets(«Организации»).Cells(i, 3).Value  

         Sheets(«Список»).Cells(i, 1).Value = Имя_Организации  
       Sheets(«Список»).Cells(i, 2).Value = ИНН_Организации  
   Next  
End Sub  

  Наверное для перекачки книг код не будет сложнее.  
Заранее благодарен.

 

слэн

Пользователь

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

а что значит книга закрыта?  

  ее нельзя показывать? почему нельзя открыть?  

  можно просто импортировать — данные-импорт внешних данных-импортировать данные

 

Johny

Пользователь

Сообщений: 2737
Регистрация: 21.12.2012

Книгу 1 надо открыть.  

  Dim wkb1 As Workbook, wks1 As Worksheet  

  Set wkb1 = Workbooks.Open(«C:Книга1.xls»)  
Set wks1 = wkb1.Sheets(«Лист1»)

There is no knowledge that is not power

 

Книга закрыта значит что Excel файл не открыт. Желательно чтобы он не открывался. А данные просто считывались с файла.

 

Johny

Пользователь

Сообщений: 2737
Регистрация: 21.12.2012

{quote}{login=olegkuzn}{date=06.05.2011 11:48}{thema=}{post}Книга закрыта значит что Excel файл не открыт. Желательно чтобы он не открывался. А данные просто считывались с файла.{/post}{/quote}  

  Можно использовать SQL запрос.  

  Dim rs As Recordset  
rs.ActiveConnection = «Provider=Microsoft.ACE.OLEDB.12.0;» & _  
                           «Data Source=» & ПУТЬ_К_КНИГЕ_1 & «;» & _  
                           «Extended Properties=»»Excel 12.0;HDR=Yes;IMEX=1;»»;»  
rs.Source = «SELECT * FROM Лист1»  
rs.Open  

  Range(«A1»).CopyFromRecordset rs

There is no knowledge that is not power

 

Johny

Пользователь

Сообщений: 2737
Регистрация: 21.12.2012

Поправочка  

  rs.Source = «SELECT * FROM [Лист1$]»

There is no knowledge that is not power

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

Так например:  

    Sub ПримерИспользования_GetFileName()  
ИмяФайла = GetFileName(«Заголовок окна», ThisWorkbook.Path) ‘ запрашиваем имя файла  
‘ ===================== другие варианты вызова функции =====================  
‘ текстовые файлы, стартовая папка не указана  
‘ ИмяФайла = GetFileName(«Выберите текстовый файл», , «Текстовые файлы (*.txt),»)  
‘ файлы любого типа из папки «C:Windows»  
‘ ИмяФайла = GetFileName(, «C:Windows», «»)  
‘ ============================================================­==============  

  If ИмяФайла = «» Then Exit Sub ‘ выход, если пользователь отказался от выбора файла  
‘MsgBox «Выбран файл: » & ИмяФайла, vbInformation  
With GetObject(ИмяФайла)  
ThisWorkbook.Sheets(1).[a1] = .Sheets(1).[a1]
.Close 0  
End With  
End Sub

 

Формульным методом:  

  With Range(«‘[Книга2.xls]Лист1’!A2:B50»)
   .FormulaArray = «=IF(‘B:test[Книга1.xls]Лист1′!A2:B50=»»»»,»»»»,’B:test[Книга1.xls]Лист1’!A2:B50)»
   .Value = .Value  
End With

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

Ещё два похожих варианта:  

  With GetObject(ИмяФайла)  
.Sheets(1).[a1:b10].Copy ThisWorkbook.Sheets(1).[a1]
‘ThisWorkbook.Sheets(1).[a1:b10].Value = .Sheets(1).[a1:b10].Value
.Close 0  
End With

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

#10

06.05.2011 13:01:50

Саму функцию забыл…  

  Function GetFileName(Optional ByVal Title As String = «Выберите файл для обработки», _  
Optional ByVal InitialPath, _  
Optional ByVal MyFilter As String = «Книги Excel (*.xls*),») As String  
‘ функция выводит диалоговое окно выбора папки с заголовком Title,  
‘ начиная обзор диска с папки InitialPath  
‘ возвращает полный путь к выбранной папке, или пустую строку в случае отказа от выбора  
If Not IsMissing(InitialPath) Then  
On Error Resume Next: ChDrive Left(InitialPath, 1)  
ChDir InitialPath ‘ выбираем стартовую папку  
End If  
res = Application.GetOpenFilename(MyFilter, , Title, «Открыть») ‘ вывод диалогового окна  
GetFileName = IIf(VarType(res) = vbBoolean, «», res) ‘ пустая строка при отказе от выбора  
End Function

Понравилась статья? Поделить с друзьями:
  • Vba обращение к файлу excel
  • Vba обработка файлов excel
  • Vba обработка строки excel
  • Vba обновление полей word
  • Vba нумерованный список в word