Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Home Premium : Excel 2010)
特殊文字?(他国文字?)をListBoxにそのまま表示
投稿日時: 20/03/14 11:39:03
投稿者: shimoichimabu

ファイル名を修正するプログラムを作っています。こちらで決めたルールで自動で修正しますが、そのルールにはずれたものを以下の方法で手で修正しています。        
UserFormに2つのListboxを配置しています。ListBox A、ListBox B        
あるフォルダ内のファイル名(音楽ファイル名)をListBox Aに取り込み、多くの場合、自動修正しますが、ルールからはずれたファイル名を修正したい場合は該当するListBox Aの行をダブルクリックして、新たな修正画面用のUserFormのTextBoxに表示させ、そこで修正し、ListBox Bにその修正結果を表示します。そして、OKボタンを押すと、一気にフォルダ内の元ファイル名を修正したファイル名に変更しています。        
しかし、元のファイルはダウンロードした音楽ファイルで、特殊な文字が入っていることがあります。    
例えば、〜LEGENDADO EM PORTUGUÊS BR.flvのファイル名に Ê という特殊文字?が含まれています。プログラムを実行すると、        
以下の部分で、実行時エラー;53  ファイルが見つかりません。        
 Name "\音楽ファイル\" & ListBox A.Column(0, N) As "\音楽ファイル\" & ListBox B.Column(0,N)
この原因はListBox Aに取り込まれた時、Ê が Eに変更されていることによるものと思います。        
この特殊文字?をListboxにそのまま取り込むことはできませんか?        
ちなみに、Ê はワークシートで=CODE関数では63でした。Á、É といった文字の時もエラーが出ましたが、=CODEは同じく63でした。        
これらの文字は英語ではなく、他国の文字ですか? VBAでは、このような文字はListBoxにそのまま表示されない仕様になっているのでしようか? EXCELのワークシート上にはきちんと
表示されるのに・・・。

回答
投稿日時: 20/03/14 13:54:31
投稿者: WinArrow
投稿者のウェブサイトに移動

>=CODE関数では63でした
  
「63」を文字にすると「?」です。
>&Ecirc
は、Unicodeで「00EA」です。
 
Unicoodeをリストボクスに表示するのは、結構難しいと思います。

回答
投稿日時: 20/03/14 13:56:00
投稿者: ちゃこ

>これらの文字は英語ではなく、他国の文字ですか?
フランス語じゃないですか?
https://on-ze.com/archives/334
 
いずれにしてもファイル名に特殊文字が含まれると、音楽ファイルや動画ファイルは
「ファイルが見つかりません」ということで多分再生されないと思いますが…
 
「Ê」は「E」にすれば再生されると思います。
 
VBAの話ではないので、関係なければスルーしてください。
 
 

投稿日時: 20/03/14 15:08:39
投稿者: shimoichimabu

WinArrowさん、ちゃこさん回答ありがとうございます。
 
UNICODEを変換させるのは難しいですか・・。
 
そちらに投稿した特殊文字が文字化けしていますね。
Áは aの上に ' が付いていたものです
Éは Eの上に ' が付いたものです。
 
VBA側でListBoxには  a 、E に変換されて表示されます。

回答
投稿日時: 20/03/14 15:15:00
投稿者: MMYS

shimoichimabu さんの引用:

例えば、〜LEGENDADO EM PORTUGUÊS BR.flvのファイル名に Ê という特殊文字?が含まれています。プログラムを実行すると、        
以下の部分で、実行時エラー;53  ファイルが見つかりません。        
 Name "\音楽ファイル\" & ListBox A.Column(0, N) As "\音楽ファイル\" & ListBox B.Column(0,N)

あまり、知られていませんが、VBA標準のファイル操作コマンドはUnicode非対応です。
 
Sub test()
    Dim old  As String
    Dim new1 As String
    Dim new2 As String
    
    old = "D:\新しいフォルダー\test1.txt"
    
    Range("A1").Value = "〒.txt"
    Range("A2").Value = ChrW(&H3020) & ".txt" '←郵便マーク
    
    new1 = "D:\新しいフォルダー\" & Range("A1").Value
    new2 = "D:\新しいフォルダー\" & Range("A2").Value
    
    Name old As new1	'←問題なし
    Name new1 As new2	'←エラー発生
    
End Sub

上記コードは ファイル名がUnicodeなのでエラーが発生。実行出来ません。
 
 
対処方法はFileSystemObjectオブジェクトなどで処理です。
 
Sub test2()
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    With FSO.GetFile("D:\新しいフォルダー\test.txt")
         .Name = ChrW(&H3020) & ".txt"
    End With
    Set FSO = Nothing
End Sub

ちなみにMsgbox関数もUnicode非対応です。(対処方法はAPI呼出)
 
 
WinArrow さんの引用:

Unicoodeをリストボクスに表示するのは、結構難しいと思います。

shimoichimabu さんの引用:

この原因はListBox Aに取り込まれた時、Ê が Eに変更されていることによるものと思います。

リストボクス等はUnicode対応しているはずです。試しに下記コードで問題なく扱えます。
 
Private Sub ListBox1_Change()
  Me.TextBox1.Text = Me.ListBox1.Value
End Sub

Private Sub UserForm_Activate()
  Dim c As Long
  For c = &HC0 To &HFF
    Me.ListBox1.AddItem ChrW(c)
  Next
End Sub

 
フランス語の文字 等ははこちらを参考にしました。
https://on-ze.com/archives/334
https://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_0000-0FFF

回答
投稿日時: 20/03/14 15:53:23
投稿者: MMYS

shimoichimabu さんの引用:

VBA側でListBoxには  a 、E に変換されて表示されます。

DIRコマンド使うと上記、現象が発生します。
DIRコマンド以外で取得してください。
 
Private Sub UserForm_Activate()
    Dim FSO As Object
    Dim f   As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    For Each f In FSO.GetFolder("D:\新しいフォルダー").Files
        Me.ListBox1.AddItem f.Name
    Next
    Set FSO = Nothing
End Sub

なお、デバック確認にDebug.Printメソッド(イミディエイトウィンドウ)は
使用出来ません。詳しくは下記をご覧ください。
https://codezine.jp/article/detail/1718
 

投稿日時: 20/03/14 16:00:06
投稿者: shimoichimabu

MMYSさん、回答ありがとうございます。
 
>リストボクス等はUnicode対応しているはずです。試しに下記コードで問題なく扱えます。
確かに表示できますね。
 
今回のケースではどんな特殊文字がファイル名に混在しているか、不明なので、取り込む前にファイル名の中の1文字づつチェックし、もし、特殊文字であると判定した時、その文字をChrW(・・)で変換し、ListBoxに表示させるのでしようか? プログラムコードがむづかしそうですね。
更に、元ファイル名とListBoxに表示されたファイル名が全く同一になっているので、、
Name "\音楽ファイル\" & ListBox A.Column(0, N) As "\音楽ファイル\" & ListBox B.Column(0,N)
実行時にエラーが出ないということですね。

回答
投稿日時: 20/03/14 16:13:44
投稿者: WinArrow
投稿者のウェブサイトに移動

>Unicoodeをリストボクスに表示するのは、結構難しいと思います。
  
↑私の意図は、特定の文字列ならば、対応可能で
文字列の桁位置が決められないとか、どんな文字が出てくるのかわからない
 というようなことを想定すると、難しいということです。
  
現に、私は、☑や㎥などを使っています。

投稿日時: 20/03/14 17:47:45
投稿者: shimoichimabu

MMYSさん、回答ありがとうございます。
WinArrowさん、解説ありがとうございます。
 
入れ違いになってしまいました。
 
>DIRコマンド使うと上記、現象が発生します。
>DIRコマンド以外で取得してください。
 ご指摘の通り、DIRコマンドを使用していました。
 
Private Sub UserForm_Activate()
    Dim FSO As Object
    Dim f As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    For Each f In FSO.GetFolder("D:\新しいフォルダー").Files
        Me.ListBox1.AddItem f.Name
    Next
    Set FSO = Nothing
End Sub
 
このコードですと、そのままListBoxに表示されました。
貴重なごコマンドありがとうございました。