Object variable or with block variable not set ошибка

I have the following code:

Sub AddSources()
    Dim pubPage As Page
    Dim pubShape As Shape
    Dim hprlink As Hyperlink
    Dim origAddress() As String
    Dim exportFileName As String
    exportFileName = "TestResume"
    Dim linkSource As String
    linkSource = "TestSource2"
    Dim hyperLinkText As TextRange



    For Each pubPage In ActiveDocument.Pages
        For Each pubShape In pubPage.Shapes
            If pubShape.Type = pbTextFrame Then
                For Each hprlink In pubShape.TextFrame.TextRange.Hyperlinks
                    If InStr(hprlink.Address, "http://bleaney.ca") > 0 Then
                        hyperLinkText = hprlink.Range
                        origAddress = Split(hprlink.Address, "?source=")
                        hprlink.Address = origAddress(0) + "?source=" + linkSource
                        hprlink.Range = hyperLinkText
                    End If
                Next hprlink
            End If
        Next pubShape
    Next pubPage
    ThisDocument.ExportAsFixedFormat pbFixedFormatTypePDF, "C:" + exportFileName + ".pdf"
End Sub

I am getting the «Object variable or With block variable not set (Error 91)» error on the line with hyperLinkText = hprlink.Range. When I debug I can see that hprlink.Range does have a value. Any thoughts what I’m doing wrong?

Vogel612's user avatar

Vogel612

5,6105 gold badges48 silver badges72 bronze badges

asked Dec 19, 2013 at 21:45

GBleaney's user avatar

4

As I wrote in my comment, the solution to your problem is to write the following:

Set hyperLinkText = hprlink.Range

Set is needed because TextRange is a class, so hyperLinkText is an object; as such, if you want to assign it, you need to make it point to the actual object that you need.

Jean-François Corbett's user avatar

answered Dec 19, 2013 at 21:59

Barranka's user avatar

BarrankaBarranka

20.5k13 gold badges65 silver badges83 bronze badges

Return to VBA Code Examples

This article will explain the VBA object variable or with block variable not set error.

vba error 91

This relatively common error occurs for exactly the reason that the message box says – the object variable or with block variable has not been set yet!

Object Variable Not Set

Let us consider the following code:

Sub TestObject()
  Dim wks as Worksheet
  wks.Name = "Sheet1"
End Sub

We have declared a new object variable called “wks” as a Worksheet.

We are then attempting to name this sheet – Sheet1

However, when we run the code, we get the run-time error. When we click on the Debug button, the code stops at the line where we are trying to name the sheet.

vba error object variable

We are trying to populate the variable “wks” – but we haven’t actually allocated the variable to a specific sheet – we have only declared it as a variable. Therefore, although the variable is declared, the object doesn’t actually exist!

Let us consider the amended code below:

Sub TestObject() 
  Dim wks as Worksheet
  Set wks = ActiveSheet
  wks.Name = "Sheet1" 
End Sub

We have now created the object with this line of code:

Set wks = ActiveSheet

The code will then run without error.

With Block Variable Not Set

Let us now consider this code:

Sub TestWith()
  Dim wks As Worksheet
  With wks
   .Name = "Sheet1"
   .Activate
  End With
End Sub

When we run this code, we get the same error:

vba error with block

When we click on debug, the code stops within the WITH….END WITH block – hence the with block variable error.

vba error with block debug

The error is actually the same and once again, by creating the object, we will solve the error.

Sub TestWith()
  Dim wks As Worksheet
  Set wks = ActiveSheet
  With wks
    .Name = "Sheet1"
    .Activate
  End With
End Sub

Permalink

Cannot retrieve contributors at this time

description title ms.date f1_keywords ms.assetid

Learn more about: Object variable or With block variable not set

Object variable or With block variable not set

07/20/2015

vbrID91

2f03e611-f0ed-465c-99a2-a816e034faa3

An invalid object variable is being referenced. This error can occur for several reasons:

  • A variable was declared without specifying a type. If a variable is declared without specifying a type, it defaults to type Object.

    For example, a variable declared with Dim x would be of type Object; a variable declared with Dim x As String would be of type String.

    [!TIP]
    The Option Strict statement disallows implicit typing that results in an Object type. If you omit the type, a compile-time error will occur. See Option Strict Statement.

  • You are attempting to reference an object that has been set to Nothing.

  • You are attempting to access an element of an array variable that wasn’t properly declared.

    For example, an array declared as products() As String will trigger the error if you try to reference an element of the array products(3) = "Widget". The array has no elements and is treated as an object.

  • You are attempting to access code within a With...End With block before the block has been initialized. A With...End With block must be initialized by executing the With statement entry point.

[!NOTE]
In earlier versions of Visual Basic or VBA, this error was also triggered by assigning a value to a variable without using the Set keyword (x = "name" instead of Set x = "name"). The Set keyword is no longer valid in Visual Basic .Net.

To correct this error

  1. Set Option Strict to On by adding the following code to the beginning of the file:

    When you run the project, a compiler error will appear in the Error List for any variable that was specified without a type.

  2. If you don’t want to enable Option Strict, search your code for any variables that were specified without a type (Dim x instead of Dim x As String) and add the intended type to the declaration.

  3. Make sure you aren’t referring to an object variable that has been set to Nothing. Search your code for the keyword Nothing, and revise your code so that the object isn’t set to Nothing until after you have referenced it.

  4. Make sure that any array variables are dimensioned before you access them. You can either assign a dimension when you first create the array (Dim x(5) As String instead of Dim x() As String), or use the ReDim keyword to set the dimensions of the array before you first access it.

  5. Make sure your With block is initialized by executing the With statement entry point.

See also

  • Object Variable Declaration
  • ReDim Statement
  • With…End With Statement

  • Remove From My Forums
  • Question

  • Hi

    Can anybody help me get past this problem. I keep getting an » Object variable or With block variable not set run time error 91″

    here is the code. Any help most apreciated. All I want to be able to do is remember a record Id close the form and go to another form then return to the form and have the form display the remembered record.

    Thanks Steve

    Dim rs As Object
    Set rs = Me.Recordset.Clone
    QuoteNumberLng = 16 ‘ This is a public variant variable set to 16 for testing but could be any QuoID Number
    If TogQuoteCalc = 0 Then
            Forms!frmMain!frmQuote.SourceObject = «frmQuote»
            Forms!frmMain!frmQuote.SetFocus
            Forms!frmMain!frmQuote.Form!QuoID.SetFocus
            rs.FindFirst «[QuoID] = » & CStr(QuoteNumberLng)
            If Not rs.EOF Then Me.Bookmark = rs.Bookmark
    End If

Answers

  • Congradulations on solving the problem! No reason to feel stupid. Programming is always a learning experience.

    • Marked as answer by

      Friday, August 6, 2010 1:40 AM

 

cooltouch

Пользователь

Сообщений: 8
Регистрация: 24.10.2014

#1

24.10.2014 11:26:56

Добрый день, уважаемые форумчане.

Столкнулся со следующей проблемой. Если я запускаю макрос сразу после открытия файла, в котором он содержится — всё работает как часы. Но если я его повторно запущу, то возникает ошибка: 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

Изменено: cooltouch24.10.2014 12:45:11

 

The_Prist

Пользователь

Сообщений: 14264
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#2

24.10.2014 12:12:30

Код
If Not rng is nothing then

И обратите внимание как выглядит мой код и как Ваш. Используйте кнопку <…> для оформления кодов.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

cooltouch

Пользователь

Сообщений: 8
Регистрация: 24.10.2014

#3

24.10.2014 12:21:57

Спасибо. Попробую сформулировать проблему понятнее. Убрал лишнее из макроса, чтобы было нагляднее

Код
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

Изменено: cooltouch24.10.2014 23:46:09

 

Sanja

Пользователь

Сообщений: 14849
Регистрация: 10.01.2013

Файл-пример можете приложить?

Согласие есть продукт при полном непротивлении сторон.

 

Hugo

Пользователь

Сообщений: 23373
Регистрация: 22.12.2012

#5

24.10.2014 12:38:52

Цитата
cooltouch пишет: Спасибо.

Чисто формально? Подсказку не использовали, код не оформили…

 

The_Prist

Пользователь

Сообщений: 14264
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#6

24.10.2014 12:39:38

Цитата
cooltouch пишет: Попробую сформулировать проблему понятнее

Я, в свою очередь попробую сформулировать свою просьбу понятнее: оформляйте коды ТЕГАМИ. Неужели так трудно выделить текст кода и нажать кнопочку <…>?

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

cooltouch

Пользователь

Сообщений: 8
Регистрация: 24.10.2014

#7

24.10.2014 13:01:57

Исправил отображение. К сожалению, не могу выложить этот файл на форум. Суть в следующем:
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

Изменено: cooltouch24.10.2014 13:07:19

 

Ну как-то куски кода в целом сложить непросто, но первый же вопрос: а если на листе Report 2 не будет найдено соответствующее значение txt, чему будет равняться rng?

 

The_Prist

Пользователь

Сообщений: 14264
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#9

24.10.2014 15:07:54

Я уже дал подсказку, как надо проверить. Но почему-то автор не хочет её использовать.
Плюс я не понимаю, зачем эта строка:

Код
If rng.Value Like txt & "*" Then

ведь в rng содержится текст, который равен txt. Следовательно Вы проверяете этим…Что, собственно?
Кстати, по вопросу в первый раз находит, во второй нет: может следует явно указать по целой ячейке ищете или по части?

Код
Set rng = .find(What:=txt, LookIn:=xlValues,LookAt:=xlWhole)'если по части ячейки - LookAt:=xlPart

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

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

cooltouch

Пользователь

Сообщений: 8
Регистрация: 24.10.2014

#10

24.10.2014 17:39:29

Извините, кнопка «Цитировать» у меня почему-то корректно не работает (по нажатию ничего не происходит, 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

К сожалению, не могу выложить файл по соображениям корпоративной политики. Понимаю, что без этого проблему найти намного труднее. В любом случае, спасибо за советы. Если удастся найти проблему — отпишу.

 

The_Prist

Пользователь

Сообщений: 14264
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

Без файла точно никто ничего больше не скажет. Сидеть и гадать не о чем, т.к. дело скорее всего еще в каких-то действиях и искомый текст уже не находится.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Юрий М

Модератор

Сообщений: 60770
Регистрация: 14.09.2012

Контакты см. в профиле

#12

24.10.2014 18:38:59

Цитата
cooltouch пишет: не могу выложить файл по соображениям корпоративной политики

Меняйте патроны на апельсины.

 

cooltouch

Пользователь

Сообщений: 8
Регистрация: 24.10.2014

#13

27.10.2014 13:22:21

Здравствуйте,
спешу сообщить, что решил свою проблему. Изменил

Код
Set rng = .find(What:=txt, LookIn:=xlValues)

на

Код
Set rng = .find(What:=txt, LookIn:=xlValues, LookAt:=xlPart)

и ошибка ушла. Спасибо The_Prist. Видимо действительно проблема была в

Цитата
The_Prist пишет:
а то во время работы эти настройки могут быть изменены и не указывая их принудительно Вы ищите с теми параметрами, которые были установлены по время работы с листом/книгой.

Дьявол кроется в деталях. Сам я был уверен до этого, что пробовал такой вариант, так как в процессе отладки использовал миллион разных комбинаций. Оказалось, что нет.

Попутный вопрос… удален

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

cooltouch, одна тема — один вопрос. Создавайте новую тему, но перед этим почитайте форум — возможно уже есть ответ на Ваш вопрос.


Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

venrt

Пользователь

Сообщений: 54
Регистрация: 29.03.2017

#15

29.01.2019 12:09:49

Добрый день.
Тоже борюсь с похожей ошибкой.
Есть код:

Код
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 вылетает с этой ошибкой, если больше одного раза, то все норм.

Причем в других книгах все нормально срабатывало с любым кол-ом вхождений.

Изменено: venrt29.01.2019 12:10:29

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

venrt, Файл пример в студию.

«Все гениальное просто, а все простое гениально!!!»

 

venrt

Пользователь

Сообщений: 54
Регистрация: 29.03.2017

Nordheim,прикладываю файл

Прикрепленные файлы

  • пример.xlsm (46.99 КБ)

 

Віталій

Пользователь

Сообщений: 9
Регистрация: 28.10.2021

Добрый день. Столкнулся с такой проблемой при открытии файла запускается макрос и появляется ошибка «runtime Error 91». А когда любой другой файл excel открыт то ошибки уже нет. Прошу прощения я в пока в VBA пока полный профан. Рад буду любой помощи. Всем СПС.

Прикрепленные файлы

  • 2.xlsm (24.76 КБ)
  • 1.jpg (12.49 КБ)

 

см. вложение

Прикрепленные файлы

  • 2.xlsm (22.02 КБ)

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Віталій

Пользователь

Сообщений: 9
Регистрация: 28.10.2021

#20

03.05.2022 19:29:55

Цитата
написал:
см. вложение

Спасибо но вы удалили макрос который должен сортировать при открытии файла колонку под кнопкой ДН . Так у меня тоже работает. Идея была такой что бы макрос сортировал при открытии файла  и оставалась возможность запуска макроса по нажатия функциональных кнопок. Если возможно это как то реализовать буду очень рад. Спасибо что откликнулись.  

 

Віталій

Пользователь

Сообщений: 9
Регистрация: 28.10.2021

Ігор Гончаренко, Спасибо но вы удалили макрос который должен сортировать при открытии файла колонку под кнопкой ДН . Так у меня тоже работает. Идея была такой что бы макрос сортировал при открытии файла  и оставалась возможность запуска макроса по нажатия функциональных кнопок. Если возможно это как то реализовать буду очень рад. Спасибо что откликнулись.  

 

верните в макрос обратно
сохраните, закройте, откройте

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Віталій

Пользователь

Сообщений: 9
Регистрация: 28.10.2021

Ігор Гончаренко, опять ругается, может я криворукий.

Прикрепленные файлы

  • 2.xlsm (24.72 КБ)
  • 3.jpg (142.76 КБ)

 

Ігор Гончаренко

Пользователь

Сообщений: 13881
Регистрация: 01.01.1970

#24

03.05.2022 20:12:18

модуль ЭтаКнига  напишите так:

Код
Private Sub Workbook_Open()
  Application.OnTime Now + 4 / 24 / 3600, "Сортувати"
End Sub

и ничего более

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Віталій

Пользователь

Сообщений: 9
Регистрация: 28.10.2021

Ігор Гончаренко,
только что попробовал запустить исходный файл все заработало без правок ,странно, удалил перед этим надстройку, может в этом была проблема . Спасибо тебе добрый человек, ОГРОМНОЕ СПАСИБО!!!
На этом форуме есть  рейтинг ?

 

Ігор Гончаренко

Пользователь

Сообщений: 13881
Регистрация: 01.01.1970

#26

03.05.2022 21:18:26

ваши слова формируют мой рейтинг)

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

Понравилась статья? Поделить с друзьями:
  • Object progressevent как устранить эту ошибку
  • Object of type response has no len ошибка
  • Object of type io textiowrapper has no len ошибка
  • Object of type int has no len python ошибка
  • Object not found kaspersky ошибка обновления