文字コード変換のマクロについて

このQ&Aのポイント
  • 文字コード変換のマクロを作成していますが、文字コードがUTF-8のLFでない場合に正しく取り込めない問題が発生しています。
  • 文字コードがUTF-8か改行コードがLFの場合に条件を組みたいですが、うまくできません。
  • 皆様のお力をお貸しください。
回答を見る
  • ベストアンサー

文字コード変換で文字コード取得

文字コードと改行コードを変更するマクロなのですが今のコードだと 読み込み元の文字コードがUTF-8のLFでないと正しい形で取り込むことができません。 そこで文字コードがUTF-8か改行コードがLFの時という条件を組みたいのですが色々試したのですができません 皆様のお力をおかしください。 Sub UTF8_LF→SJIS_CRLF() Dim strFilePath As String Dim objReadStream As Object Dim objWriteStream As Object Dim bytData() As Byte Const adTypeText = 2 Const adTypeBinary = 1 Const adReadLine = -2 Const adWriteLine = 1 Const adLF = 10 Const adCRLF = -1 Const adSaveCreateOverWrite = 2 Dim opnFile As Variant Dim fFilter As String Dim i As Integer fFilter = "xml Files ,*.xml" opnFile = Application.GetOpenFilename(FileFilter:=fFilter, MultiSelect:=True) If IsArray(opnFile) Then For i = 1 To UBound(opnFile) strFilePath = opnFile(i) Set objReadStream = CreateObject("ADODB.Stream") Set objWriteStream = CreateObject("ADODB.Stream") ' 読み込み元(Shift_JIS,CRLF) With objReadStream .Open .Type = adTypeText .Charset = "UTF-8" .LineSeparator = adLF .LoadFromFile strFilePath End With ' 書き込み先(UTF-8,LF) With objWriteStream .Open .Type = adTypeText .Charset = "Shift_JIS" .LineSeparator = adCRLF End With ' 1行ずつ変換 Application.DisplayStatusBar = True 'ステータスバーの表示 Application.StatusBar = Dir(opnFile(i)) & "を取得中・・・" 'ステータスバーに文字列表示 Do Until objReadStream.EOS objWriteStream.WriteText objReadStream.ReadText(adReadLine), adWriteLine Loop Application.StatusBar = False 'ステータスバーの制御を通常に戻す objReadStream.Close With objWriteStream .Position = 0 .Type = adTypeBinary .Position = 0 bytData = .Read .Close .Open .Position = 0 .Type = adTypeBinary .Write bytData .SaveToFile strFilePath, adSaveCreateOverWrite .Close End With Next Else MsgBox "キャンセルしました" End End If 宜しくお願いします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 ご自身のコードだと思いますから、少しのアドバイスすればお分かりになると思います。  .xml ファイル自体は、テキストファイルですから、一行目のencodingを読んで判定させればいいのではありませんか。LF がセパレータになっているかは、同じくLF 検索すればよいのではありませんか。

tool_a
質問者

お礼

ありがとうございます。 結果的に一行目のencodingと違うものでしたので判定することができませんでした。 しかしながらバイナリで読み込んで特定バイトのところにある0D 0Aを 検索して判定できました。 ありがとうございます。

関連するQ&A

  • 文字コードを指定すると文字化けする理由は?

    HTMLのソースが入ったテキストデータをエクセルに書き出したいのですが 文字コードは何を指定すればいいのでしょうか? Sub Sample() Dim i As Long Dim j As Long Dim strList As String Dim strSplit() As String Dim adoSt As New ADODB.Stream i = 1 With adoSt .Type = adTypeText ' .Charset = "UTF-8" ' .Charset = "euc-jp" ' .Charset = "Shift_JIS" .Open .LoadFromFile ("C:\test.html") Workbooks.Add Do While Not (.EOS) strList = .ReadText(adReadLine) strSplit = Split(strList, ",") For j = LBound(strSplit) To UBound(strSplit) Cells(i, j + 1) = strSplit(j) Next i = i + 1 Loop .Close End With End Sub どの文字コードを指定してもエラーになります。 Cells(i, j + 1) = strSplit(j) の部分で、エラーになります。 実際のソースの文字コードはeuc-jpになっています。 なぜソースと同じ文字コードを指定してるのにエラーになるのでしょうか? .Charsetで 文字コードを何も指定しなければ、問題なくソースを書き出せます。

  • VBScript文字列をSJISからUTF8へ関数

    VBScriptでSJISの文字列を、UTF8に変換し、 UTF8で設定されたMySQLへ保存したい。 SJISをUTF8に変換する関数をご教授いただきたいです。 以下をまるまるコピーさせていただき試してみたのですが、 文字化けしたメッセージが返されます。 Function TextToBin(TextData, CharSet) Const adTypeBinary = 1 Const adTypeText = 2 Dim objStream Set objStream = CreateObject("ADODB.Stream") objStream.Type = adTypeText objStream.Charset = CharSet objStream.Open objStream.WriteText TextData objStream.Position = 0 objStream.Type = adTypeBinary Select Case UCase(CharSet) Case "UNICODE","UTF-16" objStream.Position = 2 Case "UTF-8" objStream.Position = 3 End Select TextToBin = objStream.Read objStream.Close Set objStream = Nothing End Function msgbox TextToBin("テスト","UTF-8") ←文字化ける msgbox TextToBin("テスト","UTF-16") ←文字化けない

  • VBAでUTF-8文字を読込、Excelに出力する方法

    タイトルの通りです。 簡単なプログラムを作ってみました。 このような事は出来ないのでしょうか。 教えてください。 宜しくお願いします。 ☆サンプルプログラム☆    ↓ Sub test() Dim Stm As Object Dim sText As String Const adCRLF = -1 Const adReadAll = -1 Const adTypeText = 1 sText = "あああ" Set Stm = CreateObject("ADODB.Stream") Stm.Open Stm.Charset = "UTF-8" Stm.WriteText sText ActiveSheet.Range("A1").Value = Stm.ReadText() Stm.Close Set Stm = Nothing End Sub

  • .Charset = "UTF-8"

    新しいテキスト ドキュメント.txtの中身は、 test テスト なのですが、 その中身をVBAで取得したく、 Sub Sample() Dim strList As String Dim adoSt As New ADODB.Stream Dim WSH As Variant Set WSH = CreateObject("Wscript.Shell") With adoSt .Type = adTypeText .Charset = "UTF-8" .Open .LoadFromFile (WSH.SpecialFolders("Desktop") & "\新しいテキスト ドキュメント.txt") Do While Not (.EOS) strList = .ReadText(adReadLine) Debug.Print strList Loop .Close End With End Sub と言うコードを作ったのですが、 返り値が文字化けしてしまいます。 test ?e?X?g が返ってきます。 .Charset = "UTF-8"が原因なのかもしれませんが ネットからコピペしたコードを使っている為 どのように変えればいいのかわかりません。 ご教授よろしくお願いします。

  • エクセルVBA 文字化けします。

    初心者ですみません、ネットで調べたコードなのですが、 読み込みたいHTMLファイルがUTF-8です。 文字化けしてしますのですが、どうしたらよいでしょうか? Option Explicit Sub sample2() Dim f As Variant Dim lines() As String Dim c As Integer Cells.Clear c = 1 f = Dir("C:\実験\*.html") Do While f <> "" With CreateObject("Scripting.FileSystemObject").GetFile("C:\実験\" & f).OpenAsTextStream lines = Split(.ReadAll, vbCrLf) .Close End With Cells(1, c).Resize(UBound(lines) + 1, 1).Value = WorksheetFunction.Transpose(lines) f = Dir c = c + 1 Loop End Sub どこかに With CreateObject("ADODB.Stream") End With を入れたらいいのでしょうか?

  • 1行ごとに取得して、その改行文字が何か知る方法

    CR,LF,CRLFが混在しているテキストで難儀しております。 VB.NETでReadLine()を使えば、どんな改行コードでも削除した文字列を取得できますが、同じ内容を書き込む場合にどのような改行コードわからないと同じファイルができません。 安直にNewLineやWriteLine()を使うと、どんな改行コードでWindowsの場合はCRLFになります。 ReadLine()で取得した文字列+改行コードがわかる方法がありますか? 以下、例です。 dim s as String Dim sr As New System.IO.StreamReader("yomu", "ISO-2022-JP") Dim sw As New System.IO.StreamWriter("kaku", false, "ISO-2022-JP") While sr.Peek() > -1 s = sr.ReadLine() '改行文字を取り除いた文字列 sw.Write(s) '書き込む end While sr.close() sw.close()

  • エクセルファイル 行列入れ替えたもの同時作成VBA

    あるxmlファイルを一旦テキストファイルにして そこから数値をエクセルファイルに移行して ひとつはM.xlsxとし それに続いて行列を入れ替えた エクセルファイルR.xlsxを 作りたいのですが M.xlsx R.xlsxのそれぞれを作るコードを 単純に 合体させただけでは どうも できません M.xlsxだけ また R.xlsxだけの 作成するコードは 出来たのですが それぞれ別のマクロとして実行することになります ひとつのマクロでM.xlsx R.xlsx同時に 作成するVBAコードは可能でしょうか 宜しくお願い致します ちなみに該当コードを単純化して 合体したのが以下のものです win10 office10 Sub 783縦() Dim FileName As Variant ChDir "\\DESKTOP-O5\f" FileName = Application.GetOpenFilename(FileFilter:="xmlファイル,*.xml") If FileName = False Then MsgBox "キャンセルされました" Exit Sub End If FileCopy FileName, Left(FileName, InStrRev(FileName, "\")) & "テキスト.txt" Const MyFile = "\\DESKTOP-O5\f\テキスト.txt" Const Key1 = "<Name>" Const Key2 = "</Name>" Const Key3 = "<NameKana>" Const Key4 = "</NameKana>" Const PutBokName = "M.xlsx" Dim buf As String Dim Len1 As Long Dim Len2 As Long Dim Pos1 As Long Dim Pos2 As Long Dim Len3 As Long Dim Len4 As Long Dim Pos3 As Long Dim Pos4 As Long Dim PutBook As Workbook With CreateObject("ADODB.Stream") .Charset = "UTF-8" .Open .LoadFromFile MyFile buf = .ReadText .Close End With Len1 = Len(Key1) Len2 = Len(Key2) Pos1 = InStr(buf, Key1) Pos2 = InStr(buf, Key2) Len3 = Len(Key3) Len4 = Len(Key4) Pos3 = InStr(buf, Key3) Pos4 = InStr(buf, Key4) Set PutBook = Workbooks.Add With PutBook.Sheets(1) .Cells(1, 1).Value = "氏名" .Cells(1, 2).Value = Mid(buf, Pos1 + Len1, Pos2 - (Pos1 + Len1)) .Cells(2, 1).Value = "氏名カナ" .Cells(2, 2).Value = Mid(buf, Pos3 + Len3, Pos4 - (Pos3 + Len3)) 'クリップボードをクリア Application.CutCopyMode = False PutBook.SaveAs ThisWorkbook.Path & "\" & PutBokName End With Const PutBokName = "R.xlsx" Dim buf As String Dim Len1 As Long Dim Len2 As Long Dim Pos1 As Long Dim Pos2 As Long Dim Len3 As Long Dim Len4 As Long Dim Pos3 As Long Dim Pos4 As Long Dim PutBook As Workbook With CreateObject("ADODB.Stream") .Charset = "UTF-8" .Open .LoadFromFile MyFile buf = .ReadText .Close End With Len1 = Len(Key1) Len2 = Len(Key2) Pos1 = InStr(buf, Key1) Pos2 = InStr(buf, Key2) Len3 = Len(Key3) Len4 = Len(Key4) Pos3 = InStr(buf, Key3) Pos4 = InStr(buf, Key4) Set PutBook = Workbooks.Add With PutBook.Sheets(1) .Cells(1, 1).Value = "氏名" .Cells(2, 1).Value = Mid(buf, Pos1 + Len1, Pos2 - (Pos1 + Len1)) .Cells(1, 2).Value = "氏名カナ" .Cells(2, 2).Value = Mid(buf, Pos3 + Len3, Pos4 - (Pos3 + Len3)) 'クリップボードをクリア Application.CutCopyMode = False PutBook.SaveAs ThisWorkbook.Path & "\" & PutBokName End With End Sub -------------------------------

  • アクセス ステータスバーの文字を表示させたい

    エクセルなら、 Sub Sample01() Application.StatusBar = True Application.StatusBar = "あああ" End Sub で、左下に文字を表示させられますが、 同じコードをアクセスで実行すると、「StatusBar 」の部分が、コンパイルエラーになります。 なので、 Sub Sample02() DoCmd.StatusBar = True DoCmd.StatusBar = "あああ" End Sub として見ましたが、結果は同じでした。

  • 最大行数を取得するVBAコードとは?

     人生で初めてエクセルのマクロに挑戦してみた。が、《最大行数を取得するVBAコード》で躓いた。2時間ばかり、悪戦苦闘したがサッパリ判らない。苦肉の策で、SQL文を使った。でも、それじゃー解決したことにはならない。 Public Sub Do_XferPer()   Dim I As Integer   Dim N As Integer      Application.ScreenUpdating = False   '   ' 先頭行の取得   '   N = DLookup("SELECT COUNT(*) FROM [Sheet3$A:A1000]") - 1   Debug.Print N   For I = 2 To N     If 0 Then       Cells(I, 1) = XferPer(Cells(I, 1))     End If   Next I   Application.ScreenUpdating = True      With ThisWorkbook.Worksheets("Sheet3").UsedRange     N = .Rows.Count - 1     Debug.Print N   End With   With Range("A1").SpecialCells(xlLastCell)     N = .Row - 1     Debug.Print N   End With End Sub 【質問】 みなさんは、最大行数を取得するのにどのようなコードを書かれていますか?  宜しくお願いします。

  • ADODB.Streamを使用してUTF-8を出力

    こんちには。VBA初心者です。 Excelのワークシートの値をUTF-8形式のテキスト(.csvで保存します)形式でエクスポートするため、以下のようなコードを書いてみたのですが、「.Type = adTypeText」のところで、「実行時エラー 3001:引数が間違った型、許容範囲外、または競合しています。」のエラーになってしまいます。 ADO関係はほとんど知識がなく、「http://msdn.microsoft.com/ja-jp/library/cc408239.aspx」こういうところで調べても、よく理解できないことが多いので困っています。 どなたか助言をいただけないでしょうか。 (後学のために多少の解説もいただけると助かります) Sub exportToCsv() Dim myBook As String Dim mySheet As String Dim myLastRow As Long Dim i As Integer myBook = "sample.xlsm" mySheet = "sample" Workbooks(myBook).Worksheets(mySheet).Activate myLastRow = Cells.SpecialCells(xlLastCell).Row Set myStream = CreateObject("ADODB.Stream") With myStream .Type = adTypeText .Charset = "UTF-8" .Open .WriteText End With For i = 1 To myLastRow myStream.WriteText Cells(i, 1) & vbLf Next i myStream.SaveToFile "D:\sample.csv" myStream.Close Set myStream = Nothing End Sub

専門家に質問してみよう