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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2010, 22:02   #1
alec
 
Регистрация: 20.04.2010
Сообщений: 9
По умолчанию Как организовать поиск значения ячейки по всем листам

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

Sub brash()
Dim wsh As Worksheet
Dim s As String, a As String
Dim i As Integer, j As Integer, n As Integer
iRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
iClm = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1
s = "Искомое значение"
For n = 1 To ThisWorkbook.Worksheets.Count
ThisWorkbook.Worksheets(n).Activate
For i = ActiveSheet.UsedRange.Row To iRow
For j = ActiveSheet.UsedRange.Column To iClm
If ActiveSheet.Cells(i, j).Value = s Then
ActiveSheet.Cells(i, j).Interior.ColorIndex = 4
Exit For
End If
Next j
Next i
Next n
End Sub

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

Будьте добры помочь. Может есть какая то функция которая всё это делает проще простого.
alec вне форума Ответить с цитированием
Старый 24.04.2010, 22:50   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

во-первых, внесите это
Код:
iRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
iClm = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1
в цикл по N, чтобы определять границы поиска каждый раз для своего листа.
во-вторых, цикл по листам закрутите не с первого листа, а с текущего (или даже следующего) до конца и останавливайтесь, как только что-то нашлось
Код:
For n = activesheet.index To ThisWorkbook.Worksheets.Count
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 25.04.2010, 02:39   #3
alec
 
Регистрация: 20.04.2010
Сообщений: 9
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
во-первых, внесите это
Код:
iRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
iClm = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1
в цикл по N, чтобы определять границы поиска каждый раз для своего листа.
во-вторых, цикл по листам закрутите не с первого листа, а с текущего (или даже следующего) до конца и останавливайтесь, как только что-то нашлось
Код:
For n = activesheet.index To ThisWorkbook.Worksheets.Count
Спасибо за ответ
Собственно вопрос в том и состоит как остановить цикл по N при нахождении нужного значения Подскажите пожалуйста
alec вне форума Ответить с цитированием
Старый 25.04.2010, 03:03   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

остановить цикл - Exit For, остановить выполнение процедуры - Exit Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 25.04.2010, 15:48   #5
alec
 
Регистрация: 20.04.2010
Сообщений: 9
По умолчанию

Если я использую эту конструкцию:
For n = activesheet.index To ThisWorkbook.Worksheets.Count

То допустим если я руками в самом excel'e активировал последний лист а искомое значение на предыдущем, то у меня ничего не выполняется. Как организовать поиск так чтобы сначала искал на текущем а если на текущем нет то начинал перебирать все остальные?

За предыдущие ответы и советы спасибо, они мне очень помогли.
alec вне форума Ответить с цитированием
Старый 26.04.2010, 09:47   #6
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Если я правильно понял, то требуется организовать цикл по листам для поиска значений таким образом, что сначала ищем на активном листе, затем на следующем и т.д. до последнего, затем на первом и т.д. до активного. Так? Если так, то можно воспользоваться следующим примером:
Код:
Sub Main()
    Dim i As Integer, j As Integer, x As Range
    Application.ScreenUpdating = False: j = ActiveSheet.Index - 1
    For i = 1 To Sheets.Count
        j = j + 1: If j > Sheets.Count Then j = j - Sheets.Count
        Set x=Sheets(j).Cells.Find(...)
        If Not x Is Nothing Then Exit For
    Next
End Sub
В метод Find подставьте требуемые опции поиска. В случае обнаружения искомого значения, будет осуществлен немедленный выход из цикла и переменная x будет содержать объект Range найденной ячейки. Если же значение найдено не будет, то x = Nothing.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 27.04.2010, 00:14   #7
alec
 
Регистрация: 20.04.2010
Сообщений: 9
По умолчанию

да вы правильно поняли спасибо
alec вне форума Ответить с цитированием
Старый 01.05.2010, 17:01   #8
alec
 
Регистрация: 20.04.2010
Сообщений: 9
По умолчанию

Мне нужно выделить найденную ячейку.
Если я пишу вот этот код:

Sub main()
Dim i As Integer, j As Integer, x As Range
Application.ScreenUpdating = False: j = ActiveSheet.Index - 1
For i = 1 To Sheets.Count
j = j + 1: If j > Sheets.Count Then j = j - Sheets.Count
Set x = Sheets(j).Cells.Find("Искомое значение")
Worksheets(j).Select
x.Select
If Not x Is Nothing Then Exit For
Next
End Sub


То проблема в том что он мне выделяет эту ячейку если в данный момент активен лист где находится эта ячейка с искомым значением. Как мне переписать чтобы с любого листа находил и выделял?
alec вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск значения ячейки в другой, содержащей значение первой в общем тексте onenures Microsoft Office Excel 16 03.03.2012 11:49
Как организовать проверку на наличие значения при UPDATE? vladtr SQL, базы данных 2 24.02.2010 14:47
Поиск данных по всем листам книги demon_81 Microsoft Office Excel 0 20.01.2010 11:28
Окно для поиска ячейки по всем листам. TiG Microsoft Office Excel 10 07.11.2009 10:20
как организовать поиск по дате... Pitbull БД в Delphi 18 24.06.2007 22:28