Excel 每次运行VBA宏时,启用宏的工作簿的文件大小是否会变大?

Excel 每次运行VBA宏时,启用宏的工作簿的文件大小是否会变大?,excel,vba,Excel,Vba,我使用具有以下代码的批处理文件: cscript DeleteDuplicateDataMacro.vbs "C:\Users\techadmin\Documents\DeleteDuplicateDataMacro\DeleteDuplicateDataMacro.xlsm 其中运行以下VBScript代码: Dim args, objExcel Set args = wScript.Arguments Set objExcel = CreateObject("Excel.Applicat

我使用具有以下代码的批处理文件:

cscript DeleteDuplicateDataMacro.vbs "C:\Users\techadmin\Documents\DeleteDuplicateDataMacro\DeleteDuplicateDataMacro.xlsm
其中运行以下VBScript代码:

Dim args, objExcel

Set args = wScript.Arguments
Set objExcel = CreateObject("Excel.Application")

objExcel.Workbooks.Open args(0)
objExcel.Visible = True

ObjExcel.Run "DeleteDuplicateData"

objExcel.ActiveWorkbook.Save
objExcel.ActiveWorkbook.Close(0)
objExcel.Quit
打开启用宏的工作簿并运行以下宏:

Sub DeleteDuplicateData()  
'  
' DeleteDuplicateData Macro  
'  

'  
    Application.DisplayAlerts = False  
    **With ActiveSheet.QueryTables(1).Refresh _
        .Connection = "TEXT;C:\Users\techadmin\Documents\Sapphire Report Agent\Sapphire_NK_Export.csv"**  
        '.CommandType = 0  
        .Name = "Sapphire_NK_Export"  
        .FieldNames = True  
        .RowNumbers = False  
        .FillAdjacentFormulas = False  
        .PreserveFormatting = True  
        .RefreshOnFileOpen = False  
        .RefreshStyle = xlInsertDeleteCells  
        .SavePassword = False  
        .SaveData = True  
        .AdjustColumnWidth = True  
        .RefreshPeriod = 0  
        .TextFilePromptOnRefresh = False  
        .TextFilePlatform = 437  
        .TextFileStartRow = 1  
        .TextFileParseType = xlDelimited  
        .TextFileTextQualifier = xlTextQualifierDoubleQuote  
        .TextFileConsecutiveDelimiter = False  
        .TextFileTabDelimiter = False  
        .TextFileSemicolonDelimiter = False  
        .TextFileCommaDelimiter = True  
        .TextFileSpaceDelimiter = False  
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1)  
        .TextFileTrailingMinusNumbers = True  
        .Refresh BackgroundQuery:=False  
    End With  
    ActiveWindow.SmallScroll Down:=-9  
    ActiveSheet.Range("$A$1:$Q$2500").RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17), Header:=xlYes  
    ActiveSheet.Range("$A$1:$Q$2500").RemoveDuplicates Columns:=17, Header:=xlYes  
    ChDir "C:\Users\techadmin\Documents\Sapphire Report Agent"  
    ActiveWorkbook.SaveAs Filename:="C:\Users\techadmin\Documents\Sapphire Report Agent\Sapphire_NK_Export", FileFormat:=xlCSV, CreateBackup:=False  
    ActiveCell.FormulaR1C1 = "STATE_STUDENT_ID"  
    Range("A1:Q2500").Select  
    Range("A1").Activate  
    Selection.ClearContents  
    Range("A1").Select  
    ChDir "C:\Users\techadmin\Documents\DeleteDuplicateDataMacro"  
    ActiveWorkbook.SaveAs Filename:="C:\Users\techadmin\Documents\DeleteDuplicateDataMacro\DeleteDuplicateDataMacro", FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False  
End Sub  

每隔运行此序列几次,启用宏的工作簿的文件大小就会增大几千字节。这一数字呈指数增长。一旦它达到30000 KB的范围,我的另一个工作簿(在此宏期间导入的工作簿,然后编辑并保存回其原始位置)开始复制它的列。

这是因为
With
需要使用一个对象(不需要双关语)而
QueryTable.Refresh
不返回一个。
您需要已经为
设置了连接。刷新
才能工作。
我从代码和清理部分删除了添加新连接的操作。 如果您想在每次打开工作簿时添加新连接,您还应该在保存和关闭工作簿之前将其删除,但我不建议这样做,因为Excel文件往往会随着时间的推移而中断

Sub DeleteDuplicateData()  
'  
' DeleteDuplicateData Macro
'  
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False  
    ActiveSheet.QueryTables(1).Refresh BackgroundQuery:=False
    Application.CalculateUntilAsyncQueriesDone
    ActiveSheet.Range("$A$1:$Q$2500").RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17), Header:=xlYes  
    ThisWorkbook.SaveAs Filename:="C:\Users\techadmin\Documents\Sapphire Report Agent\Sapphire_NK_Export", FileFormat:=xlCSV, CreateBackup:=False
    ' I assume A1 to be the ActiveCell, but it's still referring to the ActiveSheet
    Range("A1").FormulaR1C1 = "STATE_STUDENT_ID"
    ThisWorkbook.SaveAs Filename:="C:\Users\techadmin\Documents\DeleteDuplicateDataMacro\DeleteDuplicateDataMacro", FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub

请再次查看以了解如何避免使用Select、ACTIVE和implicit ActiveSheet引用。

这是您的问题。因为这是我如何配置Excel的问题。答案在Excel的“帮助-加速保存文件”中。为什么要添加新连接而不是刷新它?我相信标记和可以删除。@Nacorid我实际上甚至没有添加WSH标记,所以我不确定它是如何出现的。我将删除cmd和vbscript标记。至于连接问题。我对VBA了解不多。我只是录制了一个宏作为基础,然后在录制后对它进行了一些修改。Excel在宏录制过程中使用了该选项。连接刷新的语法是什么?我在微软的网站上只看到Add和Item作为QueryTables对象的方法@马克,我相信你忽略了这个问题。