こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ファイルを文字化けせずに開けるVBAコードを教えて

アプリをダウンロードして、Excelファイルで開こうとすると文字化けします。

いろいろ調べたところ、一旦、テキストファイルで開き、
文字コードをUFT-8に設定して保存し、その後、Excelで開くと文字化けはしません。

毎週行いたい作業ですので、できればVBAコードで一発で文字化けせずに開けると
ありがたいのです
よろしくお願いします

補足:アプリはiphoneのCount Logというアプリです。
メールにファイルが添付されています。それを開くと文字化けしてしまうという話です。

投稿日時 - 2016-08-29 22:21:15

QNo.9221981

すぐに回答ほしいです

質問者が選んだベストアンサー

こんにちは
元のデータの内容によるのかと思います。
Sub 読み込み()
  Dim vData() As String
  Dim txt2  As Object
  Dim t   As Variant
  Dim i   As Long
  t = Application.GetOpenFilename("Csv Files (*.csv), *.csv", , , , False)
'  t = Application.GetOpenFilename()
  If t = False Then Exit Sub  
  Set txt2 = CreateObject("ADODB.Stream")
  With txt2
    '読み込みモード
    .Mode = 3
    'オブジェクトに保存するデータの種類を文字列型に指定する
    .Type = 2
    '文字列型のオブジェクトの文字コードを指定する
    .Charset = "UTF-8"
    'オブジェクトのインスタンスを作成
    .Open
    'ファイル読み込み
    .LoadFromFile t
    'ポインタを先頭へ
    .Position = 0
    '最終行までループする
    ReDim Preserve vData(0)
    Do While Not .EOS
      '次の行を読み取る
      vData(UBound(vData)) = .ReadText(-2)
      i = i + 1
      Cells(i, 1) = vData(UBound(vData))
      ReDim Preserve vData(UBound(vData) + 1)
    Loop
    Range("A1").Resize(UBound(vData)) = _
      WorksheetFunction.Transpose(vData)
    .Close
  End With
  'メモリからオブジェクトを削除する
  Set txt2 = Nothing
  Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, Comma:=True
End Sub
これで試して貰って、エラーになった時にシート上の1列目の状態がどうなっているか
教えて下さい。

投稿日時 - 2016-09-02 09:17:08

お礼

ushi2015さん読み込めました!
デバックモードにならずに文字化けもありません!
私が仕組みがわってないところがイタいところですが・・
'コメントブロックでの解説もありがとうございます。
何度も何度もありがとうございます。

投稿日時 - 2016-09-03 01:09:38

ANo.12

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(11)

ANo.11

回答No.6です。

この回答には、お礼も何もいりません。

単に「VBScript」の説明です。

「VBScript」はWindowsが標準で持っているプログラミング言語です。

「Microsoft Visual Basic Scripting Edition」の略です。

決して、メモ帳で走っている訳ではありません。

Windowsが「~.vbs」というファイルは、「VBScript」だと、認識して、「Windows」が走らせています。

「メモ帳」は、プログラムを書くのに使っただけで、他のソフトを使っても、テキストファイルになっていて、拡張子が「vbs」なら動きます。

テキストファイル、というのは、「文字情報だけのファイル」、すなわち、ワープロソフトなどでは、フォントが何、とか文字の大きさがどう、とかセンタリング、とか様々な情報が「あいうえお」には装飾されています。

しかし、そのような装飾がいっさいなく、単に「あいうえお」という文字だけの情報を「テキスト」と言います。

「csv」ファイルも、テキストファイルの1つです。

メモ帳で、この「あいうえお」だけの情報のファイルを開くと、メモ帳自身が、表示するフォントとして「MS ゴシック」などを使って表示していますが、それは表示するのに必要だから、「MS ゴシック」を割り当てているだけで、ファイルにはそんな情報は含まれていません。

「VBScript」は、実は、それだけでは、たいしたことはできません。

ファイルやフォルダすら扱うことはできないのですが、Windowsが持っているいろいろな機能を読み込むことによって、ファイルやフォルダ、エクセルだって、扱えるようになります。

Set u = CreateObject("Scripting.FileSystemObject")

は、このファイルやフォルダを扱えるように、Windowsの機能を取り込んでいる1行です。

その次の行の「Set v = u.GetFolder(".")」は、上の機能を使って、「~.vbs」のファイルが存在するフォルダを取得しています(例えば、「D:\Programming\Test」など)。

「Set w = CreateObject("ADODB.Stream")」は、今回の場合は、「UTF-8」を扱えるようにするために取り込んでいます。

「Set x = CreateObject("Excel.Application")」で、エクセルを使えるようにしています。

といった具合です。

「Script」が付くと、簡易言語と呼ばれる分類になり、例えば、動画を動かして、シューティングゲームのようなものを作ることは不可能です(「Java Script」も「Script」が付いているので、「VBScript」と同じ程度のプログラミング言語です)。

しかし、今回のような処理においては、簡易言語の方が、極めて有用です。

作成も簡単ですし、短くて、必要な結果は、ちゃんと得られています。

仕事で使うなら、これで十分です。

投稿日時 - 2016-09-01 13:07:28

お礼

vbaは勉強中なのですが、他のプログラミング言語は殆ど知らない状態ですので、勉強になります。
今回、csvファイルをメモ帳で開きましたが、CSVファイルってExcelから使うためだけのファイルじゃないんですね。
変数の設定みたいなことはvba以外のプログラミング言語でも行うようですね。
基礎の解説からしていただいてありがとうございます。
もうちょっと勉強します。

投稿日時 - 2016-09-01 23:47:36

ANo.10

こんばんは
元ファイルの文字コードや改行コードが分かるといいのですが・・・
Sub 読み込み()
  Dim vData()
  Dim txt2 As Object
  Dim t   As Variant
  t = Application.GetOpenFilename("Csv Files (*.csv), *.csv", , , , False)
  If t = False Then Exit Sub
  Set txt2 = CreateObject("ADODB.Stream")
  With txt2
    .Mode = 3
    .Type = 2
'    .Charset = "EUC-JP"
    .Charset = "UTF-8"
    .LineSeparator = 10 '改行LF(10)
    .Open
    .LoadFromFile t
    .Position = 0
    ReDim Preserve vData(0)
    On Error Resume Next
    Do While Not .EOS
      If Err.Number <> 0 Then
        Exit Do
      End If
      vData(UBound(vData)) = .ReadText(-2)
      ReDim Preserve vData(UBound(vData) + 1)
    Loop
    On Error GoTo 0
    Range("A1").Resize(UBound(vData)) = _
      WorksheetFunction.Transpose(vData)
    .Close
  End With
  Set txt2 = Nothing
  Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, Comma:=True
End Sub

投稿日時 - 2016-09-01 00:22:46

補足

度々申し訳ありません。
やはり同じところRange("A1").Resize(UBound(vData))=WorksheetFunction.Transpose(vData)
でエラー(実行エラ-13)
になってしまいます。
秀丸というソフトで調べたところ、
文字コードがUTF-8で
改行コードがCR+LF
のようです。
よろしくお願いします。

投稿日時 - 2016-09-01 23:43:39

ANo.9

#3です。
VBAはわかりませんが、
>いろいろ調べたところ、一旦、テキストファイルで開き、
>文字コードをUFT-8に設定して保存し、その後、Excelで開くと文字化けはしません。
としなくても、単純にメモ帳で開いて上書き保存(Ctrl+S)するだけで
文字化けは解消されると思います。
まぁ、手間はかかってしまいますが、今のやり方よりは若干よいかも
しれません。

投稿日時 - 2016-08-31 19:03:18

お礼

ここでもらったアドバイスとメモ帳から開く方法を併用して活用したいと思います。
ありがとうございます。

投稿日時 - 2016-08-31 22:55:23

ANo.8

#3です。
>アプリをダウンロードして、Excelファイルで開こうとすると文字化けします。
すみません。ExcelでCSVファイルを開こうとして
文字化けするんですね。
このCSVファイルはCount Logってアプリからエクスポートした
ものってことなんですかね。

投稿日時 - 2016-08-31 18:33:16

お礼

すみません、そうです。
ExcelでCSVファイルを開こうとして文字化けしています。
このCSVファイルはCount Logというアプリからエクスポートしたものです。
言葉足らずでした。

投稿日時 - 2016-08-31 22:50:43

ANo.7

#3です。
で、どうしてCSVをCount Logで開く必要があるのですか?
Excelじゃダメなんですか?・・ってことを回答したのですが。。

投稿日時 - 2016-08-31 18:29:59

お礼

すみません、言葉足らずでした。
CSVファイルを開くのはExcelで、Count LogはCSVファイルを生成するアプリです。

投稿日時 - 2016-08-31 22:49:37

ANo.6

「VBScript」でプログラムを書きました。

このプログラムの利点は、同じフォルダ内にあるすべての「csv」ファイルを、「UTF-8」としてエクセルに読み込んで、ファイル名を「csv」ファイルと同じファイル名にして、保存してしまうことです。

「VBScript」ですので、Windows限定です(Excel2007以上がインストールされていることも必要です)。

これは、大丈夫だと思いますが、「csv」ファイルは、もちろん「UTF-8」でなければなりませんし、改行コードも「CrLf」の、「Windows標準」の改行コードでなければなりません。
(実は今、仕事で、「UNIX」から「csv」ファイルにしたファイルを扱うことがあるのですが、「UNIX」は改行が「LF」で、ちょっと工夫が必要でした。)

さて、以下のプログラムをメモ帳かテキストエディタに貼り付け、「~.vbs」というファイル名で保存してください。

「~」の部分は、何でも構いませんが、「.vbs」は半角文字でなければなりません。

出来たファイルを「csv」ファイルのあるフォルダに放り込んでダブルクリックすると、「Start!」と表示しますので、「OK」をクリックすると、作業を始めます。

そのフォルダ内にある、すべての「csv」ファイルを「csv」ファイルと同じファイル名のエクセルファイルにしてしまいます。

作業が終わると、「Finished!」と表示しますので、「OK」を押してください。

Option Explicit
Dim a, b, c, d, e, i, u, v, w, x, y, z
Set u = CreateObject("Scripting.FileSystemObject")
Set v = u.GetFolder(".")
Set w = CreateObject("ADODB.Stream")
Set x = CreateObject("Excel.Application")
MsgBox("Start!")
For Each a In v.Files
If LCase(u.GetExtensionName(a.Name)) = "csv" Then
Set y = x.Workbooks.Add()
Set z = y.Worksheets(1)
w.Type = 2
w.charset = "UTF-8"
w.Open
w.LoadFromFile v & "\" & a.Name
b = 0
c = 0
Do Until w.EOS
d = split(w.ReadText(-2), ",")
b = b + 1
z.Range("A" & b & ":D" & b).NumberFormat = "@"
e = UBound(d)
For i = 0 to e
z.Cells(b, i + 1).Value = d(i)
Next
If e > c then
c = e
End If
Loop
MsgBox(c)
z.Range(z.Cells(1, 1), z.Cells(b, c)).EntireColumn.AutoFit
w.Close
y.SaveAs(v & "\" & u.GetBaseName(a.Name) & ".xlsx")
y.Close
Set z = Nothing
Set y = Nothing
End If
Next
x.Quit
Set x = Nothing
Set w = Nothing
Set v = Nothing
Set u = Nothing
MsgBox("Finished")

投稿日時 - 2016-08-31 11:22:19

お礼

動作確認しました。
ありがとうございます。
メモ帳から動くソフトはバッチファイルしか知りませんでした。
VBScript、UNIX、改行コードを把握しておりませんが、勉強します。ありがとうございます。

投稿日時 - 2016-08-31 22:57:51

ANo.5

こんにちは
自分でファイル選択するなら、
t = Application.GetOpenFilename("Csv Files (*.csv), *.csv", , , , False)
で。

投稿日時 - 2016-08-31 08:21:42

補足

こんばんは。
何度もありがとうございます。すみません。
変数代入の行を t = Application.GetOpenFilename("Csv Files (*.csv), *.csv", , , , False)
としまして、実行しましたが、
Range("A1").Resize(UBound(vData))=WorksheetFunction.Transpose(vData)
の行で黄色エラーになります(実行エラー13と表示されます)
どうしたらよいでしょうか?

投稿日時 - 2016-08-31 22:44:31

ANo.4

こんにちは、No2です。
決まった場所の決まったファイルなら、
t = "H:\sync\PDCA\count.csv"
でいいですけど、マクロで元のファイルを読み込んで、UTF-8で変換して
別ファイルに保存して開くようにした方がいいかも・・・・

投稿日時 - 2016-08-31 07:24:22

補足

すみません退勤までパソコンを開けないのですが、

ファイルを開くコードは
t=Application.GetOpenFilename("count(*.csv),*.csv", , , , False)
でいいですか?

投稿日時 - 2016-08-31 08:01:03

ANo.3

Count Logってただのカウンターのアプリでは
ないのですか?
普通に添付されてきたExcelファイルを開きたいので
あれば、Excelで開けばいいような・・と思うのですが。

ちなみにメールに添付されていくるファイルの拡張子は
何なのでしょうか。

投稿日時 - 2016-08-30 18:49:21

補足

csvファイルです。
開くと
譌・莉・ 隗」縺・◆蝠城。・ 隱ュ繧薙□繝壹・繧ク謨ー n 繝代Φ逶ョ阮ャ 4back 5back 6back 7back 閻慕ォ・ 閻ケ遲・ 閭檎ュ・ SHR 蠑∝ス捺戟蜿・ 譁咏炊 騾夊ゥア
2016/8/29000000000

のように文字化けします。
よろしくお願いします

投稿日時 - 2016-08-31 00:28:36

ANo.2

こんにちは
どのようなファイルなのか分からないのでダメかも知れませんが、
Sub 読み込み()
  Dim vData()
  Dim txt2 As Object
  Dim t   As Variant
  t = Application.GetOpenFilename("Log Files (*.log), *.log", , , , False)
  If t = False Then Exit Sub
  Set txt2 = CreateObject("ADODB.Stream")
  With txt2
    .Mode = 3
    .Type = 2
    .Charset = "UTF-8"
    .Open
    .LoadFromFile t
    .Position = 0
    ReDim Preserve vData(0)
    On Error Resume Next
    Do While Not .EOS
      If Err.Number <> 0 Then
        Exit Do
      End If
      vData(UBound(vData)) = .ReadText(-2)
      ReDim Preserve vData(UBound(vData) + 1)
    Loop
    On Error GoTo 0
    Range("A1").Resize(UBound(vData)) = _
      WorksheetFunction.Transpose(vData)
    .Close
  End With
  Set txt2 = Nothing
End Sub
こんな感じで読み込めますか?

投稿日時 - 2016-08-30 09:21:47

補足

すみません
パスは"H:\sync\PDCA\count.csv"です。
開きたいファイルはcsvファイルです。

パスの指定は、以下の
t = Application.GetOpenFilename("\count.csv", , , , False)
では駄目ですか?

ゲットオープンファイルネームのところでエラーになります。
エラー1004と表示されます。

投稿日時 - 2016-08-31 00:26:38

あなたにオススメの質問