我不能确定为什么我得到语法错误“unterminated string literal”in Python called from Excel VBA via xlwings

zhte4eai  于 2023-08-08  发布在  Python
关注(0)|答案(1)|浏览(199)

我是一个非常缺乏经验的Python用户,刚刚开始学习这门语言。在检查了多种可能性后,我仍然无法确定为什么会出现此错误以及如何修复它?
Python代码是:

import numpy as np
import xlwings as xw

def formatInfluencer():
    #
    # FormatInfluencer Macro
    #
    #
    Selection.NumberFormat = '0'
    with_variable0 = Selection
    with_variable0.HorizontalAlignment = xlCenter
    with_variable0.VerticalAlignment = xlBottom
    with_variable0.WrapText = False
    with_variable0.Orientation = 0
    with_variable0.AddIndent = False
    with_variable0.IndentLevel = 0
    with_variable0.ShrinkToFit = False
    with_variable0.ReadingOrder = xlContext
    with_variable0.MergeCells = False
    with_variable1 = Selection.Interior
    with_variable1.Pattern = xlSolid
    with_variable1.PatternColorIndex = xlAutomatic
    with_variable1.Color = 10092543
    with_variable1.TintAndShade = 0
    with_variable1.PatternTintAndShade = 0

字符串
vba代码是:

Sub formatInfluencerNew()
    
    RunPython "import MetaFormats; MetaFormats.formatInfluencer()"
    

End Sub


完整的错误消息是:

出错

文件“",第1行

import xlwings.utils;xlwings.utils.prepare_sys_path("False;Book2;C:\\Users\\tobin\\AppData\\Roaming\\Microsoft\\Excel\\XLSTART\\xlwings.xlam;;;;C:\\Users\\tobin\\Documents\\Python\"); import MetaFormats; MetaFormats.formatInfluencer()

                                                    ^


语法错误:未终止的字符串文字(在第1行检测到)

按Ctrl+C将此消息复制到剪贴板。

OK

我期望代码将特定格式应用于选定的单元格。

xzlaal3s

xzlaal3s1#

从错误消息来看,似乎你遇到了一个由于“字符串字面量”引起的问题。这通常意味着你的代码中有一个字符串没有被正确关闭。换句话说,有一个字符串以单引号或双引号开始,但没有匹配的结束引号。
查看错误消息中的代码行:

import xlwings.utils;xlwings.utils.prepare_sys_path("False;Book2;C:\\Users\\tobin\\AppData\\Roaming\\Microsoft\\Excel\\XLSTART\\xlwings.xlam;;;;C:\\Users\\tobin\\Documents\\Python\"); import MetaFormats; MetaFormats.formatInfluencer()

字符串
你在字符串中使用反斜杠的方式似乎有问题。在Python中,反斜杠是转义字符。这意味着它用于引入特殊的字符序列。如果你想让一个字符串包含一个反斜杠,你需要用两个反斜杠(\\)来转义它。
如果你传递的是文件路径,那么路径中的反斜杠(\)很可能是导致问题的原因。在Python中,字符串中的反斜杠启动转义序列,这可能导致意外的结果。如果字符串包含文件路径,那么使用原始字符串通常是个好主意,它将反斜杠视为原义字符,而不是转义序列的开始。
你可以在Python中创建一个原始字符串,方法是在字符串前面加上一个r,如下所示:

r"C:\Users\tobin\AppData\Roaming\Microsoft\Excel\XLSTART\xlwings.xlam"


我在你的代码中看到的另一个问题是在Python代码中直接使用Excel的内置对象和方法,如Selection。不幸的是,这些Excel对象在Python中不可用。您需要使用xlwings库的方法与Excel交互。
下面是一个关于如何使用xlwings格式化单元格的示例:

import xlwings as xw

def formatInfluencer():
    wb = xw.Book.caller()
    sheet = wb.sheets['Sheet1']  # specify the sheet name you want to format
    rng = sheet.range('A1:A10')  # specify the range you want to format
    
    rng.number_format = '0'
    rng.api.Font.Bold = True
    rng.api.Font.Color = 10092543
    rng.api.HorizontalAlignment = xw.constants.HAlign.xlHAlignCenter
    rng.api.VerticalAlignment = xw.constants.VAlign.xlVAlignBottom


此函数设置Excel工作簿的“Sheet1”中单元格A1到A10的格式。
请记住,您必须确保调用Python脚本的Excel工作簿处于活动状态,并正确链接到xlwings。
请根据您的要求调整纸张和范围。此外,请注意,并非所有Excel VBA属性在xlwings或Python中都有直接等效项,因此您可能需要为其中一些属性找到解决方法。

相关问题