Excel VBA Shell,命名空间传回Nothing

vnjpjtjt  于 2022-11-16  发布在  Shell
关注(0)|答案(3)|浏览(156)

我尝试使用Excel VBA提取.CAB文件,但收到以下错误:
运行时错误'91':未设置对象变量或With块变量
当我忘记使用带Object的Set时,通常会出现这种情况,但我已经检查过了。
我能找到的所有例子都是这个主题的变体:

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。为什么会这样?我使用的是Windows 7,64位,运行Office 2010。

mqkwyuun

mqkwyuun1#

您的参数必须作为变量而不是字符串提交

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

vsnjm48y

vsnjm48y2#

蒂姆的答案是正确的。我也找到了另一个选择:

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不能处理指针。它只能处理字符串文字。如果您正在传入String,则将签名更改为以下内容也有效:

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

htrmnn0y3#

为了我的案子我用了贝壳

Set oShell = CreateObject("Shell.Application")
x= oShell.xxxx
y= oShell.Namespace(x)

在两个不同的行。似乎我需要重新初始化,以便能够在第二行使用。例如

Set oShell = CreateObject("Shell.Application")
x= oShell.xxxx
y= CreateObject("Shell.Application").Namespace(x)

那就只有它能起作用。

相关问题