【问题标题】:Coding works in Windows OS but not in Mac OS( Run time error 1004)编码在 Windows 操作系统中有效,但在 Mac 操作系统中无效(运​​行时错误 1004)
【发布时间】:2014-12-15 06:24:09
【问题描述】:

使用它从特定文件夹中获取 excel 文件。 它在 windows 操作系统中工作,但在 Mac 操作系统中不工作。 如何使其成为交叉板形式?请帮忙。

 Sub getfilename()
 Dim objFSO As Object
Dim intCountRows As Integer
Application.FileDialog(msoFileDialogFolderPicker).Title = _
"Select a Path"
intResult = Application.FileDialog( _
msoFileDialogFolderPicker).Show
If intResult <> 0 Then
    strpath = Application.FileDialog(msoFileDialogFolderPicker _
    ).SelectedItems(1)
    Set objFSO = CreateObject("Scripting.FileSystemObject")
ThisWorkbook.Activate
Sheets("dropdown").Select
Range("q2").Value = strpath
End If
Dim objFolder As Object
Dim objFile As Object
Dim i As Integer
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(strpath)
 ThisWorkbook.Activate
Sheets("dropdown").Activate
Range("aa3:aa2000").Clear
i = 1
For Each objFile In objFolder.Files
    Filename = objFile.Name      
     Range("aa1000").Select
    Selection.End(xlUp).Select
    ActiveCell.Offset(1, 0).Select
    Application.ActiveCell = Filename
 Next objFile
End Sub

【问题讨论】:

  • 哪里出错了?
  • Scripting.FileSystemObject 是一个 Windows DLL,在 Mac 上不可用。对于 Mac,您将需要完全不同。

标签: excel operating-system vba


【解决方案1】:

您可以查看它是什么操作系统,并为每个操作系统运行不同的代码,解决 Mac 版本中特别出现的任何问题区域。很可能是与excel无关的代码。正如@chrisneilson 提到的,特别是“Scripting.FileSystemObject”

此外,如下面的 cmets 中所述,不可接受的代码行无论如何都会被编译并导致错误,因此您需要运行代码 using conditional compilation

基本上它们仅在满足条件时才编译,您可以通过在行前使用“#”来执行此操作,例如 If 语句:“#If”

改编自 MSDN 的:Run The Correct Macro in Windows or on the Macintosh

Sub WINorMAC()
'Test using conditional compiler constants.
    #If Win32 Or Win64 Then
        'Is a Windows user.
        Call getfilename
    #Else
        'Is a Mac user so you need to test whether the product is Excel 2011 or later.
        If Val(Application.Version) > 14 Then
            Call My_Mac_Macro  'almost getfilename, with some replacements for Mac
        End If
    #End If
End Sub

现在只需修改您的 sub getfilename() 以包含条件编译器常量。而对于 Mac 版本则相反,以确保没有编译错误。

Sub getfilename()
    #If Win32 Or Win64 Then
        Dim objFSO As Object
        Dim intCountRows As Integer

        Application.FileDialog(msoFileDialogFolderPicker).Title = _
            "Select a Path"
            intResult = Application.FileDialog( _
            msoFileDialogFolderPicker).Show

        If intResult <> 0 Then
            strpath = Application.FileDialog(msoFileDialogFolderPicker _
                ).SelectedItems(1)
            Set objFSO = CreateObject("Scripting.FileSystemObject")

            ThisWorkbook.Activate
            Sheets("dropdown").Select
            Range("q2").Value = strpath

        End If

        Dim objFolder As Object
        Dim objFile As Object
        Dim i As Integer

        Set objFSO = CreateObject("Scripting.FileSystemObject")
        Set objFolder = objFSO.GetFolder(strpath)

        ThisWorkbook.Activate
        Sheets("dropdown").Activate
        Range("aa3:aa2000").Clear
        i = 1
        For Each objFile In objFolder.Files
            Filename = objFile.Name
             Range("aa1000").Select
            Selection.End(xlUp).Select
            ActiveCell.Offset(1, 0).Select
            Application.ActiveCell = Filename
        Next objFile
    #End If
End Sub

编辑:在 cmets 和讨论之后修改答案,除了检查操作系统类型外,还包括条件编译器。

【讨论】:

  • 您可以为每个问题找到解决方案。这里的重点是您需要将代码拆分为 PC 或 Mac。尝试搜索“Mac version scripting.filesystemobject”并从那里开始
  • StackOverflow 中的这个问题应该让您开始朝那个方向发展。大多数与 Excel 相关的 VBA 应该仍然有效。 stackoverflow.com/questions/4670420/…
  • @PJ 如果一个操作系统的代码不能编译另一个操作系统,这将不起作用。改用条件编译 (#If Mac Then ...)
  • @PJ VBA 仅尝试编译相关的 It Then Else 部分中的代码。 see this answer for an example
  • 您能否在子例程中包含相关代码,并且仅在建立操作系统后才调用它?或者甚至在不被调用的 sub 中有不可编译的行会阻止它?
猜你喜欢
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 2011-11-30
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多