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
5,6105 gold badges48 silver badges72 bronze badges
asked Dec 19, 2013 at 21:45
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.
answered Dec 19, 2013 at 21:59
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.
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.
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:
When we click on debug, the code stops within the WITH….END WITH block – hence the with block variable error.
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 typeObject;
a variable declared withDim x As String
would be of typeString
.[!TIP]
TheOption Strict
statement disallows implicit typing that results in anObject
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 arrayproducts(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. AWith...End With
block must be initialized by executing theWith
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 theSet
keyword (x = "name"
instead ofSet x = "name"
). TheSet
keyword is no longer valid in Visual Basic .Net.
To correct this error
-
Set
Option Strict
toOn
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.
-
If you don’t want to enable
Option Strict
, search your code for any variables that were specified without a type (Dim x
instead ofDim x As String
) and add the intended type to the declaration. -
Make sure you aren’t referring to an object variable that has been set to
Nothing
. Search your code for the keywordNothing
, and revise your code so that the object isn’t set toNothing
until after you have referenced it. -
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 ofDim x() As String
), or use theReDim
keyword to set the dimensions of the array before you first access it. -
Make sure your
With
block is initialized by executing theWith
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
-
Marked as answer by
cooltouch Пользователь Сообщений: 8 |
#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 при повторном запуске не присваивается значение? Объясните, пожалуйста. Часть макроса, в котором появляется ошибка:
Изменено: cooltouch — 24.10.2014 12:45:11 |
||
The_Prist Пользователь Сообщений: 14264 Профессиональная разработка приложений для MS Office |
#2 24.10.2014 12:12:30
И обратите внимание как выглядит мой код и как Ваш. Используйте кнопку <…> для оформления кодов. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
cooltouch Пользователь Сообщений: 8 |
#3 24.10.2014 12:21:57 Спасибо. Попробую сформулировать проблему понятнее. Убрал лишнее из макроса, чтобы было нагляднее
Изменено: cooltouch — 24.10.2014 23:46:09 |
||
Sanja Пользователь Сообщений: 14849 |
Файл-пример можете приложить? Согласие есть продукт при полном непротивлении сторон. |
Hugo Пользователь Сообщений: 23373 |
#5 24.10.2014 12:38:52
Чисто формально? Подсказку не использовали, код не оформили… |
||
The_Prist Пользователь Сообщений: 14264 Профессиональная разработка приложений для MS Office |
#6 24.10.2014 12:39:38
Я, в свою очередь попробую сформулировать свою просьбу понятнее: оформляйте коды ТЕГАМИ. Неужели так трудно выделить текст кода и нажать кнопочку <…>? Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
cooltouch Пользователь Сообщений: 8 |
#7 24.10.2014 13:01:57 Исправил отображение. К сожалению, не могу выложить этот файл на форум. Суть в следующем:
На листе «Report 2» в столбике A:A находится список неких групп. Мне необходимо для каждой такой группы создать лист в исходном файле с названием, близким к названию этой группы. Названия листов хранятся в массиве.
а далее сам код, где возникает ошибка:
Изменено: cooltouch — 24.10.2014 13:07:19 |
||||||||||
Ну как-то куски кода в целом сложить непросто, но первый же вопрос: а если на листе Report 2 не будет найдено соответствующее значение txt, чему будет равняться rng? |
|
The_Prist Пользователь Сообщений: 14264 Профессиональная разработка приложений для MS Office |
#9 24.10.2014 15:07:54 Я уже дал подсказку, как надо проверить. Но почему-то автор не хочет её использовать.
ведь в rng содержится текст, который равен txt. Следовательно Вы проверяете этим…Что, собственно?
а то во время работы эти настройки могут быть изменены и не указывая их принудительно Вы ищите с теми параметрами, которые были установлены по время работы с листом/книгой. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||||
cooltouch Пользователь Сообщений: 8 |
#10 24.10.2014 17:39:29 Извините, кнопка «Цитировать» у меня почему-то корректно не работает (по нажатию ничего не происходит, Chrome Версия 38.0.2125.104 m)
Выдаёт ту же ошибку, что и в топике. Я немного ковырял в эту сторону. После повторного запуска макроса после строчки
2. Про
Это мой частный случай. На всякий случай убрал & «*», но результата это не дало. Оно и понятно, эта строчка стоит ниже строчки кода, на которой отваливается макрос.
Опять же, это мой частный случай. Пробовал играться, но результата это не принесло.
не понял. В первом моём сообщение как раз аналогичная структура.
К сожалению, не могу выложить файл по соображениям корпоративной политики. Понимаю, что без этого проблему найти намного труднее. В любом случае, спасибо за советы. Если удастся найти проблему — отпишу. |
||||||||||||
The_Prist Пользователь Сообщений: 14264 Профессиональная разработка приложений для MS Office |
Без файла точно никто ничего больше не скажет. Сидеть и гадать не о чем, т.к. дело скорее всего еще в каких-то действиях и искомый текст уже не находится. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
Юрий М Модератор Сообщений: 60770 Контакты см. в профиле |
#12 24.10.2014 18:38:59
Меняйте патроны на апельсины. |
||
cooltouch Пользователь Сообщений: 8 |
#13 27.10.2014 13:22:21 Здравствуйте,
на
и ошибка ушла. Спасибо The_Prist. Видимо действительно проблема была в
Дьявол кроется в деталях. Сам я был уверен до этого, что пробовал такой вариант, так как в процессе отладки использовал миллион разных комбинаций. Оказалось, что нет. Попутный вопрос… удален |
||||||
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
cooltouch, одна тема — один вопрос. Создавайте новую тему, но перед этим почитайте форум — возможно уже есть ответ на Ваш вопрос.
|
venrt Пользователь Сообщений: 54 |
#15 29.01.2019 12:09:49 Добрый день.
Если на нужном листе текст поиска встречается один раз, то на Loop While вылетает с этой ошибкой, если больше одного раза, то все норм. Причем в других книгах все нормально срабатывало с любым кол-ом вхождений. Изменено: venrt — 29.01.2019 12:10:29 |
||
Nordheim Пользователь Сообщений: 3154 |
venrt, Файл пример в студию. «Все гениальное просто, а все простое гениально!!!» |
venrt Пользователь Сообщений: 54 |
Nordheim,прикладываю файл Прикрепленные файлы
|
Віталій Пользователь Сообщений: 9 |
Добрый день. Столкнулся с такой проблемой при открытии файла запускается макрос и появляется ошибка «runtime Error 91». А когда любой другой файл excel открыт то ошибки уже нет. Прошу прощения я в пока в VBA пока полный профан. Рад буду любой помощи. Всем СПС. Прикрепленные файлы
|
см. вложение Прикрепленные файлы
Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
|
Віталій Пользователь Сообщений: 9 |
#20 03.05.2022 19:29:55
Спасибо но вы удалили макрос который должен сортировать при открытии файла колонку под кнопкой ДН . Так у меня тоже работает. Идея была такой что бы макрос сортировал при открытии файла и оставалась возможность запуска макроса по нажатия функциональных кнопок. Если возможно это как то реализовать буду очень рад. Спасибо что откликнулись. |
||
Віталій Пользователь Сообщений: 9 |
Ігор Гончаренко, Спасибо но вы удалили макрос который должен сортировать при открытии файла колонку под кнопкой ДН . Так у меня тоже работает. Идея была такой что бы макрос сортировал при открытии файла и оставалась возможность запуска макроса по нажатия функциональных кнопок. Если возможно это как то реализовать буду очень рад. Спасибо что откликнулись. |
верните в макрос обратно Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
|
Віталій Пользователь Сообщений: 9 |
Ігор Гончаренко, опять ругается, может я криворукий. Прикрепленные файлы
|
Ігор Гончаренко Пользователь Сообщений: 13881 |
#24 03.05.2022 20:12:18 модуль ЭтаКнига напишите так:
и ничего более Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
||
Віталій Пользователь Сообщений: 9 |
Ігор Гончаренко, |
Ігор Гончаренко Пользователь Сообщений: 13881 |
#26 03.05.2022 21:18:26 ваши слова формируют мой рейтинг) Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |