[[20240125111611]] 『Reolace関数(及びメソッド)でのREPLACE』(がんべーる) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Reolace関数(及びメソッド)でのREPLACE』(がんべーる)

EXCELのVBAでファイル名を変名する場合、元ファイル名にチルダ(〜)がある場合
Reolace関数(及びメソッド)では、エラーが出て別文字に返還できない

以下のURLでは、チルダ(〜)を対象にする場合は、〜〜 と2つ並べるようにとあります。

【〜(チルダ)の置換】置換がうまくいかない原因と対処法!〜を文字として置き換える
https://dokugakuexcel.com/%E3%80%90%EF%BD%9E%EF%BC%88%E3%83%81%E3%83%AB%E3%83%80%EF%BC%89%E3%81%AE%E7%BD%AE%E6%8F%9B%E3%80%91%E7%BD%AE%E6%8F%9B%E3%81%8C%E3%81%86%E3%81%BE%E3%81%8F%E3%81%84%E3%81%8B%E3%81%AA%E3%81%84%E5%8E%9F/

これを踏まえれば、以下のようなコードで対応できますか?

     For i = 2 To lc2
            DelMojis = "〜〜"

            With ws1
                  .Range(.Cells(2, "A"), .Cells(lc1, "A")).Replace what:=DelMojis, Replacement:="", LookAt:=xlPart
            End With
      Next

又ファイル名でチルダと同じよう利用できる文字なのに事前処理をすべき文字があれば教えてほしい

< 使用 Excel:Excel2021、使用 OS:Windows11 >


すいません。
書き込みにミスがありました。

Reolace > Replace
(がんべーる) 2024/01/25(木) 11:57:13


 DelMojis = "〜〜"
 DelMojis = "~~"
 これの間違いでなくて?
(稲葉) 2024/01/25(木) 12:07:35

 そもそもリンク先でチルダをすべて全角にしている上にその問題が半角チルダの問題ということも書いていないから
 はずれを参考にしちゃったということかと。
(ねむねむ) 2024/01/25(木) 12:20:43

アドバイスありがとうございます。

私の問題としているチルダは全角「〜」です。

参照したURLは、
 半角のチルダの事をテーマにしているとの事で参考にしてはいけなかったのですね。

(がんべーる) 2024/01/25(木) 14:02:45


 まず
 >Reolace関数(及びメソッド)では、エラーが出て別文字に返還できない
 なんというエラーになるのだろうか?

 あと全角チルダに見えるものには
 〜(IMEで全角となるもの)
 と
 〜(IMEで環境依存となるもの)
 があるがそれの区別はついているだろうか?
(ねむねむ) 2024/01/25(木) 14:14:46

引き続いてのアドバイスを見て

どうも私の質問のポイントがズレていると気が付きました。

エラーは、REPLACEでは無く以下のコードで出ていました。
 Name FolderPath & .Cells(i, "C") & "." & .Cells(i, "B") As FolderPath & .Cells(i, "A") & "." & .Cells(i, "B")

実行エラー ファイルまたは番号が不正です。

.Cells(i, "C")を見ると
 2002 ど?しても見たい夢.mp3
と表示される

正常なファイル名は、
 2002 ど〜しても見たい夢.mp3
です。

ここで
問題のチルダ「〜」は、以下のコードで調べたら「63」と出ました。
Range("C8").Value = Asc(Range("A8").Value)

ちなみに、キーボードのチルダ(F11の下のキー)では、「-32416」

これで問題のチルダ(〜)が何者かわかりますか?

そして対策はどうすれば良いでしょうか?

      Dim DelMojis As String '指定文字列を格納する変数
      Dim i As Long
      Dim Fix1 As String

      For i = 2 To lc2
            DelMojis = ws2.Cells(i, "B") '指定文字列を変数に代入

            With ws1
                  .Range(.Cells(2, "A"), .Cells(lc1, "A")).Replace what:=DelMojis, Replacement:="", LookAt:=xlPart
            End With
      Next

      '----------------------------------------
      'ファイル名変更
      For i = 2 To lc1
            With ws1
                  Name FolderPath & .Cells(i, "C") & "." & .Cells(i, "B") As FolderPath & .Cells(i, "A") & "." & .Cells(i, "B")
            End With
      Next

 End Sub

(がんべーる) 2024/01/25(木) 15:07:35


 > .Cells(i, "C")を見ると
 > 2002 ど?しても見たい夢.mp3
 > と表示される

 セルにはそのように表示されているということですね。
 その場合、"?"はファイル名にはつかえない文字ですので、
 そのようなファイル名が存在することはありえないので、
 Nameステートメントの引数に設定すれば当然エラーになります。

 > 正常なファイル名は、
 > 2002 ど〜しても見たい夢.mp3
 > です。

 この正常なファイル名はどこにあり、それを.Cells(i, "C")にどのように表示させているのでしょうか。
 〜は環境依存文字なので、VBA上では"?"に文字化けする場合があります(ちなみにAsc("?") は63)。

 どこかで文字化けするするような処理をしているはずなのでそれを探る必要があるでしょう。

(hatena) 2024/01/25(木) 16:24:46


>この正常なファイル名はどこにあり、それを.Cells(i, "C")にどのように表示させているのでしょうか。

 以下のコードで
 フォルダー内のファイル名を順番にA列に読み込みREPLACEで不要文字を削除してファイル名を書き換えています

>どこかで文字化けするするような処理をしているはずなのでそれを探る必要があるでしょう。

 コードを見てもチルダ(〜)もどきの文字を文字化けするようには処理していないように思えます。

      For Each File In Folder.Files

            ext = Fso.getextensionname(File.Name)

            Select Case ext
                  Case "ts", "mkv", "mp4", "mp3", "flac", "wav"

                        '元ファイル名及び同拡張子を出力
                        ws1.Cells(num, "A").Value = Fso.GetBaseName(File.Name)
                        ws1.Cells(num, "B").Value = Fso.getextensionname(File.Name)

                        num = num + 1

                  Case Else
                        'n = n + 1  '変名が必要でない場合ファイルをカウント
            End Select
      Next

      Dim lc1 As Long, lc2 As Long
      lc1 = ws1.Cells(Rows.Count, "A").End(xlUp).Row '最終行番号の取得
      lc2 = ws2.Cells(Rows.Count, "B").End(xlUp).Row

      '元ファイル名を退避
      ws1.Range(ws1.Cells(2, "A"), ws1.Cells(lc1, "A")).Copy
      ws1.Cells(2, "C").PasteSpecial

      ws1.Columns("A:C").AutoFit

      '--------------------------------------------------------
      'Replacedメソッド / ワイルドカードを使って置換()

      Dim DelMojis As String '指定文字列を格納する変数
      Dim i As Long
      Dim Fix1 As String

      For i = 2 To lc2
            DelMojis = ws2.Cells(i, "B") '指定文字列を変数に代入

            With ws1
                  .Range(.Cells(2, "A"), .Cells(lc1, "A")).Replace what:=DelMojis, Replacement:="", LookAt:=xlPart
            End With
      Next

      '----------------------------------------
      'ファイル名変更
      For i = 2 To lc1
            With ws1
                  Name FolderPath & .Cells(i, "C") & "." & .Cells(i, "B") As FolderPath & .Cells(i, "A") & "." & .Cells(i, "B")
            End With
      Next

End Sub

(がんべーる) 2024/01/25(木) 16:37:38


 そのコードを見る限りは文字化けしそうな処理はなさそうですね。
 しかし、実際には "2002 ど?しても見たい夢.mp3" と文字化けしているんですよね。

 ひょっとして、

 > .Cells(i, "C")を見ると
 > 2002 ど?しても見たい夢.mp3
 > と表示される

 というのはどのように確認しましたか。
 セルにそのように表示されているのですか。
 それともコードをステップ実行してVBA上で確認したのですか。

 VBA上で確認(マウスをかざして表示させたとか)した場合は、
 その時点で文字化けしますので確認できませんよ。
 その時のセルの表示で確認してください。
(hatena) 2024/01/25(木) 17:23:23

>その時のセルの表示で確認してください。

A列のセルでは、チルダ(〜)もどきは文字化け(?)していません。
ちゃんとチルダ(〜)のように表示されています。

調べている途中で回答を頂いたので間違っているかも知れませんが......

https://note.com/skeccho/n/nee266138320f

上のURLで以下のように記載されていました。

今回の問題と同じでしょうか ?

 < VBEは環境依存文字やShift-JISに無い文字に対応していない >

 どうやらVBEはシート上やOS上で扱えるUnicode文字にあってShift-JISに無い文字は ”?” と表示されてしまうらしい。
  そのため、Shift-JISに無い環境依存文字をフォルダ名に使った場合、
   FSOでもローカルウィンドウやイミディエイトウィンドウでは、表示だけが ”?" に変換されてしまうようです。

''''''
(がんべーる) 2024/01/25(木) 17:31:20


 「もどき」じゃアレなので一応、情報だけ ^^;

 波ダッシュ (U+301C)
 全角チルダ (U+FF5E)

どうしてこうなった!? 波ダッシュをめぐる考察|『人文×社会』の中の人
https://note.com/jinbunxshakai/n/n7466cd68db43
いまさら聞けない!波ダッシュと全角チルダ問題についてまとめてみた - Secret Garden(Instrumental)
https://secret-garden.hatenablog.com/entry/2022/05/11/212649
波ダッシュ・全角チルダ問題 - とほほのWWW入門
https://www.tohoho-web.com/ex/dash-tilde.html#wave-dash-fullwidth-tilde

 > Windows版シフトJISの CP932 では 0x81 0x60 を U+FF5E とみなします。

(白茶) 2024/01/25(木) 18:03:13


白茶さん、ありがとうございます。

問題のチルダ(〜)もどきは、以下のコードで調べたら
調査の結果 波ダッシュ(U+301C) のようです。

Sub ConvertToUnicode2()

    Dim inputString As String
    Dim unicodeString As String
    Dim i As Integer
    inputString = Range("A8").Value
    For i = 1 To Len(inputString)
        unicodeString = unicodeString & "U+" & Hex(AscW(Mid(inputString, i, 1))) & " "
    Next i
    Range("B8").Value = unicodeString
End Sub

これが判ったら結果を踏まえてどうVBAのコードに反映するのでしょうか ?

参考に紹介いただいたURLはチルダ(〜)もどきの正体について
解説されていますが対策は何も記載されていないように思えます。

(がんべーる) 2024/01/25(木) 18:51:21


 最終の着地点が分からないけど、フォルダ移動だけならFSO使えばできそう。
 波ダッシュだけでも〜(から)に置換したいなら、変更後のファイル名で
 Replace(変換前ファイル名, ChrW("&H301C"), "〜")
 とすればいいだけだと思うんだけど・・・

    Sub test()
        Dim a As String
        Dim b As String
        a = [a1].Value
        b = [a2].Value
        'FSOなら環境依存文字が入っててもファイル名を変更できる
        With CreateObject("Scripting.FileSystemObject")
            .MoveFile a, b
        End With
    End Sub

 色々検証してて、面白かったのが、dir通すと文字コードも「?」に変わるから、消すだけならありかも・・・。
    Function UDF_CONV_FILENAME(ByVal x As String) As String
        Dim s As String
        Dim i As Long
        Dim v() As String
        'dirで環境依存文字を「?」に置き換えちゃう
        s = Dir(x)
        If s = "" Then
            UDF_CONV_FILENAME = "NO FILE"
            Exit Function
        End If
        UDF_CONV_FILENAME = Replace(s, "?", "")
    End Function
(稲葉) 2024/01/25(木) 19:02:57

 一応釈明 ^^;

 > これが判ったら結果を踏まえてどうVBAのコードに反映するのでしょうか ?
 > 参考に紹介いただいたURLはチルダ(〜)もどきの正体について
 > 解説されていますが対策は何も記載されていないように思えます。

 環境依存文字にNameステートメントなんか使うからだって、既にどなたか回答されてませんでしたっけ?
 情報だけ紹介したのはその認識だったからです。

 個人的には、
 ファイル関連の処理で「実行時エラー '52'」は、
 もうその時点で環境依存文字がらみだと目星つけても良いくらいだと思ってます。

マクロで環境依存文字を含むファイルや文字化けしたファイルを開く方法 | 販促支援コラム | 株式会社東具
https://www.togu.co.jp/column/detail/59

(白茶) 2024/01/25(木) 19:18:22


 > A列のセルでは、チルダ(〜)もどきは文字化け(?)していません。

 文字化けはセルではなくVBA上で確認したということですね。

 文字化けということに引っ張られましたが、
 環境文字を含むファイル名を Nameステートメントでリネームしようとして
 エラーが出たということですかね。

 すでに他に方から指摘がありますが、
 NameステートメントはVBAの古いメソッドですので環境依存文字を含むものではエラーになります。
 FileSystemObjectを使ってリネームすればエラーはでないでしょう。
(hatena) 2024/01/25(木) 20:28:14

稲葉さん、白茶さん、hatenaさん アドバイスありがとうございます。

最初の質問の議題からして的外れな方向からスタートした
自分が悪いのですが返還できないがNameステートメントが原因であるとは想定外でした。

皆様の回答から CreateObject("Scripting.FileSystemObject") を利用する事で
環境依存文字が入っててもファイル名を変更できる事が判りコードを変更して
エラーなく処理できました。

勉強になりました。

      'ファイル名変更
      Dim OldName As String '元のファイル名
      Dim NewName As String '新しいファイル名

      'NameステートメントはVBAの古いメソッドですので環境依存文字を含むものではエラーになります。
      'FSOなら環境依存文字が入っててもファイル名を変更できる
      For i = 2 To lc1
            With ws1
                  OldName = FolderPath & .Cells(i, "C") & "." & .Cells(i, "B")
                  NewName = FolderPath & .Cells(i, "A") & "." & .Cells(i, "B")
            End With

            With CreateObject("Scripting.FileSystemObject")
                  .MoveFile OldName, NewName
            End With
      Next

'---
(がんべーる) 2024/01/26(金) 08:46:18


 ねむねむさんがエラー聞いてくれなかったら、話進むの遅かったかもね!
 ねむねむさんありがとー
(稲葉) 2024/01/26(金) 09:35:45

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.