将 FSO 设置为 FileSystemObject 与 Scripting.FileSystemObject

Setting FSO to FileSystemObject vs Scripting.FileSystemObject

我刚刚经历过这样的时刻之一,你走出杂草,检查你的代码并问自己“我为什么要那样做?”

我有一个脚本可以使用 FileSystemObject 创建一个包含多个子文件夹和文件的文件夹。一切正常,但我想我一直在改变设置 fso 变量的方式。

我的项目使用 Microsoft Scripting Runtime Library 引用,这样我就可以使用早期绑定(尽管我发现了几个 Set fso = CreateObject("Scripting.FileSystemObject" 的实例),这对于这个项目来说很愚蠢)。可能是因为我的很多代码都来自在线示例,但我一直以两种方式之一设置这些 fso 变量:

Set FSo = New FileSystemObject

Set FSo = New Scripting.FileSystemObject

这些有什么区别?我使用哪种重要,还是只在某些情况下使用?

它们之间的区别在于后者消除了 FileSystemObject 属于 Scripting 而不是其他东西的歧义。

如果您在该工作簿中有自己的 class 命名为 FileSystemObject,后者将需要指定您正在创建 Scripting.FileSystemObject 而不是 Yourworkbook.FileSystemObject

同样,如果您引用了一些其他外部库,该库也具有名为 FileSystemObject 的 class,它也可以解决该歧义。这就是为什么在“添加引用”对话框中有 up/down 个箭头 - 它们决定在名称冲突的情况下哪个库获胜,并且编码器没有明确消除歧义。

VBA 中需要消除歧义的常见情况是同时使用 Word 和 Excel 对象模型。两者都有一个叫做Range的class,你经常需要指定这次你想要Word.Range还是Excel.Range

如果您没有任何此类冲突的名称,这对您来说没有任何区别,除了可能让将来 reader 更容易回忆起 FileSystemObject 是那个东西来自 Scripting.