Столкнулся со следующей проблемой. Если я запускаю макрос сразу после открытия файла, в котором он содержится - всё работает как часы. Но если я его повторно запущу, то возникает ошибка: Run-time error '91 Object variable or With block variable not set' в строчке If rng.Value Like txt & "*" Then. Вопрос: почему ошибка возникает ТОЛЬКО при повторном запуске макроса? Почему переменной rng при повторном запуске не присваивается значение? Объясните, пожалуйста.
Часть макроса, в котором появляется ошибка:
Код
Dim txt As String, rng As Range, I As Integer, n As String, ws As Worksheet
Application.ScreenUpdating = False
n = ActiveSheet.Name
For I = 1 To UBound(Regions)
With Workbooks("имя_файла" .Worksheets("Report 2" .Range("A:A"
txt = CStr(Regions(I))
Set rng = .find(What:=txt, LookIn:=xlValues)
If txt <> "Russia|B2B Partner Support" Then
MsgBox "txt = " & txt 'для тестов
If rng Is Nothing Then 'для тестов
MsgBox "Nothing" 'для тестов =========>>>> срабатывает это условие. То есть переменной rng при повторном запуске не присваивается 'значение.
Else: MsgBox "" & rng.Value 'для тестов
End If
Else
Set rng = .find(What:=txt, LookIn:=xlValues, LookAt:=xlWhole)
MsgBox "" & rng.Address 'для тестов ===========================> здесь валится. Оно и понятно, так как rng = Nothing
End If
If rng.Value Like txt & "*" Then '<=====================================или здесь
Set ws = Worksheets.Add
ws.Name = txt
ws.Move After:=Worksheets(n)
End If
End With
Next I
Спасибо. Попробую сформулировать проблему понятнее. Убрал лишнее из макроса, чтобы было нагляднее
Код
Dim txt As String, rng As Range, I As Integer, n As String, ws As Worksheet
n = ActiveSheet.Name
For I = 1 To UBound(Regions)
With Worksheets("Report 2" .Range("A:A"
txt = CStr(Regions(I))
Set rng = .find(What:=txt, LookIn:=xlValues)
If rng.Value Like txt & "*" Then '<<<<============ Если открыть файл и сразу выполнить макрос, всё в порядке. Если запустить макрос повторно вылезет ошибка в этом месте. Если файл снова переоткрыть, макрос сработает. При повторном запуске макроса переменной rng не присваивается значение. Почему?
Set ws = Worksheets.Add
ws.Name = txt
ws.Move After:=Worksheets(n)
End If
End With
Next I
Я, в свою очередь попробую сформулировать свою просьбу понятнее: оформляйте коды ТЕГАМИ. Неужели так трудно выделить текст кода и нажать кнопочку <...>?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Исправил отображение. К сожалению, не могу выложить этот файл на форум. Суть в следующем: 1. Открываю файл. 2. Запускаю процедуру, которая вызывает функцию открытия другого файла. Копирую из этого файла два листа в исходный файл.
Код
Option Explicit
Код
Option Base 1
Код
Sub Count()
'выбираем файл отчёта и копируем листы "Report 2" и "Data"
Dim FileNameWI As String 'путь к файлу отчёта
FileNameWI = GetFilePath("Select WI report", , "Excel", "*.xls" 'запрашиваем имя файла function GetFilePath
If FileNameWI = "" Then Exit Sub 'выходим, если пользователь отказался от выбора файла
'MsgBox "You selected: " & FileName, vbInformation
With Workbooks.Open(FileNameWI, ReadOnly:=True) 'копируем лист
.Sheets("Report 2".Copy Before:=ThisWorkbook.Sheets(1)
.Sheets("Data".Copy Before:=ThisWorkbook.Sheets(2)
.Close
End With
На листе "Report 2" в столбике A:A находится список неких групп. Мне необходимо для каждой такой группы создать лист в исходном файле с названием, близким к названию этой группы. Названия листов хранятся в массиве.
Код
Dim Regions As Variant
Regions = Array("имя 1", "имя 2")
а далее сам код, где возникает ошибка:
Код
Dim txt As String, rng As Range, I As Integer, n As String, ws As Worksheet
n = ActiveSheet.Name
For I = 1 To UBound(Regions)
With Worksheets("Report 2").Range("A:A")
txt = CStr(Regions(I))
Set rng = .find(What:=txt, LookIn:=xlValues)
If rng.Value Like txt & "*" Then '<<<<============ Если открыть файл и сразу выполнить макрос, всё в порядке. Если запустить макрос повторно вылезет ошибка в этом месте. Если файл снова переоткрыть, макрос сработает. При повторном запуске макроса переменной rng не присваивается значение. Почему?
Set ws = Worksheets.Add
ws.Name = txt
ws.Move After:=Worksheets(n)
End If
End With
Next I
Ну как-то куски кода в целом сложить непросто, но первый же вопрос: а если на листе Report 2 не будет найдено соответствующее значение txt, чему будет равняться rng?
Я уже дал подсказку, как надо проверить. Но почему-то автор не хочет её использовать. Плюс я не понимаю, зачем эта строка:
Код
If rng.Value Like txt & "*" Then
ведь в rng содержится текст, который равен txt. Следовательно Вы проверяете этим...Что, собственно? Кстати, по вопросу в первый раз находит, во второй нет: может следует явно указать по целой ячейке ищете или по части?
Код
Set rng = .find(What:=txt, LookIn:=xlValues,LookAt:=xlWhole)'если по части ячейки - LookAt:=xlPart
а то во время работы эти настройки могут быть изменены и не указывая их принудительно Вы ищите с теми параметрами, которые были установлены по время работы с листом/книгой.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Извините, кнопка "Цитировать" у меня почему-то корректно не работает (по нажатию ничего не происходит, Chrome Версия 38.0.2125.104 m) Отвечаю по пунктам:
Цитата
1. а если на листе Report 2 не будет найдено соответствующее значение txt, чему будет равняться rng?
Выдаёт ту же ошибку, что и в топике. Я немного ковырял в эту сторону. После повторного запуска макроса после строчки txt = CStr(Regions(I)) добавлял MsgBox txt.
Код
txt = CStr(Regions(I))
MsgBox "txt = " txt 'Сообщение успешно отображало нужное значение. Но сам я склонен думать, что проблема где-то здесь
Set rng = .find(What:=txt, LookIn:=xlValues) 'это отрабатывает
If rng.Value Like txt & "*" Then ' а здесь ошибка
2. Про
Код
If rng.Value Like txt & "*" Then
Это мой частный случай. На всякий случай убрал & "*", но результата это не дало. Оно и понятно, эта строчка стоит ниже строчки кода, на которой отваливается макрос.
Цитата
3. Кстати, по вопросу в первый раз находит, во второй нет: может следует явно указать по целой ячейке ищете или по части?
Опять же, это мой частный случай. Пробовал играться, но результата это не принесло. 4. Про подсказку
Код
If Not rng is nothing then
не понял. В первом моём сообщение как раз аналогичная структура.
Код
If txt <> "Russia|B2B Partner Support" Then
MsgBox "txt = " & txt 'для тестов
If rng Is Nothing Then 'для тестов
MsgBox "Nothing" 'для тестов =========>>>> срабатывает это условие. То есть переменной rng при повторном запуске не присваивается 'значение.
Else: MsgBox "" & rng.Value 'для тестов
End If
К сожалению, не могу выложить файл по соображениям корпоративной политики. Понимаю, что без этого проблему найти намного труднее. В любом случае, спасибо за советы. Если удастся найти проблему - отпишу.
Без файла точно никто ничего больше не скажет. Сидеть и гадать не о чем, т.к. дело скорее всего еще в каких-то действиях и искомый текст уже не находится.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Здравствуйте, спешу сообщить, что решил свою проблему. Изменил
Код
Set rng = .find(What:=txt, LookIn:=xlValues)
на
Код
Set rng = .find(What:=txt, LookIn:=xlValues, LookAt:=xlPart)
и ошибка ушла. Спасибо The_Prist. Видимо действительно проблема была в
Цитата
The_Prist пишет: а то во время работы эти настройки могут быть изменены и не указывая их принудительно Вы ищите с теми параметрами, которые были установлены по время работы с листом/книгой.
Дьявол кроется в деталях. Сам я был уверен до этого, что пробовал такой вариант, так как в процессе отладки использовал миллион разных комбинаций. Оказалось, что нет.
Добрый день. Тоже борюсь с похожей ошибкой. Есть код:
Код
Set findT = Worksheets(i).Range("E:H").Find("Полная нагрузка с потерями", , xlValues, xlPart)
' поиск количества вхождений
If Not findT Is Nothing Then
Adres = findT.Address
Do
cnt = cnt + 1
Set findT = Worksheets(i).Range("E:H").FindNext(findT)
Loop While Not findT Is Nothing And findT.Address <> Adres
Else
MsgBox "Не найдено на листе: " & Worksheets(i).Name
Exit Sub
End If
Если на нужном листе текст поиска встречается один раз, то на Loop While вылетает с этой ошибкой, если больше одного раза, то все норм.
Причем в других книгах все нормально срабатывало с любым кол-ом вхождений.
Добрый день. Столкнулся с такой проблемой при открытии файла запускается макрос и появляется ошибка "runtime Error 91". А когда любой другой файл excel открыт то ошибки уже нет. Прошу прощения я в пока в VBA пока полный профан. Рад буду любой помощи. Всем СПС.
Спасибо но вы удалили макрос который должен сортировать при открытии файла колонку под кнопкой ДН . Так у меня тоже работает. Идея была такой что бы макрос сортировал при открытии файла и оставалась возможность запуска макроса по нажатия функциональных кнопок. Если возможно это как то реализовать буду очень рад. Спасибо что откликнулись.
Ігор Гончаренко, Спасибо но вы удалили макрос который должен сортировать при открытии файла колонку под кнопкой ДН . Так у меня тоже работает. Идея была такой что бы макрос сортировал при открытии файла и оставалась возможность запуска макроса по нажатия функциональных кнопок. Если возможно это как то реализовать буду очень рад. Спасибо что откликнулись.
Ігор Гончаренко, только что попробовал запустить исходный файл все заработало без правок ,странно, удалил перед этим надстройку, может в этом была проблема . Спасибо тебе добрый человек, ОГРОМНОЕ СПАСИБО!!! На этом форуме есть рейтинг ?
День добрый, что то наковырял в настройках, сейчас у меня тупик Выскакивает ошибка «Object variable or With block variable not set»
При чем в старых версиях данного файла макрос работает. Наверно изменил настройки книги в котором макрос и сейчас хз где и что искать. Прошу подсказать, как поправить.
Суть макроса: Поиск информации в во всех файлах, которые лежат в папке C:\ПОИСК и вывод найденной информации на отдельный лист. Полезная штука для меня.
Код
'Attribute VB_Name = "search_in_files"
Public Sub Поиск_во_всех_файлах()
Dim fso As Object
Dim fld As Object
Dim strSearch As String
Dim strPath As String
Dim strFile As String
Dim wOut As Worksheet
Dim wbk As Workbook
Dim wks As Worksheet
Dim lRow As Long
Dim rFound As Range
Dim strFirstAddress As String
On Error GoTo ErrHandler
Application.ScreenUpdating = False
strPath = "C:\ПОИСК" 'поменять на ваш путь
strSearch = InputBox("Поиск в папке C ПОИСК:", "Форма поиска", "")
If strSearch = "" Then
Exit Sub
End If
Set wOut = Worksheets.Add
lRow = 1
With wOut
.Cells(lRow, 1) = "Книга"
.Cells(lRow, 2) = "Лист"
.Cells(lRow, 3) = "Ячейка"
.Cells(lRow, 4) = "Результат"
Set fso = CreateObject("Scripting.FileSystemObject")
Set fld = fso.GetFolder(strPath)
strFile = Dir(strPath & "\*.xls*")
Do While strFile <> ""
Set wbk = Workbooks.Open(fileName:=strPath & "\" & strFile, UpdateLinks:=0, ReadOnly:=True, AddToMRU:=False)
For Each wks In wbk.Worksheets
Set rFound = wks.UsedRange.Find(strSearch)
If Not rFound Is Nothing Then
strFirstAddress = rFound.Address
End If
Do
If rFound Is Nothing Then
Exit Do
Else
lRow = lRow + 1
.Cells(lRow, 1) = wbk.Name
.Cells(lRow, 2) = wks.Name
.Cells(lRow, 3) = rFound.Address
.Cells(lRow, 4) = rFound.Value
End If
Set rFound = wks.Cells.FindNext(After:=rFound)
Loop While strFirstAddress <> rFound.Address
Next
'wbk.Close (False)
strFile = Dir
Loop
.Columns("A:D").EntireColumn.AutoFit
End With
MsgBox "Все"
ExitHandler:
Set wOut = Nothing
Set wks = Nothing
Set wbk = Nothing
Set fld = Nothing
Set fso = Nothing
Application.ScreenUpdating = True
Exit Sub
ErrHandler:
MsgBox Err.Description, vbExclamation
Resume ExitHandler
End Sub
Office 365 ошибка не воспроизвелась. Обычно такая ошибка возникает если где то в коде не закрыт открытый блок With...End With, If..End If,For...Next, Select...End Select, ну и т.п. Для наглядности в коде лучше использовать табуляцию. Разные блоки разносить по разным уровням. Посмотрите Ваш же код с табуляцией. Так быстрее можно найти какой блок не закрыт
Скрытый текст
Код
Public Sub Поиск_во_всех_файлах()
Dim fso As Object
Dim fld As Object
Dim strSearch As String
Dim strPath As String
Dim strFile As String
Dim wOut As Worksheet
Dim wbk As Workbook
Dim wks As Worksheet
Dim lRow As Long
Dim rFound As Range
Dim strFirstAddress As String
On Error GoTo ErrHandler
Application.ScreenUpdating = False
strPath = "C:\ПОИСК" 'поменять на ваш путь
strSearch = InputBox("Поиск в папке C ПОИСК:", "Форма поиска", "")
If strSearch = "" Then
Exit Sub
End If
Set wOut = Worksheets.Add
lRow = 1
With wOut
.Cells(lRow, 1) = "Книга"
.Cells(lRow, 2) = "Лист"
.Cells(lRow, 3) = "Ячейка"
.Cells(lRow, 4) = "Результат"
Set fso = CreateObject("Scripting.FileSystemObject")
Set fld = fso.GetFolder(strPath)
strFile = Dir(strPath & "\*.xls*")
Do While strFile <> ""
Set wbk = Workbooks.Open(Filename:=strPath & "\" & strFile, UpdateLinks:=0, ReadOnly:=True, AddToMRU:=False)
For Each wks In wbk.Worksheets
Set rFound = wks.UsedRange.Find(strSearch)
If Not rFound Is Nothing Then
strFirstAddress = rFound.Address
End If
Do
If rFound Is Nothing Then
Exit Do
Else
lRow = lRow + 1
.Cells(lRow, 1) = wbk.Name
.Cells(lRow, 2) = wks.Name
.Cells(lRow, 3) = rFound.Address
.Cells(lRow, 4) = rFound.Value
End If
Set rFound = wks.Cells.FindNext(After:=rFound)
Loop While strFirstAddress <> rFound.Address
Next
'wbk.Close (False)
strFile = Dir
Loop
.Columns("A:D").EntireColumn.AutoFit
End With
MsgBox "Все"
ExitHandler:
Set wOut = Nothing
Set wks = Nothing
Set wbk = Nothing
Set fld = Nothing
Set fso = Nothing
Application.ScreenUpdating = True
Exit Sub
ErrHandler:
MsgBox Err.Description, vbExclamation
Resume ExitHandler
End Sub
Согласие есть продукт при полном непротивлении сторон
Последний вариант то же с ошибкой. Нашел проблему ошибки, это путь папки.
В старых версиях он был strPath = "C:\Users\Den\Downloads" и он рабочий Начинаю меня папку назначения и ошибка «Object variable or With block variable not set» Почему макрос не хочет принимать новые папки