excel CSV文件可以注入宏吗?

时间:2018-08-06 18:49:10

标签: excel python-3.x excel-vba

我正在尝试使用自动适合excel中列宽的宏注入csv文件,但没有任何反应。我正在使用上一篇文章(Use Python to Inject Macros into Spreadsheets)中的代码。但是这是代码

import os
import sys

# Import System libraries
import glob
import random
import re

#sys.coinit_flags = 0 # comtypes.COINIT_MULTITHREADED

# USE COMTYPES OR WIN32COM
#import comtypes
#from comtypes.client import CreateObject

# USE COMTYPES OR WIN32COM
import win32com
from win32com.client import Dispatch

desktop = os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop')
x = r'C:\This\is\the\path'
scripts_dir = x
conv_scripts_dir = x
strcode = \
'''
sub test()
        Column.Autofit
end sub
'''

#com_instance = CreateObject("Excel.Application", dynamic = True) # USING COMTYPES
com_instance = Dispatch("Excel.Application") # USING WIN32COM
com_instance.Visible = True#False
com_instance.DisplayAlerts = True#False 


for script_file in glob.glob(os.path.join(scripts_dir, '*.csv')):
    print("Processing: %s" % scr    ipt_file)
    # do the operation in background without actually opening Excel
    (file_path, file_name) = os.path.split(script_file)
    objworkbook = com_instance.Workbooks.Open(script_file)
    xlmodule = objworkbook.VBProject.VBComponents.Add(1)
    xlmodule.CodeModule.AddFromString(strcode.strip())
    objworkbook.SaveAs(os.path.join(conv_scripts_dir, file_name))

com_instance.Quit()

此代码实际上是在excel中打开一个文件,执行一个宏,然后关闭excel窗口。为什么宏不能从python命令行运行,但是在excel内可以运行?

1 个答案:

答案 0 :(得分:0)

完全正确。 CSV中没有格式。这就像尝试向文本文件添加格式。你不能那样做。您可以将CSV文件转换为XLSM文件(Excel宏)或XLSB(二进制)。

Sub CSVtoXLSB2()
    Dim wb As Workbook
    Dim CSVPath As String
    Dim sProcessFile As String

    CSVPath = "C:\your_path_here\"
    sProcessFile = Dir(CSVPath & "*.csv")
    Do Until sProcessFile = ""   ' Loop until no file found.
        Set wb = Application.Workbooks.Open(CSVPath & sProcessFile)
        wb.SaveAs CSVPath & Split(wb.Name, ".")(0) & ".xlsb", FileFormat _
            :=50, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
            CreateBackup:=False
        wb.Close
        sProcessFile = Dir()   ' Get next entry.
    Loop
    Set wb = Nothing
End Sub

现在,如果要将模块从一个工作簿复制到另一个工作簿,请按照以下步骤操作:

  • 将模块从一个工作簿复制到另一个工作簿
  • 打开包含要复制的宏的工作簿以及要在其中复制宏的工作簿。
  • 在“开发人员”选项卡上,单击“ Visual Basic”以打开Visual Basic编辑器。
  • 在Visual Basic编辑器的“视图”菜单上,单击“项目资源管理器”,然后单击“项目资源管理器”按钮图像,或按 CTRL + R
  • 在“项目资源管理器”窗格中,将包含要复制的宏的模块拖到目标工作簿中。在这种情况下,我们要将Module1Book2.xlsm复制到Book1.xlsm

    enter image description here

  • VBA项目浏览器

  • Module1复制的
  • Book2.xlsm
  • Module1的副本复制到Book1.xlsm