Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.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中使用Unicode文件名(使用Dir、FileSystemObject等)_Vba_Ms Access_Unicode_Ms Access 2013_Dir - Fatal编程技术网

在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
为所有文件返回零,还是仅为名称中带有“有趣字符”的文件返回零?也许是隐藏文件?