如何分配 excel sheet 中的特定按钮来执行某些特定任务?
How to assign a specific button in excel sheet to do some specific task?
我想在此 excel sheet 上添加一个按钮,其名称应为“另存为 PDF”。
当我按下这个按钮时,它应该将 excel sheet 的所有数据保存为 PDF 路径 - M:\formats\‘File Name’
‘文件名’应为H8号单元格的值。
换句话说,当我单击“另存为 PDF”按钮时,它应该将 excel 文件以 pdf 格式保存到上述路径中,并使用单元格编号 H8 中写入的名称。
例如,如果名称 ANDREW PITTERSON 写在 H8 单元格中,那么它应该以相同的名称保存,即安德鲁·皮特森。
请看这张快照。
这里有一篇 link 非常简单的文章,可以做这类事情。 http://www.contextures.com/excelvbapdf.html
我在 Excel 2013 年测试了代码示例,它运行良好。该代码询问用户将 PDF 保存在哪个目录中。
但是您的问题是您还想保存到特定位置(无需用户干预)并从单元格中获取文件名。
更新 - 您还希望在创建 PDF 后将文件另存为 XLSM。
下面的代码可以满足您的需求(所有功劳都归功于原作者,但我自己的强迫症导致我将 var 名称更改为我喜欢的格式)。
我猜 OP 想知道它是如何完成的,而不仅仅是知道答案,所以我试图让这个例子易于理解,而不是试图观察最佳实践 - 我'感谢您没有为此投反对票。
请注意,您必须先打开 Excel 代码 window,找到工具,然后 参考文献 和 select 'Microsoft Scripting Runtime' 然后单击确定。这让您可以使用许多有用的功能。
我将目录路径(硬编码)和文件名分开,以便我可以更清楚地获得 'BaseName'。显然,这可以在更少的行中完成,但存在使其更难遵循的风险。
Sub ExportAPDF_and_SaveAsXLSM()
Dim wsThisWorkSheet As Worksheet
Dim objFileSystemObject As New Scripting.FileSystemObject
Dim strFileName As String
Dim strBasePath As String
strBasePath = "M:\formats\"
strFileName = Range("H8")
On Error GoTo errHandler
Set wsThisWorkSheet = ActiveSheet
wsThisWorkSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=strBasePath & strFileName, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=False
MsgBox "PDF file has been created."
' Now we need to get rid of the .PDF extension. Many ways to code round this, but here is a built in function.
strFileName = objFileSystemObject.GetBaseName(strFileName) & ".xlsm"
wsThisWorkSheet.SaveAs Filename:=strBasePath & strFileName, FileFormat:=xlOpenXMLWorkbookMacroEnabled
MsgBox "Workbook now saved in XLSM format."
exitHandler:
Exit Sub
errHandler:
MsgBox "Could not create PDF file"
Resume exitHandler
End Sub
只需将按钮 (ActiveX Button) 添加到您的工作表中,然后从按钮代码 window 中调用此子程序(或者直接将代码粘贴到按钮代码 window 中)。
希望对您有所帮助。
添加:
要将文件另存为 XLSX(无宏),请将 SUB 末尾的代码替换为:
Application.DisplayAlerts = False
strFileName = objFileSystemObject.GetBaseName(strFileName) & ".xlsx"
wsThisWorkSheet.SaveAs Filename:=strBasePath & strFileName, FileFormat:=xlOpenXMLWorkbook
Application.DisplayAlerts = False
我想在此 excel sheet 上添加一个按钮,其名称应为“另存为 PDF”。
当我按下这个按钮时,它应该将 excel sheet 的所有数据保存为 PDF 路径 - M:\formats\‘File Name’
‘文件名’应为H8号单元格的值。
换句话说,当我单击“另存为 PDF”按钮时,它应该将 excel 文件以 pdf 格式保存到上述路径中,并使用单元格编号 H8 中写入的名称。
例如,如果名称 ANDREW PITTERSON 写在 H8 单元格中,那么它应该以相同的名称保存,即安德鲁·皮特森。
请看这张快照。
这里有一篇 link 非常简单的文章,可以做这类事情。 http://www.contextures.com/excelvbapdf.html
我在 Excel 2013 年测试了代码示例,它运行良好。该代码询问用户将 PDF 保存在哪个目录中。
但是您的问题是您还想保存到特定位置(无需用户干预)并从单元格中获取文件名。
更新 - 您还希望在创建 PDF 后将文件另存为 XLSM。
下面的代码可以满足您的需求(所有功劳都归功于原作者,但我自己的强迫症导致我将 var 名称更改为我喜欢的格式)。
我猜 OP 想知道它是如何完成的,而不仅仅是知道答案,所以我试图让这个例子易于理解,而不是试图观察最佳实践 - 我'感谢您没有为此投反对票。
请注意,您必须先打开 Excel 代码 window,找到工具,然后 参考文献 和 select 'Microsoft Scripting Runtime' 然后单击确定。这让您可以使用许多有用的功能。
我将目录路径(硬编码)和文件名分开,以便我可以更清楚地获得 'BaseName'。显然,这可以在更少的行中完成,但存在使其更难遵循的风险。
Sub ExportAPDF_and_SaveAsXLSM()
Dim wsThisWorkSheet As Worksheet
Dim objFileSystemObject As New Scripting.FileSystemObject
Dim strFileName As String
Dim strBasePath As String
strBasePath = "M:\formats\"
strFileName = Range("H8")
On Error GoTo errHandler
Set wsThisWorkSheet = ActiveSheet
wsThisWorkSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=strBasePath & strFileName, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=False
MsgBox "PDF file has been created."
' Now we need to get rid of the .PDF extension. Many ways to code round this, but here is a built in function.
strFileName = objFileSystemObject.GetBaseName(strFileName) & ".xlsm"
wsThisWorkSheet.SaveAs Filename:=strBasePath & strFileName, FileFormat:=xlOpenXMLWorkbookMacroEnabled
MsgBox "Workbook now saved in XLSM format."
exitHandler:
Exit Sub
errHandler:
MsgBox "Could not create PDF file"
Resume exitHandler
End Sub
只需将按钮 (ActiveX Button) 添加到您的工作表中,然后从按钮代码 window 中调用此子程序(或者直接将代码粘贴到按钮代码 window 中)。
希望对您有所帮助。
添加: 要将文件另存为 XLSX(无宏),请将 SUB 末尾的代码替换为:
Application.DisplayAlerts = False
strFileName = objFileSystemObject.GetBaseName(strFileName) & ".xlsx"
wsThisWorkSheet.SaveAs Filename:=strBasePath & strFileName, FileFormat:=xlOpenXMLWorkbook
Application.DisplayAlerts = False