Excelのマクロに関する質問です。

Application.Dialogs(xlDialogOpen).Showを使って組み込みダイアログボックスを用いるさいに、
デフォルトではShift-JISで読み込んでしまうのですが、これをUTF-8など他のエンコード方式で読み込む
にはどのように記述すればよいのでしょうか。

(なお、Excelのマクロにはほとんど詳しくないため、
この質問や回答へのレスポンスで的外れな応答をしてしまうかもしれませんがご容赦ください。)

回答の条件
  • 1人50回まで
  • 登録:2008/01/15 15:55:30
  • 終了:2008/01/22 10:46:32

ベストアンサー

id:airplant No.2

airplant回答回数220ベストアンサー獲得回数492008/01/19 02:14:57

ポイント100pt

ファイル名がxxx.csvで、中身がUTF-8の場合、エンコードの種類は指定できないようです。

仕方ないので、xxx.csvをxxx.txtのように名前を変えればエンコードの種類を指定できます。

サンプルを掲載しておきます。

要は、Dialogs(xlDialogOpen).Showでも、Workbooks.OpenTextでも、ファイル名が.csvだとエンコードはシステム任せになってしまうようです。

エンコードの種類は、OpenTextの「Origin:=-535」で指定しています。

各項目に数字タイプや文字タイプが混在している場合は、「新しいマクロを記録」でWorkbooks.OpenTextの一部を記録された内容に置き換えてください。

Sub OpenUTF8csvFile()
    Dim strFilter As String
    Dim vFileName As Variant
    Dim strNewName As String
    
    strFilter = "csvファイル (*.csv), *.csv,すべてのファイル (*.*),*.*"
    vFileName = Application.GetOpenFilename(filefilter:=strFilter, _
        MultiSelect:=False, Title:="ファイル選択")
    If vFileName = False Then
        MsgBox "ファイル選択されませんでした"
    Else
        MsgBox vFileName & "をリネームしてから開きます"
        strNewName = Left(vFileName, InStrRev(vFileName, ".", -1, vbTextCompare)) & "txt"
        Name vFileName As strNewName

        Workbooks.OpenText Filename:=strNewName, Origin:=-535, StartRow:= _
            1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
            ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
            , Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
            TrailingMinusNumbers:=True
    
' ここに本来の処理を記載

        ActiveWorkbook.Close
        Name strNewName As vFileName
    
    End If
    
End Sub
id:firstheaven

返信が遅くなって申し訳ありません。

大変参考になりました。ありがとうございます。

2008/01/22 10:45:34

その他の回答(1件)

id:airplant No.1

airplant回答回数220ベストアンサー獲得回数492008/01/16 23:51:26

ポイント10pt

的外れな回答になるかも知れませんが、ご容赦を。


質問の内容は、次のうちのどれになりますか?

  1. テキストファイルウィザードでのデフォルトをUTF-8にしたい
  2. htmlファイル読み込み時のデフォルトをUTF-8とみなしたい
  3. Excelの中身がUTF-8のファイルを読みたい
  4. ファイル名がUTF-8のものを読みたい

No.3とNo.4は多分ないと思われます。

No.2は何も意識しなくても、自動的にUTF-8を解釈して正しい内容を表示します。

残るは、No.1という想定で回答します。


先ず、Excelのバージョンは2003以上ですよね?

2003以上であれば、テキストファイルウィザードが出て、「元のファイル」という欄でUTF-8や他のエンコード方式が選べます。これを選ばずに自動で行いたいものという想定で進めます。

(Excel2000以下だと、エンコード方法が選べないと思いました。もし2000なら、バージョンアップするしかなさそうです)

No.1 テキストファイルウィザードでのデフォルトをUTF-8にしたい

これは、「Application.Dialogs(xlDialogOpen).Show」では実現できないので、次のように自前でファイル選択後のオープン処理を書く必要があります。

Workbooks.OpenTextのところは、マクロを記録で実際に動作させる内容を記録してみて、適宜書き換えてください(普通のUTF-8テキストは、これで読み込みできました)。

Sub OpenUTF8textFile()
    Dim strFilter As String
    Dim vFileName As Variant
    
    strFilter = "txtファイル (*.txt), *.txt,すべてのファイル (*.*),*.*"
    vFileName = Application.GetOpenFilename(filefilter:=strFilter, _
        MultiSelect:=False, Title:="ファイル選択")
    If vFileName = False Then
        MsgBox "ファイル選択がキャンセルされました"
    Else
        MsgBox vFileName & "を開きます"
        Workbooks.OpenText Filename:=vFileName, Origin:=-535, StartRow:= _
            1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
            ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
            , Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
            TrailingMinusNumbers:=True
    End If
    
End Sub

http://www.google.co.jp (ダミーです)

id:firstheaven

ご回答ありがとうございます。

ご説明が不足していて申し訳ないのですが、実現したい内容はNo.3になります。

以前はApplication.Dialogs(xlDialogOpen).Showを使用してShift-JisエンコードのCSVファイルを開いていました。

しかし、中にはUTF-8エンコードのものがあり、そのまま開くと文字化けしてしまいます。

そこで読み込み時のエンコードを指定しながら開くマクロに変更する必要が発生した次第です。

2008/01/18 10:21:56
id:airplant No.2

airplant回答回数220ベストアンサー獲得回数492008/01/19 02:14:57ここでベストアンサー

ポイント100pt

ファイル名がxxx.csvで、中身がUTF-8の場合、エンコードの種類は指定できないようです。

仕方ないので、xxx.csvをxxx.txtのように名前を変えればエンコードの種類を指定できます。

サンプルを掲載しておきます。

要は、Dialogs(xlDialogOpen).Showでも、Workbooks.OpenTextでも、ファイル名が.csvだとエンコードはシステム任せになってしまうようです。

エンコードの種類は、OpenTextの「Origin:=-535」で指定しています。

各項目に数字タイプや文字タイプが混在している場合は、「新しいマクロを記録」でWorkbooks.OpenTextの一部を記録された内容に置き換えてください。

Sub OpenUTF8csvFile()
    Dim strFilter As String
    Dim vFileName As Variant
    Dim strNewName As String
    
    strFilter = "csvファイル (*.csv), *.csv,すべてのファイル (*.*),*.*"
    vFileName = Application.GetOpenFilename(filefilter:=strFilter, _
        MultiSelect:=False, Title:="ファイル選択")
    If vFileName = False Then
        MsgBox "ファイル選択されませんでした"
    Else
        MsgBox vFileName & "をリネームしてから開きます"
        strNewName = Left(vFileName, InStrRev(vFileName, ".", -1, vbTextCompare)) & "txt"
        Name vFileName As strNewName

        Workbooks.OpenText Filename:=strNewName, Origin:=-535, StartRow:= _
            1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
            ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
            , Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
            TrailingMinusNumbers:=True
    
' ここに本来の処理を記載

        ActiveWorkbook.Close
        Name strNewName As vFileName
    
    End If
    
End Sub
id:firstheaven

返信が遅くなって申し訳ありません。

大変参考になりました。ありがとうございます。

2008/01/22 10:45:34

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません