2015-11-13 14 views
7

Tôi đang lặp thông qua các tệp trong thư mục (có nghĩa là tôi không biết tên trong thư mục) và có tệp bằng tiếng Ba Lan ł ký tự.Làm việc với tên tệp Unicode trong VBA (sử dụng Dir, FileSystemObject, v.v.)

Chức năng Dir chuyển đổi thành l có nghĩa là không thể tìm thấy tên tệp sau này. Tôi đã khai báo var mà tôi gán giá trị dir thành một chuỗi.

Tôi cũng đã thử FSO và thư mục cũng có cùng vấn đề.

Tôi cũng nhận thấy hộp thoại tệp (được đặt thành chế độ chọn thư mục) cũng chuyển đổi ký tự ở trên.


Đây có phải là lỗi hoặc có thể làm việc xung quanh không?

+0

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

+0

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

+0

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

Trả lời

3

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 FileSystemObjectet. 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. 
+0

@ user3791372 - Khi tôi 'Debug.Print f.Size' trong vòng lặp, tôi nhận được các giá trị đúng (không khác). Tôi không chắc chắn ý bạn là gì bởi "LOF", vì vậy có thể bạn đang làm điều gì đó khá khác biệt. –

+0

@ user3791372 - Không 'f.Size' trả lại số không cho tất cả các tệp hay chỉ cho những tệp có" ký tự vui "trong tên của chúng? –

+0

Một tệp ẩn, có lẽ? –

Các vấn đề liên quan