How to Use VBA to Set Text Levels on PowerPoint Notes Pages
Question details
The user wants to use a VBA macro to insert slide titles into the notes page and assign specific text outline levels (e.g., level 1 for the first paragraph, level 2 for the copied slide title) without modifying existing notes.
- Product
- PowerPoint
- Device & OS
- not provided
- Scenario
- Automating the structural formatting of notes pages across a presentation.
- Observed behavior
- The initial macro retrieves the title and inserts it, but inconsistently fails to indent the second paragraph to level 2, requiring a workaround to enforce the outline formatting.
Ensure you have enabled the Developer tab in your presentation software to access the Visual Basic editor, and save your presentation as a Macro-Enabled file (.pptm) before testing your scripts.
Use a VBA Loop to Insert Text and Set Indent Levels
Create a macro that loops through all slides, extracts the title, appends it to the notes section, and applies the IndentLevel property to the designated paragraphs.
VBA can manipulate the TextFrame within the NotesPage object. You can use the IndentLevel property to format the text hierarchy programmatically. Because PowerPoint sometimes overrides single-pass indentations due to inherited formatting, executing a secondary macro to strictly set the second paragraph's indentation is the most reliable approach.
Press ALT + F11 on your keyboard to launch the Visual Basic for Applications (VBA) editor.
In the left-hand Project Explorer, right-click your presentation name, hover over 'Insert', and select 'Module'.
Write a subroutine that iterates through ActivePresentation.Slides. For each slide, retrieve the title shape text, append it to the existing text in Slide.NotesPage.Shapes.Placeholders(2).TextFrame.TextRange, and set .Paragraphs(1).IndentLevel = 1.
To fix inconsistent indentations on the second line, write a separate loop that targets the same notes placeholder but specifically applies .Paragraphs(2).IndentLevel = 2 to the text.
Run the primary macro first to insert the text and format the first level. Then, run the secondary macro to accurately apply the level two indentation to the copied titles.
Manage and Format Presentations with WPS Office
WPS Office provides robust tools for presentation formatting and structural management. You can easily adjust slide notes, text hierarchy, and formatting through an intuitive interface without relying heavily on complex coding.
- 1. Download WPS Office: Download and install the free version of WPS Office on your computer.
- 2. Open Your Presentation: Launch WPS Presentation and open your existing presentation file.
- 3. Adjust Notes Formatting: Navigate to the Notes pane at the bottom of the workspace to manually select text and adjust indent levels using the formatting ribbon.

Frequently Asked Questions
Why does my VBA code fail to set the indent level for the second paragraph?
PowerPoint's text frame engine sometimes forces default or inherited placeholder formatting onto newly inserted text lines. The most effective workaround is running a dedicated, secondary macro that loops back through the slides specifically to apply the `IndentLevel = 2` property to the second paragraph.
How do I specifically reference the notes page text body via VBA?
You can access the main text body of a notes page by referencing `Slide.NotesPage.Shapes.Placeholders(2).TextFrame.TextRange`. This placeholder typically contains the primary notes content.
Can I use VBA to change notes without deleting the text that is already there?
Yes. Instead of overwriting the text, you can read the existing text using the `TextRange.Text` property, append your new text to it using string concatenation (the `&` operator), and then assign the combined string back to the `TextRange.Text` property.
Is it possible to automate other text formatting properties in PowerPoint notes?
Absolutely. Using VBA, you can modify font sizes, colors, alignment, and bullet styles by accessing the `Font` and `ParagraphFormat` properties within the targeted `TextRange` object.




