Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba FileSystemObject FileExists可在一台计算机上工作,但不能在另一台计算机上工作_Vba_Excel_Excel 2010_Fso - Fatal编程技术网

Vba FileSystemObject FileExists可在一台计算机上工作,但不能在另一台计算机上工作

Vba FileSystemObject FileExists可在一台计算机上工作,但不能在另一台计算机上工作,vba,excel,excel-2010,fso,Vba,Excel,Excel 2010,Fso,在Excel2010VBA中,我使用FileSystemObject的FileExists属性检查文件是否存在。在我的电脑上,它工作正常。但在另一台Excel 2010计算机上,它报告文件不在那里,而事实上我们在Windows资源管理器中看到文件在那里。在这两种情况下,要检查的文件都位于本地硬盘驱动器上 在使用Shell解压文件之后,我正在检查该文件。解压后我使用DoEvents。正在将文件解压缩到zip文件所在的文件夹中 代码如下: Dim oShell As Object, oZippedF

在Excel2010VBA中,我使用FileSystemObject的FileExists属性检查文件是否存在。在我的电脑上,它工作正常。但在另一台Excel 2010计算机上,它报告文件不在那里,而事实上我们在Windows资源管理器中看到文件在那里。在这两种情况下,要检查的文件都位于本地硬盘驱动器上

在使用Shell解压文件之后,我正在检查该文件。解压后我使用DoEvents。正在将文件解压缩到zip文件所在的文件夹中

代码如下:

Dim oShell As Object, oZippedFile As Object, oUnzipTargetFolder As Object
Dim FSO As Object, oFile As Object, oFolder As Object
Dim strZipfileFullpath As Variant, strTargetFolderpath As Variant, strTargetFullpath As Variant 'NOT AS STRINGS!! (Shell error if strings)
Dim bFileCheckFsoFileExist As Boolean

Set oShell = CreateObject("shell.application")
Set FSO = CreateObject("scripting.filesystemobject")

strZipfileFullpath = Application.GetOpenFilename(filefilter:="Zip Files (*.zip), *.zip", MultiSelect:=False)

Set oFile = FSO.GetFile(strZipfileFullpath)
Set oFolder = oFile.ParentFolder
strTargetFolderpath = oFolder.Path & Application.PathSeparator
strTargetFullpath = strTargetFolderpath & oShell.Namespace(strZipfileFullpath).Items.Item(0).Name

oShell.Namespace(strTargetFolderpath).CopyHere oShell.Namespace(strZipfileFullpath).Items.Item(0) 'this zip has only one file.
DoEvents

bFileCheckFsoFileExist = FSO.FileExists(strTargetFullpath)
你知道为什么这在一台计算机上运行良好,但在另一台计算机上,即使我们清楚地看到文件不存在,也会报告该文件不存在吗

更新:

我想我应该加上这张便条,以防对遇到同样困难的其他人有所帮助

基本的基本问题是,当使用Shell提取压缩文件时,如果Windows资源管理器隐藏扩展名并且文件具有注册的扩展名,则压缩文件对象的Name属性不包括扩展名。例如:

Dim strGofnZipfileFullpath As Variant
Dim oShell As Object, oShellZipfile As Object, oShellZippedFileInZipfile As Object
Dim strShellZippedFileInZipfileFilename As Variant 'NOT AS STRINGS!! (Shell error if strings)

strGofnZipfileFullpath = Application.GetOpenFilename(filefilter:="Zip Files (*.zip), *.zip", MultiSelect:=False)

Set oShell = CreateObject("shell.application")
Set oShellZipfile = oShell.Namespace(strGofnZipfileFullpath)
Set oShellZippedFileInZipfile = oShellZipfile.Items.Item(0) 'assumes only 1 file in zip. 
        strShellZippedFileInZipfileFilename = oShellZippedFileInZipfile.Name
如果Windows资源管理器设置为隐藏扩展名,并且压缩文件具有注册的扩展名,则strShellZippedFileInZipFileFileFileFileFileFileFileName不包括扩展名

但是,压缩文件对象oShellZippedFileInZipfile也有一个包含扩展名的Path属性。因此,您可以获得包含以下扩展名的文件名:

strShellZippedFileInZipfileFilename = Right(oShellZippedFileInZipfile.Path, InStr(StrReverse(oShellZippedFileInZipfile.Path), Application.PathSeparator) - 1)

要记住的一件事是Windows资源管理器中的文件夹选项。在这种情况下,这可能对您没有帮助,但我遇到过许多fso交互,它们在Windows资源管理器中如何显示文件方面存在巨大问题。像您的系统显示文件扩展名这样简单的东西,而另一个不显示文件扩展名,有时可能是查找文件的罪魁祸首。

在最后一行中,strTargetFullpath似乎没有指定值…谢谢Tim;我已经把那一行加进去了。我试图通过删除不相关的行来简化它,但没有包括那一行。你尝试过dirstTargetFullPath吗?它会给出相同的结果吗?嗨,蒂姆,环顾四周后,我觉得我不应该依靠任何单一的方法来检查文件的存在;听起来他们中的任何一个偶尔都会返回假阴性。我正在编写一个函数,用三种不同的方法检查文件是否存在:fso、Dir和FileLen。如果其中任何一个返回true/success,则函数将返回true。只有当他们都没有找到文件时,函数才会返回false;在FileExists工作的浏览器上,Windows资源管理器设置为显示文件扩展名。另一方面,情况并非如此。我不明白为什么这会影响fso,尽管我没有一个好的答案。我提出的解决方法是查看文件名,如果文件名不包含扩展名,则添加扩展名,然后在文件上运行我需要的任何代码。通过更改窗口资源管理器选项并再次运行代码,您可以轻松检查是否存在这种情况。如果失败了,那就是你的问题了。vbnoob,那确实是问题所在。在Windows资源管理器设置为隐藏文件扩展名的情况下,“oShell.NamespacestrZipfileFullpath.Items.Item0.Name”返回不带扩展名的文件名。然后,当fso.FileExists检查文件是否存在时,它会得到一个假阴性。