- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 VBA 代码,可以控制用户以 .xls、.xlsm 或 .pdf 以外的任何其他格式保存文件。这是为了防止在保存过程中剥离宏。
我插入了一行来检查操作系统是否为 OSx(...如“Mac”),它适用于其他宏,但不适用于此宏。该过程失败,并显示“找不到文件对象或库”,并突出显示“msoFileDialogSaveAs”。
这是我的代码:
Option Explicit
Option Compare Text
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _
Cancel As Boolean)
Dim fso As Object 'FileSystemObject
Dim PdfSave As Boolean
Dim SheetName As String
If Not Application.OperatingSystem Like "*Mac*" Then
SheetName = ActiveSheet.Name
'Save-As action?
If SaveAsUI Then
Set fso = CreateObject("Scripting.FileSystemObject")
'Abort excel's dialog
Cancel = True
'Create our own
With Application.FileDialog(msoFileDialogSaveAs)
'Select the XLSM filter by default
.FilterIndex = 2
Again:
'Ok clicked?
If .Show = -1 Then
'Which extension should we save?
Select Case fso.GetExtensionName(.SelectedItems(1))
Case "xlsm"
'Okay
Case "xls"
'Okay
Case "pdf"
PdfSave = True
'Okay
Case Else
MsgBox "Invalid file type selected!" _
& vbCr & vbCr & "Only the following file formats are permitted:" _
& vbCr & " 1. Excel Macro-Enabled Workbook (*.xlsm)" _
& vbCr & " 2. Excel 97-2003 Workbook (*.xls)" _
& vbCr & " 3. PDF (*.pdf)" _
& vbCr & vbCr & "Please try again." _
& vbCr & vbCr & "NOTE: 'Excel 97-2003 Workbook (*.xls)' format should be used for" _
& vbCr & "backwards compatability only!", vbOKOnly + vbCritical
GoTo Again
End Select
'Prevent that we call ourself
Application.EnableEvents = False
'Save the file
If PdfSave = True Then
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=ActiveWorkbook.Path & "\" & SheetName & ".pdf", Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True
Else
ThisWorkbook.SaveAs .SelectedItems(1)
End If
Application.EnableEvents = True
End If
End With
End If
End If
End Sub
任何人都可以提出更改建议,以便此代码适用于 PC 和 MAC 上的 Office,或者使用不同的代码来实现相同的功能。
谢谢
迈克
最佳答案
在 Mac 和 PC 环境中工作时,您正走向 map 的边缘,我必须经常这样做,而且波涛汹涌的大海是肯定的!我的建议是坚持下去,你走在正确的道路上。
首先,我有一个类似的操作系统检查:-
BlnIsAPC = IIf(Left(Trim(UCase(Application.OperatingSystem)), 1) = "M", False, True)
这只是试图找到最适合 future 的方法来使操作系统正确运行。
其次,很高兴您迟到绑定(bind)到 Scripting.FileSystemObject
,因为它不在 Mac Office 中(它是 Windows 的一部分,而不是 Office)。
第三,FileDialog
也不是,因此出现错误“找不到文件对象或库”。还有一个替代方案,您最终需要引用一下它。它是一个名为 MacScript 的内置函数。
您需要弄清楚如何在 AppleScript 中执行此操作,然后创建该脚本并通过 VBA 中的 MacScript 运行它。下面是我工作的一个精简示例,其中我的代码要么在 PC 上使用 Application.FileDialog(msoFileDialogOpen)
,要么在 Mac 上使用 MacScript
,具体来说这只是显示 Mac 端。
Public Function GetFilePath(ByVal StrTitle As String, ByVal StrButtonName As String, ByVal BlnMultiSelect As Boolean, ByVal StrFilters As String) As String
' StrTitle = The title to go on the dialog box
' StrButtonName = What to show on the OK button
' BlnMultiSelect = Can the user select more than one file
' StrFilters = What can be selected pipe and colon delimited i.e. [name]:[suffix]|[name]:[suffix]
If Procs.Global_IsAPC Then
GetFilePath = GetFilePath_PC(StrTitle, StrButtonName, BlnMultiSelect, StrFilters)
Else
GetFilePath = GetFilePath_Mac(StrTitle, StrButtonName, BlnMultiSelect, StrFilters)
End If
End Function
Private Function GetFilePath_PC(ByVal StrTitle As String, ByVal StrButtonName As String, ByVal BlnMultiSelect As Boolean, StrFilters As String) As String
...
End Function
Private Function GetFilePath_Mac(ByVal StrTitle As String, ByVal StrButtonName As String, ByVal BlnMultiSelect As Boolean, StrFilters As String) As String
Dim AryTemp2() As String
Dim LngCounter As Long
Dim StrContainer As String
Dim StrPath As String
StrContainer = "tell application " & """" & "Finder" & """" & Chr(13)
StrContainer = StrContainer & "choose file with prompt " & """" & StrTitle & """"
If StrFilters <> "" Then
StrContainer = StrContainer & " of type {"
'Code was here that prepared the filters into AryTemp2
For LngCounter = 0 To UBound(AryTemp2, 1)
If Right(StrContainer, 1) <> "{" Then StrContainer = StrContainer & ", "
StrContainer = StrContainer & """" & AryTemp2(LngCounter2) & """"
Next
StrContainer = StrContainer & "} "
End If
StrContainer = StrContainer & "without invisibles" & IIf(BlnMultiSelect, "", " and multiple selections") & " allowed" & Chr(13)
StrContainer = StrContainer & "end tell"
StrPath = MacScript(StrContainer)
If Left(StrPath, 6) = "alias " Then StrPath = Right(StrPath, Len(StrPath) - 6)
GetFilePath_Mac = StrPath
End Function
仅供引用,在 MacScript
中执行时,StrContainer
如下所示:-
tell application "Finder"
choose file with prompt "Select the required Config stub" of type {"Config_Stub"} without invisibles and multiple selections allowed
end tell
最后,VBA 并非在所有版本的 Office for Mac 上都可用,并且它们之间的工作方式存在细微的差异,不幸的是,您只能通过经验才能发现这些差异。就像我说的“你正在离开 map 的边缘”进入未知的水域。
关于excel - SaveAs 功能适用于 Microsoft PC,但不适用于 MAC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37410565/
我正在构建一个 RCP 应用程序,其中每个季度都会更新功能/插件。因此,如果用户选择自动更新功能/插件,则会下载更新插件的新 jar,但旧插件仍在使用我不再使用的磁盘空间。 我厌倦了删除包含旧 jar
我如何从外部 Controller 功能中调用 Controller 内部的功能,例如电话间隙回调功能 这是 Controller 外部定义的功能 function onDeviceReady()
如果某个功能(例如 MediaSource)可用,我如何使用 Google Dart 检查。 new MediaSource() 抛出一个错误。如何以编程方式检查此类或功能是否存在?有任何想法吗?是否
我正在尝试运行 Azure Orchestrations,突然我开始从 statusQueryGetUri 收到错误: 协调器函数“UploadDocumentOrchestrator”失败:函数“U
我见过 iPhone 上的应用程序,如果在 3.0 上运行,将使用 3.0 功能/API,例如应用内电子邮件编辑器,如果在 2.x 上运行,则不使用这些功能,并退出应用程序以启动邮件相反。 这是怎么做
这是 DB 规范化理论中的一个概念: Third normal form is violated when a non-key field is a fact about another non-ke
如果我定义 #if SOMETHING #endif 而且我还没有在任何地方定义 SOMETHING。 #if 中的代码会编译吗? 最佳答案 当#if的参数表达式中使用的名称未定义为宏时(在所有其他宏
我刚刚澄清了 A* 路径查找应该如何在两条路径具有相等值的 [情况] 下运行,无论是在计算期间还是在结束时,如果有两条相等的短路径。 例如,我在我的起始节点,我可以扩展到两个可能的节点,但它们都具有相
Java有没有类似下面的东西 宏 一种遍历所有私有(private)字段的方法 类似于 smalltalk symbols 的东西——即用于快速比较静态字符串的东西? 请注意,我正在尝试为 black
这个程序应该将华氏度转换为摄氏度: #include int main() { float fahrenheit, celsius; int max, min, step;
当打开PC缓存功能后, 软件将采用先进先出的原则排队对示波器采集的每一帧数据, 进行帧缓存。 当发现屏幕中有感兴趣的波形掠过时, 鼠标点击软件的(暂停)按钮, 可以选择回看某一帧的波形
我有一个特殊的(虚拟)函数,我想在沙盒环境中使用它: disable.system.call eval(parse(text = 'model.frame("1 ~ 1")'), envir = e
使用新的 Service 实现,我是否必须为我的所有服务提供一个 Options 方法? 使用我的所有服务当前使用的旧 ServiceBase 方法,OPTIONS 返回 OK,但没有 Access-
我正在阅读 Fogus 的关于 Clojure 的喜悦的书,在并行编程章节中,我看到了一个函数定义,它肯定想说明一些重要的事情,但我不知道是什么。此外,我看不到这个函数有什么用 - 当我执行时,它什么
我有大量的 C 代码,大部分代码被注释掉和/或 #if 0。当我使用 % 键匹配 if-else 的左括号和右括号时,它也匹配注释掉的代码。 有没有办法或vim插件在匹配括号时不考虑注释掉或#if 0
我有这个功能: map(map(fn x =>[x])) [[],[1],[2,3,4]]; 产生: val it = [[],[[1]],[[2],[3],[4]]] 我不明白这个功能是如何工作的。
我使用 Visual Studio 代码创建了一个函数应用程序,然后发布了它。功能应用程序运行良好。我现在在功能门户中使用代码部署功能(KUDU)并跳过构建。下面是日志 9:55:46 AM
我有一个数据框df: userID Score Task_Alpha Task_Beta Task_Charlie Task_Delta 3108 -8.00 Easy Easy
我真的无法解决这个问题: 我有一个返回数据框的函数。但是,数据框仅打印在我的控制台中,尽管我希望将其存储在工作空间中。我怎样才能做到这一点? 样本数据: n <- 32640 t <- seq(3*p
有没有办法找出所有可能的激活器命令行选项? activator -help仅提供最低限度的可用选项/功能列表,但所有好的东西都隐藏起来,即使在 typesafe 网站在线文档中也不可用。 到目前为止,
我是一名优秀的程序员,十分优秀!