Excel макрос поиск копирование

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Sub SearchPN2()
    Dim i&, D As Object, PS&
    Dim t$, a, b, x&: x = 1
 
    uskorenie
 
    With Sheets("Фактический Aff")
        t = .[Q2]    'критерий
        PS = .Cells(.Rows.Count, 1).End(xlUp).Row
        If PS > 1 Then .Cells(2, 1).Resize(PS - 1, 13).Clear
    End With
 
    With Sheets("Base")
        PS = .Cells(1, .Columns.Count).End(xlToLeft).Column
        a = .Range(.Cells(1, 1), .Cells(1, PS)).Value
        'словарь позиций заголовков
        Set D = CreateObject("Scripting.Dictionary")
        D.CompareMode = 1
        For i = 1 To UBound(a, 2)    'перебор всех столбцов
            D.Item(Trim(a(1, i))) = i
        Next
        With Sheets("Фактический Aff")
            a = .Range(.Cells(1, 1), .Cells(1, 13)).Value
        End With
 
        PS = .Cells(.Rows.Count, 1).End(xlUp).Row
        b = .Range(.Cells(1, "AX"), .Cells(PS, "AX")).Value    'критерий будем искать только в этом столбце!
        For i = 2 To PS
            If b(i, 1) = t Then
                x = x + 1
                For ii = 1 To 13    'перебор 13 столбцов
                    If D.exists(a(1, ii)) Then    'если заголовок нужный
                        Sheets("Фактический Aff").Cells(x, ii).NumberFormat = .Cells(i, D.Item(a(1, ii))).NumberFormat
                        Sheets("Фактический Aff").Cells(x, ii).Value = .Cells(i, D.Item(a(1, ii))).Value
                    End If
                Next
            End If
        Next
    End With
 
    neuskorenie
 
End Sub

Поиск значения и копирование текста на 2 лист

konstantinp

Дата: Пятница, 24.08.2012, 17:27 |
Сообщение № 1

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

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

Сообщений: 86


Репутация:

0

±

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


Добрый день,
Помогите написать макрос.
Он должен искать по листу1 значение из ячейки А1 и при нахождении копировать эти данные, данные соседней слева ячейки и данные 1 ячейки в строке на 2 лист соответственно в столбцы А,В,С.
Значений будет много, нужно чтобы вставлял по порядку.

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

6714654.xls
(68.0 Kb)

 

Ответить

Формуляр

Дата: Пятница, 24.08.2012, 17:45 |
Сообщение № 2

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

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

Сообщений: 832


Репутация:

255

±

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


Excel 2003, 2013

Ничего не понятно. Дайте пример, что должно получиться в результате.


Excel 2003 EN, 2013 EN

 

Ответить

konstantinp

Дата: Понедельник, 27.08.2012, 08:49 |
Сообщение № 3

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

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

Сообщений: 86


Репутация:

0

±

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


Вставил руками во второй лист что должно получиться.
То есть ввожу в ячейку А1 дату, макрос должен искать все такие же даты и копировать из этой строки данные и переносить по порядку на лист2.

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

8165323.xls
(68.5 Kb)

 

Ответить

_Boroda_

Дата: Понедельник, 27.08.2012, 10:30 |
Сообщение № 4

Группа: Модераторы

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

Сообщений: 16618


Репутация:

6465

±

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


2003; 2007; 2010; 2013 RUS

Ну вот где-то так примерно:
Для запуска нужно обновить дату в А1.

в 11:31 перевложил с небольшой поправочкой

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


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

Gustav

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

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

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

Сообщений: 2398


Репутация:

985

±

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


начинал с Excel 4.0, видел 2.1

У меня какой-то такой макрик получился (если я правильно понял задание):
[vba]

Code

Sub findFromA1()

                  Dim c As Range
      Dim d As Range
      Dim firstAddress As String

                      With Sheets(1).Range(Columns(2), Columns(Columns.Count))
      Set c = .Find([A1], LookIn:=xlValues)
      If Not c Is Nothing Then
          firstAddress = c.Address
          Do
              Set d = [Лист2].Range(«A» & Rows.Count).End(xlUp).Offset(1)
              d.Offset(0, 0) = c.Parent.Cells(c.Row, 1)
              d.Offset(0, 1) = c.Offset(0, -1)
              d.Offset(0, 2) = c
              Set c = .FindNext(c)
          Loop While Not c Is Nothing And c.Address <> firstAddress
      End If
      End With

                 End Sub

[/vba]


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал GustavПонедельник, 27.08.2012, 11:38

 

Ответить

konstantinp

Дата: Понедельник, 27.08.2012, 11:37 |
Сообщение № 6

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

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

Сообщений: 86


Репутация:

0

±

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


Gustav,
Спасибо! то что нужно!
_Boroda_,
Что то не могу открыть «ошибка 404»

 

Ответить

konstantinp

Дата: Понедельник, 27.08.2012, 11:48 |
Сообщение № 7

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

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

Сообщений: 86


Репутация:

0

±

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


_Boroda_,
Это мой долбаный рабочий антивирус файлы отбивает с «кодами», остановить его не могу.
Если не сложно, можно в архиве, пазязя)
Gustav,
А можете код расписать?

 

Ответить

konstantinp

Дата: Понедельник, 27.08.2012, 11:56 |
Сообщение № 8

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

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

Сообщений: 86


Репутация:

0

±

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


_Boroda_,
Спасибо!

 

Ответить

Gustav

Дата: Понедельник, 27.08.2012, 12:14 |
Сообщение № 9

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

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

Сообщений: 2398


Репутация:

985

±

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


начинал с Excel 4.0, видел 2.1

Quote (konstantinp)

Gustav,
А можете код расписать?

В смысле прокомментировать операторы? Сам цикл я, не мудрствуя лукаво, спёр из хелпа для Find (или FindNext). Можете нажать на них F1 и всё увидите сам. Цикл будет повторяться до тех пор пока не будет снова найдено самое первое значение (контролируется по совпадению адресов текущей и самой первой найденной ячеек) — тогда цикл прекратится. После нахождения очередного значения в цикле происходит заполнение очередной строки на Листе2. Область поиска на Листе1 — начиная со второй колонки (B) и до последней (в первой же колонке у нас само значение для поиска, а также другие заранее заготовленные строки).


МОИ: Ник, Tip box: 41001663842605

 

Ответить

konstantinp

Дата: Понедельник, 27.08.2012, 13:58 |
Сообщение № 10

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

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

Сообщений: 86


Репутация:

0

±

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


Gustav,
Спасибо!
Ничего не понял))) biggrin

Сообщение отредактировал konstantinpПонедельник, 27.08.2012, 14:00

 

Ответить

konstantinp

Дата: Понедельник, 27.08.2012, 14:06 |
Сообщение № 11

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

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

Сообщений: 86


Репутация:

0

±

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


Gustav,
А если «Тоже текст5″ будет не в столбце»А», а в строке «1» над «Текст»?

d.Offset(0, 0) = c.Parent.Cells(c.Row, 1) — как тут сделать не столбец, а верхнюю строку?

Да, и еще я вставляю в книгу, где много листов — выдает ошибку.

Сообщение отредактировал konstantinpПонедельник, 27.08.2012, 14:41

 

Ответить

Gustav

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

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

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

Сообщений: 2398


Репутация:

985

±

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


начинал с Excel 4.0, видел 2.1

Quote (konstantinp)

А если «Тоже текст5″ будет не в столбце»А», а в строке «1» над «Текст»?
d.Offset(0, 0) = c.Parent.Cells(c.Row, 1) — как тут сделать не столбец, а верхнюю строку?

d.Offset(0, 0) = c.Parent.Cells(1, c.Column — 1)

Quote (konstantinp)

Да, и еще я вставляю в книгу, где много листов — выдает ошибку.

Наверное, тогда надо Sheets(1) заменить на ActiveSheet

Подозреваю также, что надо область поиска подкрутить. Как теперь надо? Всё, кроме первой строки? Или даже всё, кроме первой строки и первого столбца? Хорошо бы пример измененного файла…

P.S. Если кроме первой строки и первого столбца, то замените строку

With Sheets(1).Range(Columns(2), Columns(Columns.Count))

на

With ActiveSheet.Range(Cells(2, 2), Cells.SpecialCells(xlCellTypeLastCell))


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал GustavПонедельник, 27.08.2012, 15:18

 

Ответить

konstantinp

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

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

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

Сообщений: 86


Репутация:

0

±

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


Gustav,
сейчас скину пример.

Сообщение отредактировал konstantinpПонедельник, 27.08.2012, 15:19

 

Ответить

konstantinp

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

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

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

Сообщений: 86


Репутация:

0

±

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


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

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

7493479.rar
(13.5 Kb)

Сообщение отредактировал konstantinpПонедельник, 27.08.2012, 15:22

 

Ответить

Gustav

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

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

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

Сообщений: 2398


Репутация:

985

±

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


начинал с Excel 4.0, видел 2.1

Quote (konstantinp)

Поиск -везде кроме первой строки.

smile выполните замену из предыдущего сообщения (P.S.)


МОИ: Ник, Tip box: 41001663842605

 

Ответить

Gustav

Дата: Понедельник, 27.08.2012, 15:39 |
Сообщение № 16

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

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

Сообщений: 2398


Репутация:

985

±

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


начинал с Excel 4.0, видел 2.1

Quote (konstantinp)

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

Поиск по всем, кроме Лист2, на который пишем:
[vba]

Code

Sub findFromA1v2()

                  Dim wks As Worksheet
      Dim c As Range
      Dim d As Range
      Dim firstAddress As String

              For Each wks In ThisWorkbook.Worksheets

                 If wks.Name <> «Лист2» Then

                    firstAddress = «»
              With wks.Range(wks.Cells(2, 2), wks.Cells.SpecialCells(xlCellTypeLastCell))
                  Set c = .Find(wks.Range(«A1»), LookIn:=xlValues)
                  If Not c Is Nothing Then
                      firstAddress = c.Address
                      Do
                          Set d = [Лист2].Range(«A» & Rows.Count).End(xlUp).Offset(1)
                          d.Offset(0, 0) = wks.Cells(1, c.Column — 1)
                          d.Offset(0, 1) = c.Offset(0, -1)
                          d.Offset(0, 2) = c
                          d.Offset(0, 3) = wks.Name ‘для наглядности имя листа
                          Set c = .FindNext(c)
                      Loop While Not c Is Nothing And c.Address <> firstAddress
                  End If
              End With

                      End If

                  Next wks

         End Sub

[/vba]


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал GustavПонедельник, 27.08.2012, 15:41

 

Ответить

konstantinp

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

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

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

Сообщений: 86


Репутация:

0

±

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


Gustav,
Чо та не то.
Он смотрит на каждом листе ячейку А1 и от нее проверяет.
Можно сделать, чтобы в одном месте смотрел?

Сообщение отредактировал konstantinpПонедельник, 27.08.2012, 15:48

 

Ответить

Gustav

Дата: Понедельник, 27.08.2012, 15:53 |
Сообщение № 18

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

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

Сообщений: 2398


Репутация:

985

±

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


начинал с Excel 4.0, видел 2.1

Quote (konstantinp)

Можно сделать, чтобы в одном месте смотрел?

Можно. В строке Set c = .Find(wks.Range(«A1»), LookIn:=xlValues)

меняем wks на Worksheets(«Лист1»)

(или какой там надо Лист, если не первый)


МОИ: Ник, Tip box: 41001663842605

 

Ответить

konstantinp

Дата: Понедельник, 27.08.2012, 15:58 |
Сообщение № 19

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

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

Сообщений: 86


Репутация:

0

±

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


Gustav,
Я бы тебе медаль вручил за терпение) Спасибо!
А можешь еще помочь кое с чем?
Эти данные (сформированные) нужно разослать адресатам по Outlook, где из получившихся данных в 1 столбце адреса?

 

Ответить

Gustav

Дата: Понедельник, 27.08.2012, 16:13 |
Сообщение № 20

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

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

Сообщений: 2398


Репутация:

985

±

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


начинал с Excel 4.0, видел 2.1

Quote (konstantinp)

А можешь еще помочь кое с чем?
Эти данные (сформированные) нужно разослать адресатам по Outlook, где из получившихся данных в 1 столбце адреса?

Не, не могу. В Outlook’е рука не набита и модель ее объектную не очень знаю. Плюс, насколько смутно помню, там всякие рогатки безопасности всплывают при серийной отправке. Типа надо сидеть и на каждый адрес ОК кликать. Хотя может уже и не так сурово, давненько я с этим ковырялся.

Кинь предложение в раздел «Работа» или, может, тут кто из ребят заинтересуется, сделает.


МОИ: Ник, Tip box: 41001663842605

 

Ответить

I have a large spreadsheet sent to me twice a month. I can record a couple of macros that help me delete the columns I don’t need and to sort the data, but I don’t know how to proceed from there. I need to find a value in Column F, select all Rows that contain that data, and then copy all of the Rows to a new sheet. If I try to record a macro while doing that via CTRL F, CTRL A, Close, CTRL-, etc. the resulting macro only selects the «Row Numbers» that contain the data, and then goes on from there. Since the actual number of the rows that contain the data will change twice a month it won’t work for me.

Below is what it generates:

Sub Macro910()

‘ Macro910 Macro


    Rows(«981:3588»).Select
    Range(«F981»).Activate
    Selection.Copy
    Sheets.Add After:=ActiveSheet
    ActiveSheet.Paste
    Range(«A1»).Select
End Sub

Is there a way to get a macro to find the data in Column F, select all of the rows that contain the data, and copy all of the rows to a new sheet?

Any help would be greatly appreciated.

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

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

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

Sheets("Данные").Select
For y = 1 To Cells.SpecialCells(xlLastCell).Row
    If Cells(y, 1) = "123" Then
        Exit For
    End If
Next y
MsgBox "Нашел в строке: " + CStr(y)

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

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

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

Sheets("Данные").Select
Set fcell = Columns("A:A").Find("123")
If Not fcell Is Nothing Then
    MsgBox "Нашел в строке: " + CStr(fcell.Row)
End If

Вкратце опишу что делают строчки данного кода:
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»

With Worksheets(1).Range("A1:A50")
  Set c = .Find("asd", LookIn:=xlValues)
  Do While Not c Is Nothing
    c.Value = "qwe"
    Set c = .FindNext(c)
  Loop
End With

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

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

With Worksheets(1).Range("A1:A50")
  Set c = .Find("asd", lookin:=xlValues)
  If Not c Is Nothing Then
    firstResult = c.Address
    Do
      c.Font.Bold = True
      Set c = .FindNext(c)
      If c Is Nothing Then Exit Do
    Loop While c.Address <> firstResult
  End If
End With

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

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

With Worksheets(1).Range("A1:A50")
  Set c = .Find("asd", lookin:=xlValues)
  If Not c Is Nothing Then
    firstResult = c.Address
    Do
      c.Font.Bold = True
      Set c = .Find("asd", After:=c, lookin:=xlValues)
      If c Is Nothing Then Exit Do
    Loop While c.Address <> firstResult
  End If
End With

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

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

lLastRow = Cells.SpecialCells(xlLastCell).Row
lLastCol = Cells.SpecialCells(xlLastCell).Column
Application.FindFormat.Font.Italic = True
With Worksheets(1).Range(Cells(1, 1), Cells(lLastRow, lLastCol))
  Set c = .Find("", SearchFormat:=True)
  Do While Not c Is Nothing
    c.Font.Italic = False
    Set c = .Find("", After:=c, SearchFormat:=True)
  Loop
End With

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

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

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

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

With Application.FindFormat.Font 
  .Name = "Arial" 
  .FontStyle = "Regular" 
  .Size = 10 
End With

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

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

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

Set c = Worksheets(1).UsedRange.Find("*", SearchDirection:=xlPrevious)
If Not c Is Nothing Then
  lLastRow = c.Row: lLastCol = c.Column 
Else
  lLastRow = 1: lLastCol = 1
End If
MsgBox "lLastRow=" & lLastRow & " lLastCol=" & lLastCol

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

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

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

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

With Worksheets(1).Cells
  Set c = .Find("т??т*", LookIn:=xlValues, LookAt:=xlWhole)
  If Not c Is Nothing Then
    firstResult = c.Address
    Do
      c.Font.Color = RGB(255, 0, 0)
      Set c = .FindNext(c)
      If c Is Nothing Then Exit Do
    Loop While c.Address <> firstResult
  End If
End With

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

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

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

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

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

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

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

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

d = Date
Set c = Cells.Find(d, LookIn:=xlFormulas, LookAt:=xlWhole)
If Not c Is Nothing Then
  MsgBox "Нашел"
Else
  MsgBox "Не нашел"
End If

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

d = #3/1/2018#
Set c = Cells.Find(d, LookIn:=xlFormulas, LookAt:=xlWhole)
If Not c Is Nothing Then
  MsgBox "Нашел"
Else
  MsgBox "Не нашел"
End If

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

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

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

d = #3/1/1900#
Set c = Cells.Find(Format(d, "m/d/"), LookIn:=xlFormulas, LookAt:=xlPart)
If Not c Is Nothing Then
  MsgBox "Нашел"
Else
  MsgBox "Не нашел"
End If

Копирование строк по условию из существующего набора данных в отдельную таблицу с помощью кода VBA Excel. Определение числа строк в исходной таблице.

Условие задачи

Есть исходная таблица (набор данных) со списком файлов, расположенных в двух папках. Необходимо строки таблицы, содержащие слово «Изображения», скопировать в новую таблицу, расположенную ниже исходного набора данных, через одну пустую строку. В результате должно получиться, как на изображении ниже:

Решение задачи

Код VBA Excel для копирования строк исходного набора данных по условию в отдельную таблицу:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

Sub KopirovaniyeStrok()

Dim s As String, n As Long, m As Long, i As Long

‘Задаем условие поиска

s = «Изображения»

‘Определяем номер последней строки исходной таблицы

n = Range(«A2»).CurrentRegion.Rows.Count

‘Задаем номер первой строки новой таблицы

m = n + 2

    For i = 2 To n

        ‘Проверяем условие

        If Cells(i, 1) = s Then

            ‘Копируем строку, удовлетворяющую условию, в новую таблицу

            Cells(i, 1).Resize(1, 3).Copy Cells(m, 1)

            m = m + 1

        End If

    Next

End Sub

При желании, можно добавить в эту процедуру еще одну переменную и автоматическое определение количества столбцов:

Dim c As Long

c = Range(«A2»).CurrentRegion.Columns.Count

Тогда выражение копирования примет следующий вид:

Cells(i, 1).Resize(1, c).Copy Cells(m, 1)


Понравилась статья? Поделить с друзьями:
  • Excel макрос поиск значения в ячейках
  • Excel макрос поиск замена если нет поиск
  • Excel макрос поиск в массиве по
  • Excel макрос поиск в диапазоне
  • Excel макрос подстановка значений