На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Организуем VBA-FAQ! Если у Вас есть предложения, выскажитесь здесь: Пишем FAQ, интересно Ваше мнение
Популярные разделы FAQ:    user posted image Общие вопросы    user posted image Особенности VBA-кода    user posted image Оптимизация VBA-кода    user posted image Полезные ссылки

1. Старайтесь при создании темы указывать в заголовке или теле сообщения название офисного приложения и (желательно при работе с Office 95/97/2000) его версию. Это значительно сократит количество промежуточных вопросов.
2. Формулируйте вопросы как можно конкретнее, вспоминая (хотя бы иногда) о правилах ВЕЛИКОГО И МОГУЧЕГО РУССКОГО ЯЗЫКА, и не забывая, что краткость - сестра таланта.
3. Не забывайте использовать теги [сode=vba] ...текст программы... [/code] для выделения текста программы подсветкой!
4. Темы с просьбой выполнить какую-либо работу полностью за автора здесь не обсуждаются и переносятся в раздел ПОМОЩЬ СТУДЕНТАМ.
Модераторы: Old Bat, MIF
  
> Найти номер строки с нужной информацией , Excel
    На:
    WorksheetFunction.Match
    Application.Match
    ругается: #1004 - невозможно получить свойство Match класса WorksheetFunction.

    Нужно найти именно НОМЕР строки. Либо всю строку запихнуть в переменную класса Range, чтобы я мог в ней другие столбцы менять.
      ExpandedWrap disabled
        RangeToSearch.Select
        Selection.Find(What:=ValueToSearch).Activate
        MsgBox ActiveCell.Row
        Select не канает.
        Надо просто получить эту строку, не меняя положения курсора. Если я сделаю Range("НужныйДиапазон").Find, то он мне найдёт непосредственно эту ячейку, верно? А как мне найти соседнюю справа, например?
        Сообщение отредактировано: Jin X -
          Цитата Jin X @
          как мне найти соседнюю справа, например?

          Если ты знаешь строку и столбец найденной ячейки, то взять "соседнюю справа" - это, конечно, задача совершенно нерешаемая...
            А кроме как через Address можно как-то узнать номер строки и столбца найденной ячейки?
              Не понял... номер строки и номер столбца - недостаточно, что ли?
                Address содержит строку вида $A$10 - выуживать из неё номер строки (особенно) и столбца не очень удобно.
                Может, есть другое свойство, которое содержит эти номера в цифровом виде?
                  Jin X, Если по каким-то причинам - Вы не хотите использовать свойства Row и Column (которые Вам и предлагал использовать Akina, смотрите сообщ.#2, 4), то есть и другие способы добраться до соседней ячейки :)

                  ExpandedWrap disabled
                    Private Sub Test()
                        Dim RangeToSearch As Range, CellFind As Range, FindText As String
                        
                        FindText = "Чё мы ищем"
                        
                        Set RangeToSearch = Range("A:A") 'Columns(1)
                        Set CellFind = RangeToSearch.Find(FindText, , xlValues, xlWhole)
                        
                        If Not CellFind Is Nothing Then
                           MsgBox Cells(CellFind.Row, CellFind.Column + 1).Address 'Akina
                          
                           MsgBox CellFind.Next.Address
                           MsgBox CellFind(1, 2).Address
                           'MsgBox CellFind.Item(1, 2).Address
                           MsgBox CellFind.Cells(1, 2).Address
                           MsgBox CellFind.Offset(, 1).Address 'Учитывает об'един. ячейки
                        Else
                           MsgBox "Ничего не найдено"
                        End If
                    End Sub
                  Сообщение отредактировано: pashulka -
                    Так, я не знал, что Row и Column будут выдавать нужные позиции, я думал, что там будет 1, 1 :)

                    Добавлено
                    Спасибо!
                      Несмотря на то, что стандартная функция рабочего листа ПОИСКПОЗ()/MATCH() была отвергнута :( я всё-таки перечислю некоторые случаи, при которых применение WorksheetFunction.Match действительно приведёт к возникновению ошибки #1004 и может быть этот опус кому-нибудь да пригодится ;)

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

                      Если изначально это сделать затруднительно, то можно воспользоваться, например, свойствами Columns/Rows об'екта Range, т.е.

                      ExpandedWrap disabled
                        Dim iSource As Range, iFindText As String ', iRow As Variant
                            
                        Set iSource = Range("A1:C100")
                        iFindText = "Что ищем ?"
                            
                        iRow = WorksheetFunction.Match(iFindText, iSource.Columns(1), 0)


                      2) Искомое значение банально отсутствует в столбце.

                      3) Искомое значение всё-таки наличествует, но функция его не находит, ибо чувствительна к типам, например, если мы ищем число 100, а в столбце наличествует текст "100" (или наоборот) Это кстати, очень распространённый вариант, из-за которого многие предпочитают мучить метод Find об'екта Range, который лишён этого недостатка(особенности)

                      4) Длина искомого текста больше 255 символов (касается и некоторых других функций, а также метода Find)

                      P.S. И напоследок прилагается пример поиска, где нет необходимости мучить On Error Resume Next ( и т.п.)

                      ExpandedWrap disabled
                        Dim iSource As Range, iFindText As Variant, iRow As Variant
                         
                        Set iSource = Range("A:A") 'можно указать свой столбец
                        iFindText = 100 '"Что ищем ?"
                            
                        iRow = Application.Match(iFindText, iSource, 0)
                         
                        If Not IsError(iRow) Then '
                           MsgBox "Номер найденной строки #" & iRow
                        Else
                           MsgBox "Не срослось ..."
                        End If
                        Странно. Почему-то находит только при:
                        Set Res = .Range("Коды").Find(Int(Target), , xlValues, xlPart)
                        а при:
                        Set Res = .Range("Коды").Find(Int(Target), , xlValues, xlWhole)
                        не находит ничего :(

                        Target = "10"
                        Столбец "Коды" содержит числа, без формул даже (формат ячеек - числовой)

                        В чём дело?
                          Если при вводе чисел не было допущено очепяток, то, по всей видимости, собака порылась именно в формате, например, указано число десятичных знаков больше 0, в результате чего 10 отображается как 10,00. Бороться с таким безобразием можно, например, так Range("Коды").Find(Target, , xlFormulas, xlWhole)
                            Да, собака в этом. Но там стояли не десятичные знаки, а вот так:
                            # ##0_ ;[Красный]-# ##0\
                            Разделение групп и... (пробел после?)
                            Благодарю!

                            Добавлено
                            Сделал просто числовой формат 0
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0551 ]   [ 16 queries used ]   [ Generated: 20.09.24, 08:28 GMT ]