Có vẻ như bạn đang bị lừa bởi thực tế là trong khi chính VBA hỗ trợ các ký tự Unicode, môi trường phát triển VBA VBA thì không. Trình soạn thảo VBA vẫn sử dụng mã hóa ký tự "mã trang" cũ dựa trên thiết lập miền địa phương trong Windows.
Chắc chắn FileSystemObject
et. al. thực tế hỗ trợ các ký tự Unicode trong tên tệp, như được minh họa bằng ví dụ sau. Với một thư mục chứa ba tập tin văn bản đơn giản
Tên tập tin: 1_English.txt
Nội dung: London is a city in England.
Tên tập tin: 2_French.txt
Nội dung: Paris is a city in France.
Tên tập tin: 3_Połish.txt
Nội dung: Warsaw is a city in Poland.
Sau đây Mã VBA ...
Option Compare Database
Option Explicit
Sub scanFiles()
Dim fso As New FileSystemObject, fldr As Folder, f As File
Set fldr = fso.GetFolder("C:\__tmp\so33685990\files")
For Each f In fldr.Files
Debug.Print f.Path
Next
Set f = Nothing
Set fldr = Nothing
Set fso = Nothing
End Sub
... xuất ra như sau trong cửa sổ ngay ...
C:\__tmp\so33685990\files\1_English.txt
C:\__tmp\so33685990\files\2_French.txt
C:\__tmp\so33685990\files\3_Polish.txt
Lưu ý rằng tuyên bố Debug.Print
chuyển đổi nhân vật ł
-l
vì môi trường phát triển VBA không thể hiển thị ł
sử dụng Windows của tôi ngôn ngữ (tiếng Anh Mỹ).
Tuy nhiên, đoạn mã sau không mở tất cả ba tác phẩm thành công ...
Option Compare Database
Option Explicit
Sub scanFiles()
Dim fso As New FileSystemObject, fldr As Folder, f As File, ts As TextStream
Set fldr = fso.GetFolder("C:\__tmp\so33685990\files")
For Each f In fldr.Files
Set ts = fso.OpenTextFile(f.Path)
Debug.Print ts.ReadAll
ts.Close
Set ts = Nothing
Next
Set f = Nothing
Set fldr = Nothing
Set fso = Nothing
End Sub
... hiển thị
London is a city in England.
Paris is a city in France.
Warsaw is a city in Poland.
Nguồn
2015-11-13 12:42:06
tôi xấu, tôi thực sự đã làm điều này trong một vội vàng nhưng nó đã không để chỉ ra rằng đó là một bản sao, nó đã được trỏ đến một góc có thể để làm việc với, nhưng sau khi xem xét kỹ hơn nó sẽ không áp dụng cho vấn đề của bạn. Hãy để tôi xem xét kỹ hơn. Bạn có thể gửi mã của bạn? Hoặc làm thế nào bạn 'Dim' biến mà bạn sử dụng cho' Dir'? Bạn đã thử * Files Scripting Object *? – R3uK
Liên kết này http://www.vbforums.com/showthread.php?555086-RESOLVED-Unicode-file-name & highlight = FindNextFileW/# 4 ... không có vẻ thú vị nhưng nó VB và không chỉ VBA. Ngoài ra còn có một phương pháp để chuyển đổi các ký tự đặc biệt sau đó nhưng nó sẽ chỉ làm việc cho các nhân vật mà bạn đã thực hiện một transcodification cho. Dù sao, có vẻ như FSO (Files Scripting Object) không có giới hạn giống như 'Dir', vì vậy cá nhân tôi sẽ đi theo cách đó nếu nó không phức tạp để thực hiện trong mã của bạn! – R3uK
Thiệt hại ... FSO có cùng một vấn đề ... Bạn đã cố gắng khai báo giá trị Dir của bạn dưới dạng Biến thể chưa? (đoán hoang dã nhưng tại thời điểm này, có vẻ như (với tôi ít nhất) rằng chỉ có VB hoặc Transcodification trái ...). Dưới đây là các liên kết cho transco/chuyển đổi: http://www.pcreview.co.uk/threads/workaround-for-chdir-curdir-when-path-has-unicode-characters.3155241/#post-10639076 và http: //www.vbforums.com/showthread.php?596307-How-to-check-if-a-file-folder-with-unicode-filename-extists-getting-its-attributes&p=3683899&viewfull=1#post3683899 – R3uK