在 VBA 循环中保存 excel 文件

Posted

技术标签:

【中文标题】在 VBA 循环中保存 excel 文件【英文标题】:Saving an excel file in VBA loop 【发布时间】:2016-01-31 03:57:46 【问题描述】:

我创建了一个循环遍历国家列表的宏,并更新了“Dash_eng”上的数字。我可以让循环工作,但循环的一部分调用另一个宏,它将“Dash_Eng”)复制并保存为 excel 文件

两个宏在彼此独立运行时都可以工作,只需将它们放在一起即可

循环遍历国家并调用excel宏中保存的宏

Sub ReportUpdate()    
Dim i As Integer, numrows As Integer
    Sheets("Text").Select        
    numrows = Range("O2", Range("O2").End(xlDown)).Rows.Count

     Range("O1").Select
     i = 1
     Do While i <= numrows
         ActiveCell.Offset(rowOffset:=1, columnoffset:=4) = "X"
         ActiveCell.Offset(1, 0).Select
         Range("M1") = ActiveCell
         Call Send_to_PDF
         i = i + 1
    Loop
    MsgBox "Dear Sir / Madam your base data has been refreshed and all other relivant formatting macros have been run"
End Sub

保存宏

Sub Send_to_PDF()

Dim Ref As String

Dim St As String
Dim En As String
Dim Ex_Ref As String

FilePath = "P:\Hyundai\Hyundai GLOBAL\Country folders\EUROPE\A3 Ops reports"

Sheets("Dashboard - ENG").Select
Sheets("Dashboard - ENG").Copy


Cells.Select
Range("C1").Activate
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Application.CutCopyMode = False

Ex_Ref = Sheets("Dashboard - Eng").Range("L1")
St = FilePath + "\Dashboard - ENG"
Ref = Format(DateAdd("m", -1, Now()), "yyyymm")
En = ".xlsx"


  ChDir FilePath
    ActiveWorkbook.SaveAs Filename:=St & " " & " " & Ex_Ref & " " & Ref & En

  ActiveWorkbook.Theme.ThemeColorScheme.Load ( _
        "C:\Program Files (x86)\Microsoft Office\Document Themes 15\Theme Colors\Office 2007 - 2010.xml" _
        )


  ActiveWindow.Close

PS:我知道它不会发送到 PDF

有人有什么想法吗?

【问题讨论】:

不惜一切代价避免.Select.ActiveWorkbook.Activate!重构所有代码以将所有工作簿、工作表和范围(单元格)限定为变量,并在 With End 块内直接使用它们,您可能会解决您的问题,或者能够更好地理解它为什么不工作......现在我阅读了更多内容,请将 ActiveWorkbook.SaveAs 更改为 ActiveSheet.ExportAsFixedFormat(并提供所需的参数) 很抱歉,如果我造成任何混淆,这张表格曾经导出为 PDF,但现在需要保存为 Excel 表格,这是导致我出现问题的原因 您是否按照我的建议重构了代码?我相信这将有助于解决问题。使用 ActiveSheet 和 ActiveWorkbook 并在它们之间进行如此多的跳转会导致很多意想不到的问题? 不,Scott,我还没有尝试过,但我会在星期一第一时间尝试 嗨,斯科特,我必须使用活动工作表作为复制 excel 选项卡的方法,在随机命名的文件中创建活动工作表。我使用 tab copy to new sheet 方法来创建仪表板的副本 - Eng tab 【参考方案1】:

您只需 PDF 格式的工作表,无需复制。

例如

Sub PDFme()
    Dim dr As String
    Dim PDFnm As String
    Dim myFnm As String
    Dim PdfSH As Worksheet

    dr = "C:\Users\dmorrison\Downloads\"
    PDFnm = "MyPDF.pdf"
    myFnm = dr & PDFnm
    Set PdfSH = Sheets("Dashboard - ENG")

    PdfSH.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
                              myFnm, Quality:=xlQualityStandard, _
                              IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
                              True
End Sub

【讨论】:

谢谢,但我需要将其保存为 excel,尽管我同意 PDF 会更简单 您不想将其保存为 PDF,我认为这就是整个问题。如果不是这种情况,可能会改写您的问题。【参考方案2】:

大家好,感谢您帮助我解决了这个问题。

不是保存宏而是循环宏

子报表更新()

将 i 设为整数,将 numrows 设为整数

    **Sheets("Text").Select (**

    numrows = Range("O2", Range("O2").End(xlDown)).Rows.Count

    Range("O1").Select

    i = 1

     Do While i <= numrows

     Sheets("text").Select
     ActiveCell.Offset(rowOffset:=1, columnoffset:=4) = "X"
     ActiveCell.Offset(1, 0).Select
     Range("M1") = ActiveCell

              Save_2_Excel

    i = i + 1

    Loop


    MsgBox "Dear Sir / Madam your base data has been refreshed and all other relivant formatting macros have been run"

结束子

我只添加了粗体行,因为在循环再次开始之前需要重新激活工作表中的活动单元格

PS:如果您要复制此文件以循环保存在 excel 中的文件,请添加到 excel 保存宏

ActiveWindow.Close False

这将关闭新工作表而不保存,这很酷,因为这是最后一条指令并且工作表已经保存

【讨论】:

以上是关于在 VBA 循环中保存 excel 文件的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA - 循环未正确添加数据

VBA 另存为 CSV 文件被第一张表覆盖

excel vba卡在某个点

EXCEL2010 vba 循环打开某些文件夹下的excel文件

EXCEL VBA:循环正在工作,但在打印到 PDF 文件之前不刷新

VBA:循环遍历各种Excel文件并将列复制到主文件中[关闭]