【问题标题】:Excel VBA Shell.Namespace returns NothingExcel VBA Shell.Namespace 不返回任何内容
【发布时间】:2015-06-30 01:44:58
【问题描述】:

我正在尝试使用 Excel VBA 提取 .CAB 文件,但出现以下错误:

运行时错误“91”:对象变量或未设置块变量

当我忘记将 Set 与 Object 一起使用时,我通常会得到这个,但我已经检查过了。

我能找到的所有例子都是这个主题的变体:

Private Function DeCab(vSource, vDest) As Long
    Dim objShell, objFileSource, objFileDest As Object
    Set objShell = CreateObject("Shell.Application")
    Set objFileSource = objShell.Namespace(vSource)
    Set objFileDest = objShell.Namespace(vDest)
    Call objFileDest.MoveHere(objFileSource.Items, 4 Or 16) 'Fails here
    Decab = objFileDest.Items.Count
End Function

Set 行没有失败,但它会将 objFileSourceobjFileDest 设置为 Nothing,即使我已经确认 vSourcevDest 存在。

为了确认它与 .CAB 文件无关,我也尝试过不设置 objFileSource 并在设置后检查 objFileDest 的值。它仍然返回Nothing。为什么会这样?我使用的是 64 位 Windows 7,运行 Office 2010。

【问题讨论】:

  • vSource 和 vDest 都是字符串变量吗?尝试变体。

标签: excel vba shell


【解决方案1】:

您的参数必须作为 Variant 提交,而不是 String

Sub Tester()

    Dim src, dest                      '<< works
    'Dim src As String, dest As String '<< gives the error you see

    src = "D:\temp\test.zip"
    dest = "D:\temp\unzip"

    DeCab src, dest

End Sub

https://msdn.microsoft.com/en-us/library/windows/desktop/bb774085(v=vs.85).aspx

【讨论】:

    【解决方案2】:

    蒂姆的回答是正确的。我也找到了替代方案:

    Private Function DeCab(vSource, vDest) As Long
        Dim objShell, objFileSource, objFileDest As Object
        Set objShell = CreateObject("Shell.Application")
        Set objFileSource = objShell.Namespace((vSource)) '<-extra parentheses
        Set objFileDest = objShell.Namespace((vDest)) '<-extra parentheses
        Call objFileDest.MoveHere(objFileSource.Items, 4 Or 16) 'Fails here
        Decab = objFileDest.Items.Count
    End Function
    

    当您在 VBA 中将一个对象放在括号中时,它会返回该对象的默认值。显然,objShell.Namespace 无法处理指针。它只能处理字符串文字。如果您传入字符串,将签名更改为以下内容也可以:

    Private Function DeCab(ByVal vSource, ByVal vDest) As Long
    

    【讨论】:

    • 我知道它有点老了,但我试图为我的问题找到一个解决方案,它似乎是相同的,但结果却添加了一种味道:
    • 我使用了上面的所有内容(已经将变量设置为变体)并尝试了括号但有同样的错误。查看每个细节,我发现文件夹名称首先被检测为“我的文档”并且无法设置,因为该文件夹的真实名称是“文档”。这是相关的还是我应该创建一个单独的问题?
    • 我会创建一个新问题,只是因为这是旧问题。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2019-04-06
    • 2012-02-15
    • 2020-09-07
    相关资源
    最近更新 更多