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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2010, 13:30   #1
r0tten
Новичок
Джуниор
 
Регистрация: 25.01.2010
Сообщений: 3
По умолчанию Как избавиться от (Error 91)

Итак задача(необходимо выполнить в VBA):
Нужно в Excel-файле найти на 1-ом Листе, значение формата: "################" (16 цифр).
Затем в строке где оно присутствует найти: "*##.##" либо "*##,##"
И записать эти значения в текстовый файл.

Вот что написал я:

Код:
Sub ExcelObrab(PathFile, PathDir) 'PathFile и PathDir пути к Excel-документу и к папке содержащую этот файл
    Dim oExcel As New Excel.Application
    Dim oWbk As Workbook
    Dim c As Range
    Dim c2 As Range
    Dim cForFind As Range
    Dim c2ForFind As Range
    Dim FN As Integer
    Dim Text As String
    Dim Text2 As String
    FN = FreeFile
    Open PathDir & "\outputfile.txt" For Output As FN
    
    Set oWbk = Workbooks.Open(PathFile)
    Set cForFind = Worksheets(1).Cells
    Set c2ForFind = Worksheets(1).Rows
    With cForFind
       Set c = .Find("????????????????", LookIn:=xlValues, LookAt:=xlWhole) ' поиск 1-го значения
       If Not c Is Nothing Then
        firstAddress = c.Address
        c2ForFind = c.Row
        Do
            With c2ForFind 'поиск 2-го значения
                Set c2 = .Find("??.??", LookIn:=xlValues, LookAt:=xlPart)
                If Not c2 Is Nothing Then
                    Text = c
                    Text2 = c2
                    Print #1, Text & "    " & Text2 'запись в файл
                Else
                    Set c2 = .Find("??,??", LookIn:=xlValues, LookAt:=xlPart)
                    If Not c2 Is Nothing Then
                        Text = c
                        Text2 = c2
                        Print #1, Text & "    " & Text2 'запись в файл
                    End If
                End If
            End With
            Set c = .FindNext(c)
        Loop While (Not c Is Nothing) And (c.Address <> firstAddress) 'здесь выскакивает ошибка 
        
       End If
    End With
    ActiveWorkbook.Close
    Excel.Application.Quit
    Close FN
End Sub
Выскакивает ошибка Object variable or With block variable not set (Error 91) в выделенной строчке.
r0tten вне форума Ответить с цитированием
Старый 25.01.2010, 13:52   #2
Xpoft
Пользователь
 
Регистрация: 25.11.2009
Сообщений: 55
По умолчанию

Set c = .Find("????????????????", LookIn:=xlValues, LookAt:=xlWhole) ' поиск 1-го значения
По моему если у вас ничего не нашлось то с is nothing и проблема возникает вот с этим:
c.Address <> firstAddress , c.Address не понятно что такое вот и ошибка
Не бывает сложных задач, бывают сложные решения
Xpoft вне форума Ответить с цитированием
Старый 25.01.2010, 14:21   #3
The_Prist
Участник клуба
 
Аватар для The_Prist
 
Регистрация: 17.07.2009
Сообщений: 1,088
По умолчанию

Изначальная причина ошибки здесь
Код:
Set c2 = .Find("??,??", LookIn:=xlValues, LookAt:=xlPart)
Т.к. Вы во второй раз ведете поиск и меняете значение для поиска, то далее вот эта строка
Код:
Set c = .FindNext(c)
будет искать именно по второму занчению - "??,??". И конечно значение с в указанной строке будет равно - ничто. И таки да - в таком случае c.Address вызовет ошибку.
WebMoney - R298726502453; Яндекс.Деньги - 41001332272872
www.excel-vba.ru
The_Prist вне форума Ответить с цитированием
Старый 25.01.2010, 14:41   #4
r0tten
Новичок
Джуниор
 
Регистрация: 25.01.2010
Сообщений: 3
По умолчанию

Спасибо большое!
Не подскажете как лучше избавиться от этой ошибки? Создать отдельную процедуру для поиска второго значения?

Хм... по моему проблема есть в этой строчке:
Код:
c2ForFind = c.Row
значение не присваивается... что тут неверно? и как тогда сделать поиск по нужной строчке?

Последний раз редактировалось r0tten; 25.01.2010 в 15:31.
r0tten вне форума Ответить с цитированием
Старый 25.01.2010, 16:12   #5
The_Prist
Участник клуба
 
Аватар для The_Prist
 
Регистрация: 17.07.2009
Сообщений: 1,088
По умолчанию

Цитата:
Сообщение от r0tten Посмотреть сообщение
по моему проблема есть в этой строчке:
Код:
c2ForFind = c.Row
Код:
Set c2ForFind = c.Row
Если все равно не получится - при первом цикле просто записывайте адреса найденных строк в строковую переменную. Затем присвойе переменной значение диапазона из этой строковой переменной. А вторым циклом ищите в этом диапазоне значения.
WebMoney - R298726502453; Яндекс.Деньги - 41001332272872
www.excel-vba.ru

Последний раз редактировалось The_Prist; 25.01.2010 в 16:15.
The_Prist вне форума Ответить с цитированием
Старый 26.01.2010, 05:19   #6
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

1. The_Prist абсолютно прав. Если Вы используете метод Find, то метод FindNext будет использовать последние определенные опции. Поэтому, при такой организации поиска, от FindNext нужно отказаться.
2. Т.к. переменная c2ForFind имеет тип Range (что правильно), то присваивать ей нужно не число, а устанавливать диапазон. Хотя, я считаю, что эту переменную использовать вообще ни к чему.
3. В Вашем условии выхода из цикла есть лишняя проверка. Т.к. в цикл мы входим при условии, что If Not c Is Nothing, то зачем проверять это при выходе?
4. Учитывая все вышесказанное, фрагмент Вашего кода, определенный методом With, нужно изменить. Например, так:
Код:
With cForFind
    Set c = .Find("????????????????", LookIn:=xlValues, LookAt:=xlWhole) ' поиск 1-го значения
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            Set c2 = Rows(c.Row).Find("??.??", LookIn:=xlValues, LookAt:=xlPart) 'поиск 2-го значения
            If Not c2 Is Nothing Then
                Text = c
                Text2 = c2
                Print #1, Text & "    " & Text2 'запись в файл
            Else
                Set c2 = Rows(c.Row).Find("??,??", LookIn:=xlValues, LookAt:=xlPart)
                If Not c2 Is Nothing Then
                    Text = c
                    Text2 = c2
                    Print #1, Text & "    " & Text2 'запись в файл
                End If
            End If
            Set c = .Find("????????????????", after:=c, LookIn:=xlValues, LookAt:=xlWhole)
        Loop While c.Address <> firstAddress
    End If
End With
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 26.01.2010, 06:47   #7
r0tten
Новичок
Джуниор
 
Регистрация: 25.01.2010
Сообщений: 3
По умолчанию

Большое спасибо всем отписавшимся.

SAS888
Вам я очень благодарен за приведённый код.)
r0tten вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как избавиться от депрессии... :( ? Alex Cones Свободное общение 79 01.12.2009 14:05
Как решить проблему с Error in loading DLL (Error 48)? Klim Bassenger Microsoft Office Excel 4 23.10.2009 13:44
Как избавиться от ненужных чисел Славный Общие вопросы Delphi 1 09.06.2008 22:40
как избавиться от 2.26188E+19?? banker Microsoft Office Excel 11 12.12.2007 09:35
как избавиться от закладки ЧИЖ Общие вопросы Delphi 3 24.06.2007 00:05