在 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 文件的主要内容,如果未能解决你的问题,请参考以下文章
EXCEL2010 vba 循环打开某些文件夹下的excel文件