Fixing the "Invalid Use of Property" Error When Setting Range Positions in Word VBA

Abstract: Word VBA raises "Invalid use of property" when you try to Set a Range's Start or End position. This guide explains the cause, the correct pattern, and how to keep bookmarks intact between saves.

Created: 2026-11-02 by

The "Invalid use of property" error appears because Range.Start and Range.End are value properties, not objects, so they cannot be assigned with Set. You can only use Set on object references; for a property like .Start, a plain assignment (or better, building the range in one call) is the right approach. Once you correct that, there is a second pitfall waiting: bookmarks used as insertion markers tend to drift or get destroyed when you replace the text between them, so your macro must re-anchor them after each write.

Why the Error Occurs

In VBA, Set exists exclusively to assign object references. When you write:

Set myRange.Start = ActiveDocument.Bookmarks("SaveDateStart").Range.End

the compiler sees Set applied to .Start, which is a Long property, and reports "Invalid use of property." The .End part of the bookmark expression returns a character position number, not an object, so there is nothing for Set to assign. Removing Set makes the line compile, but it still leaves you assigning positions one at a time to an uninitialized range — which is fragile and harder to read.

The Reliable Pattern: Build the Range in One Call

Rather than mutating a range's endpoints, store the two bookmark positions in variables and construct the range directly from the document:

Sub FileSave()
    Dim startPos As Long
    Dim endPos As Long

    startPos = ActiveDocument.Bookmarks("SaveDateStart").Range.End
    endPos = ActiveDocument.Bookmarks("SaveDateEnd").Range.Start

    ActiveDocument.Range(Start:=startPos, End:=endPos).Text = "Lorem Ipsum"

    ActiveDocument.Save
End Sub

This reads the start position (the end of the opening bookmark), the end position (the start of the closing bookmark), and creates a fresh range spanning exactly the area between them. Assigning the .Text property replaces whatever sits in that span. Note that a named-argument call like ActiveDocument.Range(Start:=startPos, End:=endPos) is clearer than passing positional arguments, and it avoids the compiler confusion that mixing Set and property access can cause.

Reading Values from Object Properties

A frequent source of confusion is that the same expression needs different treatment depending on which side of the assignment it sits. Reading a property through an object — for example ActiveDocument.Bookmarks("SaveDateStart").Range.End — requires no Set and yields a plain number. Assigning an object, such as Set myRange = ActiveDocument.Range(1, 5), does require Set. A quick rule of thumb:

  • Set only when the right-hand side returns an object (a Range, Bookmark, Document, etc.).
  • Plain assignment for anything returning a value: .Start, .End, .Text, .Count.

Why the Text Duplicates on Subsequent Saves

Even after fixing the syntax, the macro may behave incorrectly the second time it runs. If your two bookmarks were inserted as empty markers (nothing selected when they were added), Word keeps the closing bookmark immediately in front of any text that appears between the markers. When your macro replaces the range with new text, the closing bookmark ends up before the text rather than after it. On the next save, the span between the two bookmarks is empty, so the macro inserts the string again instead of replacing the old one — the document accumulates a growing pile of repeated text before the old copy.

Re-Anchor the Closing Bookmark After Each Write

The fix is to move the closing bookmark to the position right after the new text each time the macro runs:

Sub FileSave()
    Dim startPos As Long
    Dim newText As String

    newText = "Lorem Ipsum"
    startPos = ActiveDocument.Bookmarks("SaveDateStart").Range.End

    ActiveDocument.Range(Start:=startPos, _
        End:=ActiveDocument.Bookmarks("SaveDateEnd").Range.Start).Text = newText

    ' Recreate SaveDateEnd immediately after the new text
    ActiveDocument.Bookmarks.Add Name:="SaveDateEnd", _
        Range:=ActiveDocument.Range(startPos + Len(newText), startPos + Len(newText))

    ActiveDocument.Save
End Sub

Calling Bookmarks.Add with an existing name silently replaces the old bookmark, so the closing marker always sits at the end of the inserted content. An alternative design is to use a single bookmark wrapping the whole replaceable region: capture its .Range, set the text, then re-add the bookmark over the modified range. Both approaches achieve the same result; the two-marker version suits documents where other content lives between the markers is deliberately excluded, while the single-bookmark version is simpler when the entire span is yours to replace.

Prevention Tips

  • Store character positions in Long variables before doing any work; document edits during the macro can shift positions and invalidate stale range objects.
  • Never rely on Set for value properties — the compiler error is your friend here, since it catches the mistake before runtime.
  • After writing text, always verify that any bookmarks used as markers still bracket the intended content, and re-add them if necessary.
  • Test the macro by saving the document three or four times in a row; duplication bugs caused by bookmark drift only appear on the second run.

Frequently Asked Questions

Can I assign Range.Start directly without Set?

Yes, but only after the range exists. myRange.Start = 10 compiles fine once myRange has been initialized with Set myRange = .... The error occurs only when Set is used on the property itself, or when the range variable is Nothing.

Why does my macro insert the text twice instead of replacing it?

Most likely the closing bookmark has drifted to the front of the inserted text, leaving an empty span between the bookmarks. Re-add the closing bookmark at startPos + Len(newText) after each write.

Does Bookmarks.Add overwrite an existing bookmark with the same name?

Yes. Calling ActiveDocument.Bookmarks.Add with a name that already exists replaces the old bookmark, which is exactly what you want when repositioning a marker.

What does Range.End actually return for a bookmark?

It returns a Long character position — the offset just past the last character of the bookmark's range. For an empty (collapsed) bookmark, .Start and .End are equal.

Is there a way to insert text at a bookmark without deleting it?

Yes. Assign to the bookmark's range text and then re-add the bookmark over the new content, or collapse the range to the bookmark's start before inserting. The re-add approach shown above is the most robust for repeated updates.

Latest News

How to Display Output of xterm Command in Terminal Screen using Cron

Resolve the inability to display xterm output in a terminal screen from cron by redirecting logs or using wall instead of insecure X11 workarounds.

Read More
Expose Local Server on VPS Preserving Real Client IPs (OS Level)

Resolve VPS logging showing only gateway IPs by configuring reverse proxies to forward real client addresses via X-Forwarded-For headers.

Read More
How to Clear Recent Files History in Linux without Deleting Actual Files?

Clear recent files history in Linux by deleting ~/.local/share/recently-used.xbel without removing the actual files.

Read More
Best HDD Copy Strategy: Manually Syncing and Rewriting Scratch

Resolve data drift between two 4TB hard drives by using rsync with the --delete flag to manually sync and rewrite scratch data for an exact mirror.

Read More
Understanding Bash Prompt Abbreviations: An Overview

Resolve repetitive typing errors by creating and persisting Bash aliases in the .bashrc file for improved command-line efficiency.

Read More
Free Tools and Methods to Log Real-Time Performance Details in Task Manager

Log real-time CPU and memory metrics to CSV files using Windows Performance Monitor Data Collector Sets to troubleshoot system slowness.

Read More
Contact Qatar Airways Customer Service: Phone Number, Help Center, and More

Resolve urgent Qatar Airways reservation issues like flight changes and baggage claims using the US phone number +1801-855-5905 or online self-service tools.

Read More
Windows 11: Alt Codes Displaying Wrong Characters - Solutions

Resolve Windows 11 Alt codes showing wrong characters by verifying the US keyboard layout and enabling Num Lock.

Read More
Run Programs with Elevated Privileges: A Comprehensive Guide

Eliminates the need to type sudo for frequent administrative tasks by configuring .bashrc aliases or functions.

Read More
Dynamically Changing Dates in Excel Formulas Using Cells

Eliminate manual date updates in Excel by using cell references to create dynamic formulas that automatically adjust calculations when input dates change.

Read More
Granting Edit Access to a Specific Excel Sheet in an Office 365 User Email ID-Based Login

Excel Online lacks native sheet-level permissions, so users must split workbooks or use worksheet protection to isolate edit access for specific tabs.

Read More
Creating Network Load on Local Wi-Fi from One PC

Generate sustained Wi-Fi bandwidth load from a single PC using a VM SFTP server to test router stability and throughput.

Read More
Changing the Default Editor for Batch Files in Windows 11's File Explorer

Resolve the issue of batch files opening in Notepad by changing the default editor to a preferred application like VS Code.

Read More
Gain WiFi Connection Minutes Before Losing it by Changing MAC Address

Bypass MAC address filtering to restore WiFi connectivity temporarily when a device is blocked by network administrators.

Read More
Photos Folders Turned Black: Troubleshooting Picture Applications on Windows

Resolve black screens in Windows Photos by resetting the app, updating graphics drivers, and repairing system files.

Read More
Troubleshooting High CPU Temperature Values: A Step-by-Step Guide

Resolve high CPU temperatures and thermal throttling by monitoring with Speedfan, cleaning dust from cooling components, and replacing degraded thermal paste.

Read More
Make cURL establish TLS connection with CA unknown

Resolve cURL TLS connection failures with unknown or self-signed certificates by using the --insecure flag to bypass CA validation.

Read More
Troubleshooting Incorrect Network Metrics Values in Grafana, Prometheus, InfluxDB, and Telegraf

Fix incorrect network metrics in Grafana, Prometheus, InfluxDB, and Telegraf by verifying interface selection, resolving unit mismatches, and handling counter resets.

Read More
Start Another Terminal Window (cmd.exe) Windows Repair/Troubleshoot

Provides step-by-step instructions to access the Windows Command Prompt via bootable media for advanced system repair and troubleshooting.

Read More
Thinkpad P1 Gen 6: Sudden Thunderbolt 3 Dock USB-C Charging Stopped Working

Resolve sudden Thunderbolt 3 dock USB-C charging and internet failure on ThinkPad P1 Gen 6 by updating firmware, resetting the dock, and adjusting power settings.

Read More
ASUS Windows 11 Laptop: Internet Connection Issue with Hotspot

Resolve ASUS Windows 11 laptop spinning wheel issue when connecting to mobile hotspot by resetting network stack, disabling IPv6, and adjusting power settings.

Read More
Developing iOS Project with Firebase: Logging in and Sending Push Notifications

Integrates Firebase to enable secure user authentication and push notifications in iOS applications.

Read More
Troubleshooting Bash Script with Suspected Issues of Spaces, Dashes, Filenames and Quoting

Resolve Bash script failures caused by word splitting, globbing, and special characters in filenames by applying proper quoting techniques.

Read More
Populating OneDrive Folder for Local Backup without Affecting Remote Files

Prevent OneDrive from deleting remote files during Windows reinstallation by unlinking the account or using symbolic links to isolate local data.

Read More
Force First Frame as Keyframe Without Re-encoding: A Quick Solution

Resolve inaccurate seeking and playback glitches by re-encoding video to ensure the first frame is a valid keyframe.

Read More
Find Information in Database Using WSL (Ubuntu) on Windows-10

Resolve database connection issues from WSL Ubuntu on Windows 10 by configuring client tools and network access to query remote or local servers.

Read More
Configuring a New Router with Different Networks: One Family, One Guest

Resolve IP conflicts and isolate guest traffic by configuring a second router with a distinct subnet via its WAN port.

Read More
Quickly Open Multiple Stock Websites with a Single Command

Solve the problem of manually opening multiple stock research websites by creating a single command to launch them simultaneously on Windows, macOS, or Linux.

Read More
Improved Adobe Acrobat Search Experience: Access Advanced Search with Ease

Access advanced search filters like case sensitivity and regex in Adobe Acrobat by clicking More Options in the Find bar.

Read More
Port Forwarding VM via OpenVPN: A Comprehensive Guide

Configure OpenVPN server and iptables to forward specific ports from VPN clients to a virtual machine's internal IP address.

Read More
Understanding Partitions in the 1980s: A Look Back at MS-DOS and Master Boot Record

Explains how the Master Boot Record and partition table enabled MS-DOS to manage multiple disk volumes on a single physical drive.

Read More
Windows 10 Enterprise: Keyboard Not Detected in Managed Organization with Admin Privileges

Resolve Windows 10 Enterprise keyboard detection failures caused by Group Policy restrictions, driver corruption, or USB enumeration errors.

Read More
Can't Find x86_64 Versions of Applications on MacOS arm64 (M1)

Resolve missing x86_64 app issues on M1 Macs by installing Rosetta 2 and reinstalling apps as universal binaries.

Read More
How to Hide Installation Source for an Android App

Manage Android app installation source visibility by using USB transfers or file managers to reduce browser traces and isolate data via work profiles.

Read More
Connecting Momentus 4200.2 ST9808210A Hard Drive via USB Cable

Resolve inability to access Seagate Momentus 4200.2 ST9808210A hard drive by connecting it via USB using a compatible SATA-to-USB adapter and configuring the disk in Windows.

Read More