The Problem (Q-score 4, ranked #95th of 95 in the VBA Core archive)
The scenario as originally posted in 2013
My Excel workbook contains VBA subs and macros similar to those below; they sit in Module1.
How to call them using Python win32com module?
Public Sub setA1(ByVal s As String)
ThisWorkbook.ActiveSheet.Range("A1").Value = s
End Sub
Public Function getA1() As String
getA1 = ThisWorkbook.ActiveSheet.Range("A1").Value
End Function
Many thanks in advance!
Why this Range / Worksheet targeting trips people up
The question centers on reaching a specific cell, range, or workbook object. In VBA Core, this is the #1 source of failures after activation events: every property (.Value, .Formula, .Address) behaves differently depending on whether the parent Workbook is explicit or implicit.
The Verified Solution — niche answer (below median) (+6)
8-line VBA Core pattern (copy-ready)
import win32com.client
xl=win32com.client.Dispatch("Excel.Application")
xl.Workbooks.Open(Filename="c:\temp\book1.xls",ReadOnly=1)
xl.Application.Run("setA1", '4')
res = xl.Application.Run("getA1")
print res
xl = 0
Just as simple as this ….
When to Use It — classic (2013–2016)
Ranked #95th in its category — specialized fit
This pattern sits in the 95% tail relative to the top answer. Reach for it when your scenario closely matches the question title; otherwise browse the VBA Core archive for a higher-consensus alternative.
What changed between 2013 and 2026
The answer is 13 years old. The VBA Core object model has been stable across Office 2013, 2016, 2019, 2021, 365, and 2024/2026 LTSC, so the pattern still compiles. Changes that might affect you: 64-bit API declarations (use PtrSafe), blocked macros in downloaded files (Mark-of-the-Web), and the shift toward Office Scripts for web-first workflows.