在VBA中使用Unicode文件名(使用Dir、FileSystemObject等)
我正在对文件夹中的文件进行迭代(这意味着我不知道文件夹中的名称),并且有一个带有波兰语在VBA中使用Unicode文件名(使用Dir、FileSystemObject等),vba,ms-access,unicode,ms-access-2013,dir,Vba,Ms Access,Unicode,Ms Access 2013,Dir,我正在对文件夹中的文件进行迭代(这意味着我不知道文件夹中的名称),并且有一个带有波兰语ł字符的文件 Dir函数将其转换为l,这意味着以后无法找到文件名。我已经声明了将dir值分配给的var作为字符串 我也尝试过FSO和getfolder,它们也有同样的问题 我还注意到文件对话框(设置为文件夹选择模式)也会转换上面的字符 这是一个bug,还是可以解决的问题?听起来您被一个事实误导了,即虽然VBA本身支持Unicode字符,但VBA开发环境却不支持。VBA编辑器仍然基于Windows中的区域设置使
ł
字符的文件
Dir
函数将其转换为l
,这意味着以后无法找到文件名。我已经声明了将dir值分配给的var作为字符串
我也尝试过FSO和getfolder,它们也有同样的问题
我还注意到文件对话框(设置为文件夹选择模式)也会转换上面的字符
这是一个bug,还是可以解决的问题?听起来您被一个事实误导了,即虽然VBA本身支持Unicode字符,但VBA开发环境却不支持。VBA编辑器仍然基于Windows中的区域设置使用旧的“代码页”字符编码 当然
FileSystemObject
等确实支持文件名中的Unicode字符,如下例所示。包含三个纯文本文件的文件夹
文件名:1_English.txt
内容:
伦敦是英国的一座城市。
文件名:2_French.txt
内容:
巴黎是法国的一座城市。
文件名:3_Połish.txt
内容:
华沙是波兰的一座城市。
下面是VBA代码
选项比较数据库
选项显式
子扫描文件()
将fso设置为新文件系统对象,将fldr设置为文件夹,将f设置为文件
设置fldr=fso.GetFolder(“C:\\uu tmp\so33685990\files”)
对于fldr.文件中的每个f
调试.打印f.路径
下一个
设置f=无
设置fldr=无
设置fso=无
端接头
。。。在即时窗口中生成以下输出
C:\\uu tmp\so33685990\files\1\u English.txt
C:\\ uu tmp\so33685990\files\2\ u French.txt
C:\\ uu tmp\so33685990\files\3\ uPolish.txt
请注意,Debug.Print
语句将ł
字符转换为l
,因为VBA开发环境无法使用我的Windows语言环境(美国英语)显示ł
但是,以下代码确实成功地打开了所有三个文件
选项比较数据库
选项显式
子扫描文件()
将fso设置为新文件系统对象、fldr设置为文件夹、f设置为文件、ts设置为文本流
设置fldr=fso.GetFolder(“C:\\uu tmp\so33685990\files”)
对于fldr.文件中的每个f
设置ts=fso.OpenTextFile(f.Path)
Debug.Print ts.ReadAll
关闭
设置ts=无
下一个
设置f=无
设置fldr=无
设置fso=无
端接头
。。。展示
伦敦是英国的一座城市。
巴黎是法国的一座城市。
华沙是波兰的一座城市。
我的错,我确实是匆忙地做了这件事,但这并不是要指出它是重复的,而是要指出一个可能的角度,但仔细观察后,它将不适用于您的问题。让我仔细看看。你能发布你的代码吗?或者您是如何将
Dir
使用的变量变暗的?你也尝试过文件脚本对象吗?这个链接看起来很有趣,但它是VB,而不仅仅是VBA。还有一种方法可以在以后转换特殊字符,但它只适用于您已对其进行转码的字符。无论如何,FSO(文件脚本对象)似乎没有与Dir
相同的限制,所以我个人认为如果在代码中实现它不太复杂,我会这样做!该死FSO也有同样的问题。。。您是否尝试将Dir值声明为Variant?(胡乱猜测,但在这一点上,似乎(至少对我来说)只剩下VB或转码了…)。以下是transco/convert的链接:最好不要在文件名中使用非标准字符。三个选项-修复文件名或使用Dir的函数功能使用*
字符加载部分文件名或使用@Meehow using*没有任何帮助。字符转换是一个问题,意味着无法打开文件。而且,[a-z0-9\]+
文件名很久以前就消失了,特别是对于非英语用户。@user3791372-当我Debug.Print f.Size
在循环中时,我得到了正确的(非零)值。我不知道你所说的“LOF”是什么意思,所以也许你在做一些完全不同的事情。@user3791372-是f.Size
为所有文件返回零,还是仅为名称中带有“有趣字符”的文件返回零?也许是隐藏文件?