Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3461 / 13645 ツリー ←次へ | 前へ→

【62070】テキストの変換 たかし 09/6/19(金) 14:47 質問[未読]
【62075】Re:テキストの変換 neptune 09/6/19(金) 23:04 発言[未読]
【62085】Re:テキストの変換 たかし 09/6/21(日) 0:45 質問[未読]
【62088】Re:テキストの変換 りん 09/6/21(日) 9:37 発言[未読]
【62089】Re:テキストの変換 たかし 09/6/21(日) 12:25 お礼[未読]

【62070】テキストの変換
質問  たかし  - 09/6/19(金) 14:47 -

引用なし
パスワード
   いつもお世話になっております。
現在、テキストファイルを読み込み、テキストファイルの"AAA"を検索し
一致する行をシート上のtextboxにコピーしています。

しかし、"−"や"〜"、"1."等がバケてしまいます。
 "−" → -
 "〜" → ~
 "1." → ①

マクロは、下記のように組んでいます。
文字バケしないようにするには、どうしたらよいのでしょうか?
また、文字化けしたものを直すいい方法は無いでしょうか?

Sub Disp()
 Dim fso As Object, fnow As Object, xlsThis As Object, objSheet1 As Object
 Dim FP As Variant, cont1 As Variant

 Set xlsThis = ThisWorkbook
 Set objSheet1 = xlsThis.Worksheets("Disp")

 objSheet1.TextBox1 = ""

 Const ForReading = 1, ForWriting = 2, ForAppending = 8
 FP = "C:\AAAA.txt"

 Set fso = CreateObject("Scripting.FileSystemObject")

 Set fnow = fso.OpenTextFile(FP, ForReading)
  Do While fnow.AtEndOfStream <> True
   temp = fnow.readline
   
   If temp Like "*aaa*" Then
    Cont1 = Split(Replace(temp, ";", ":"), ":")
    objSheet1.TextBox1 = Cont1(2)
   end if

 fnow.Close
 Set fnow = Nothing

End Sub

【62075】Re:テキストの変換
発言  neptune  - 09/6/19(金) 23:04 -

引用なし
パスワード
   ▼たかし さん:

文字コードは長い間真剣に考えた事ないので忘れたし、間違っているかも
しれませんが、ひらがな、漢字なども文字化けするならそれは
恐らく、文字コードの問題です。

どこでどのように作ったtextファイルか?や、
SJIS,unicode,EUC等の、textファイルはどの文字コードか?
を一度調べては如何?
ht tp://www.atmarkit.co.jp/fwin2k/win2ktips/627binfile/binfile.html

なので、一度読み込んで、文字コードの変換を行う必要があると思います。
行単位なら、StrConv 関数とか、ファイルごと処理するなら
ADOのstreamとかも使えるかと思います。(未確認ですけど)

確か、unicodeで保存したtextをsjisで開くとそうなったな??
自作ツールで変な事になった経験はあるけど・・・・忘れました。

>また、文字化けしたものを直すいい方法は無いでしょうか?
はありません。

【62085】Re:テキストの変換
質問  たかし  - 09/6/21(日) 0:45 -

引用なし
パスワード
   ▼neptune さん:
返信ありがとうございます。

文字コードに関しては、調べてみます。

しかし、今まで300以上のファイルの読み込みを行ったが、文字化けしていたのは
"−"(全角)と"〜"(全角)、"1.→20."(ここでの表示は"1."になっているが
"マル1")の3種類で、それぞれに対応してるコードはわかっています。
その他の漢字やひらがなで文字化けしている文字はありません。
この場合、対応しているコードを引っ張ってきて変換する事もできないのでしょうか?

例) abcde&#65293;fghi
       ↓
   abcde−fghi

この1つができれば、条件を変えるだけでできそうですが、私の知識では
読み込んだ行に"#65293"があれば、"&"と";"で区切り、&以前と"−"と";"以後を
つなげるなのですが、文章に"&"と";"が含まれている時の対応が思いつきません。

何かいい方法はないでしょうか?
そんな方法がないのであれば、ないことを教えてください。
自分勝手な質問だとは思いますが、ご教授願います。

よろしくお願いします。

【62088】Re:テキストの変換
発言  りん E-MAIL  - 09/6/21(日) 9:37 -

引用なし
パスワード
   たかし さん、おはようございます。

>しかし、今まで300以上のファイルの読み込みを行ったが、文字化けしていたのは
>"−"(全角)と"〜"(全角)、"1.→20."(ここでの表示は"1."になっているが
>"マル1")の3種類で、それぞれに対応してるコードはわかっています。
>その他の漢字やひらがなで文字化けしている文字はありません。
>この場合、対応しているコードを引っ張ってきて変換する事もできないのでしょうか?
>
>例) abcde&#65293;fghi
>       ↓
>   abcde−fghi


>何かいい方法はないでしょうか?
>そんな方法がないのであれば、ないことを教えてください。
組み合わせがわかっているということなので、
VBAのInstr関数(またはワークシート関数のFind)で文字列の存在を確認→Select Caseなどで組み合わせを決定→VBAのReplace関数(ワークシート関数のSubstitute)で置き換えでもよさそうですが・・・ということで、関数で行なう場合のサンプルです。

Sub test1()
  Dim a(0 To 2) As String
  Dim p(1 To 2) As Integer
  'サンプル文字列
  a(0) = "AAA;BCDEFG&#65293;HIJ&#69999;;QQQ"
  '処理用文字列
  a(1) = a(0)
  Do
   p(1) = InStr(a(1), "&#")
   If p(1) = 0 Then Exit Do
   p(2) = InStr(p(1) + 1, a(1), ";")
   If p(2) < p(1) Then Exit Do '対になる「;」がない場合は中断
   '置換前の文字列「&#65293;」
   a(2) = Mid(a(1), p(1), p(2) - p(1) + 1)
   '下の関数で変換後の文字列を取得しReplaceで置き換える
   a(1) = Replace(a(1), a(2), Get_BB(a(2)))
  Loop
  '
  MsgBox a(0) & vbCrLf & " ↓" & vbCrLf & a(1), vbInformation, "Done"
  Erase a, p
End Sub
'////////////文字コードから文字列へCase分岐で変換
Function Get_BB(arg1 As String) As String
  Dim NN As Long, s1 As String
  '数値化
  s1 = Replace(Replace(arg1, "&#", ""), ";", "")
  NN = Val(s1)
  '分岐(分岐に失敗したら数値のまま返す)
  Select Case NN
   Case 9312 To 9331: s1 = Chr(Asc("1.") + NN - 9312) 'カッコ内に○つき1を書いています
   Case 65293: s1 = "−"
   Case 65374: s1 = "〜"
   Case Else: s1 = " ?" & NN & "? " '対応するコード設定が必要
  End Select
  Get_BB = s1
End Function
○数字等の含めたコード番号は(htt p://blog.zodiac.vc/webtools/u/?n=68)を参考にしました。ちなみに、ハイフンっぽい文字ということらしいです(htt p://d.hatena.ne.jp/koseki2/20070927/unicodehyphen)

ところで、

Sub Test()
  '
  Workbooks.OpenText Filename:="C:\AAAA.txt", Origin:=932, _
   DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
   ConsecutiveDelimiter:=False, _
   Tab:=False, Semicolon:=True, Comma:=False, Space:=False, Other:=False
End Sub

これで文字化けなくファイルを開くことができますか?
適当なサンプルがないので試せていませんが、原因がUnicodeの変換表の混乱によるものらしい(参考:htt p://oshiete1.goo.ne.jp/qa3716434.html)ので、読み込む際のコードページを合わせたら最初から化けずにすむのではないかと。
ハイフンではないようなので、その後はやはり面倒そうですが。

【62089】Re:テキストの変換
お礼  たかし  - 09/6/21(日) 12:25 -

引用なし
パスワード
   ▼りん さん:

返信ありがとうございます。
確認すべき内容が多くありそうなので、少し時間をください。

Repalceは簡単にできそうですね。
構文は長くなりそうですが・・・
シートに対応表を作成し、そこから引っ張れるようにしてみようと思います。
そうすると、文字化けが増えたときに、対応表への追加で対応ができそうなので。

また、読み込みの段階で文字化けをなくせるのであれば、それが1番
いいと思いますので、そちらも試してみようと思います。

親切な対応、ありがとうございました。
うまくいかなかった時には、また相談させてください。

3461 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free