Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.07.2010, 21:26   #1
Movled
 
Регистрация: 22.07.2010
Сообщений: 9
По умолчанию Макрос поиска текста на листе

Всем доброго времени суток!
Посмотрел по форуму, но не нашел решения своей задачи.
Мне нужно написать макрос, который ищет текст из буфера на листе, который может встретиться не однократно, а найдя его, выбирает последнюю найденную ячейку.
Попробовал в автоматическом режиме, но сам момент поиска из макроса вылетает.
Помогите, пожалуйста
Movled вне форума Ответить с цитированием
Старый 23.07.2010, 10:57   #2
Movled
 
Регистрация: 22.07.2010
Сообщений: 9
По умолчанию

Немного конкретизирую задачу.
Есть таблица с 2-мя листами "все" и "запчасти". Нужно по номеру запчасти из столбца 2 листа "запчасти", найти её на листе "все", причем если их несколько, то последнюю. Взять цену за единицу из листа "все" и прописать её в столбце справа от цены этой запчасти на листе "запчасти".
Я попробовал это сделать автоматически, но получил только вот это:
Цитата:
Sub Макрос1()
'
' Макрос1 Макрос
'
' Сочетание клавиш: Ctrl+й
'
Selection.Copy
Sheets("все").Select
ActiveCell.Offset(-15, -3).Range("A1").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("запчасти").Select
ActiveCell.Offset(0, 8).Range("A1").Select
ActiveSheet.Paste
ActiveCell.Offset(1, -8).Range("A1").Select
End Sub
Тут явно не хватает самого поиска. Умом понимаю, что это просто, но найти нигде не могу.
Подскажите, пожалуйста!
Вложения
Тип файла: zip Пример.zip (32.6 Кб, 38 просмотров)
Movled вне форума Ответить с цитированием
Старый 23.07.2010, 13:50   #3
EugeneS
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 472
Смех

можно, например, так, см. вложение

Нажмите кнопку "Выполнить"
Вложения
Тип файла: zip Пример (version 1).zip (34.2 Кб, 108 просмотров)
EugeneS вне форума Ответить с цитированием
Старый 23.07.2010, 14:29   #4
Movled
 
Регистрация: 22.07.2010
Сообщений: 9
По умолчанию Спасибо, EugeneS!

Только вот почему-то при переносе макроса из примера в рабочую книгу он начинает некорректно работать
Но, по крайней мере, задано направление мысли, добью вечером
Movled вне форума Ответить с цитированием
Старый 23.07.2010, 15:28   #5
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Вроде ошибка есть, проверьте, надо +2 добавить:
Range([j2], Cells(UBound(spairparts)+2, "j")).Value = WorksheetFunction.Index(spairparts, 0, 10)

P.S. Там чуть иначе надо, UsedRange всё портит, короче есть ошибки в конце диапазона, надо доработать.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 23.07.2010 в 16:00.
Hugo121 вне форума Ответить с цитированием
Старый 23.07.2010, 16:23   #6
Movled
 
Регистрация: 22.07.2010
Сообщений: 9
По умолчанию

Спасибо, буду разбираться!
Movled вне форума Ответить с цитированием
Старый 28.07.2010, 15:32   #7
Movled
 
Регистрация: 22.07.2010
Сообщений: 9
По умолчанию Спасибо, EugeneS, Hugo121

Долго разбирался в программе, в большей степени по причине отсутствия нормального справочника, но всё-таки её добил
Выкладываю то, что получилось в итоге
Вложения
Тип файла: zip Пример (version 2).zip (23.8 Кб, 129 просмотров)
Movled вне форума Ответить с цитированием
Старый 29.07.2010, 07:06   #8
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Можно гораздо проще:
Код:
Private Sub findProg()
    Dim i As Long, x As Range: Application.ScreenUpdating = False
    With Sheets("все")
    For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row
        Set x = .[B:B].Find(Cells(i, 2), .Cells(Rows.Count, 2).End(xlUp).Offset(1), , , , xlPrevious)
        If Not x Is Nothing Then Cells(i, "J") = .Cells(x.Row, "G")
    Next: End With
End Sub
Пример во вложении.
Вложения
Тип файла: rar Пример_3.rar (18.4 Кб, 280 просмотров)
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 29.07.2010 в 07:40.
SAS888 вне форума Ответить с цитированием
Старый 29.07.2010, 09:53   #9
Movled
 
Регистрация: 22.07.2010
Сообщений: 9
По умолчанию

Спасибо, SAS888, красиво! Нет предела совершенству!
Но всё, что делается между For и Next в этом примере для меня далеко от понимания.
Кстати, подскажите, что означает
Код:
[B:B]
В примере от EugeneS тоже был операнд в квадратных скобках, но в справке я не нашел, что это. Чем отличается
Код:
Range([j2], ...
от
Код:
Range("j2", ...
Movled вне форума Ответить с цитированием
Старый 29.07.2010, 11:12   #10
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

1. Квадратные скобки компилятор VBA понимает как обращение к ячейке (диапазону). Так, например, вместо Columns("B:B") можно использовать [B:B], вместо Range("A1:D10") использовать [A1:D10] и т.д. Также и для именованных ячеек (диапазонов). Согласитесь, что так просто короче.

2. В справке по VBA Excel очень подробно описан метод Find. Посмотрите. Причем, синтаксис VBA допускает либо простое перечисление параметров через запятую (очередность строго определена), либо указывать имя параметра явно. В первом случае, параметры, используемые по умолчанию можно опустить (пустые значения между запятыми), в последнем случае, их просто не нужно указывать. Так, например, строку кода
Код:
Set x = .[B:B].Find(Cells(i, 2), .Cells(Rows.Count, 2).End(xlUp).Offset(1), , , , xlPrevious)
можно записать так:
Код:
Set x = .[B:B].Find(what:=Cells(i, 2), after:=.Cells(Rows.Count, 2).End(xlUp).Offset(1), SearchDirection:=xlPrevious)
Смысл таков: ищем в столбце "B" листа, определенного методом With значение Cells(i, 2), начиная с ячейки .Cells(Rows.Count, 2).End(xlUp).Offset(1), т.е. с ячейки после последней заполненной в этом столбце. Параметр xlPrevious говорит о том, что икать нужно предыдущую ячейку. Строка If Not x Is Nothing Then... значит, что выполнять, если нашлось совпадение. Еще раз повторяю: почитайте про метод Find. У него еще много параметров, которые Вам могут пригодится в дальнейшем.

3. И еще. Обратите внимание, что макросу присвоен статус Private. Это для того, чтобы имя макроса не было видно в списке макросов. Во-первых, это ни к чему, во-вторых, т.к. макрос запускается по нажатию кнопки, то в это время, естественно, активным является лист с кнопкой, поэтому, прописывать в коде активацию листа не потребуется, в-третьих, т.к. макроса нет в списке, его невозможно запустить при другом активном листе. Важно: для того, чтобы макрос, имеющий статус Private был доступен из другого модуля (в нашем случае, из модуля листа), в коде вызова макроса используется метод Run. Т.е. если записать
Код:
Private Sub CommandButton1_Click(): findProg: End Sub
и при этом макрос findProg имеет статус Private, то будет ошибка. а если использовать
Код:
Private Sub CommandButton1_Click(): Run "findProg": End Sub
то все будет ОК.

Пользуйтесь help-ом по VBA, имеющимся в Excel. Желаю удачи.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос для поиска совпадений Dealaxer Microsoft Office Excel 18 26.09.2012 17:33
Макрос Excel поиска и вставки igorok Microsoft Office Excel 2 08.07.2009 18:49
Как выполнить макрос на защищенном листе Gennady_58 Microsoft Office Excel 3 18.04.2009 10:31
Макрос для обновления формул вручную только в одном листе Neo007 Microsoft Office Excel 7 26.09.2008 18:17
Макрос для поиска/замены Davidoff Microsoft Office Excel 1 20.01.2007 16:01