• ベストアンサー

ExcelVBAでの2バイト文字の入力方法

ExcelVBAを用いてファイルを入力し、そこから項目毎にデータを分割して各セルへ値を設定するという処理を作っています。 [ファイルイメージ(1レコードのみ)]  12345678900000000△△△△△・・・  ←項目1→←項目2→←項目3→・・・ 今までは、ファイルをバイナリアクセスモードでOpenし、その後に For i = 1 to n Get #FileNum, i, b next i というように、バイト位置(Count)をずらしながら、1バイト単位に変数bに入れて、 処理を行ってました。 これまではファイル内のデータが全て1バイト文字だったのですが、全角2バイト 文字が含まれる ようになり、どのように処理を行えばファイルを読み込んで全角文字に変換できる のかが分かりません。 初心者的なご質問かもしれませんが、よろしくお願いします。

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

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

はずしている可能性が大ですが、、、 固定長なら OpenText メソッドで普通に開くのではダメですか? c:\test.txt に↓こんなデータがあったとして 111あいうえお11111 222かきくけこ22222 333さしすせそ33333 ↓こんな感じ Sub Test()  Workbooks.OpenText _   Filename:="C:\test.txt", StartRow:=1, _   DataType:=xlFixedWidth, FieldInfo:= _   Array(Array(0, 2), _       Array(3, 2), _       Array(13, 2)) End Sub

その他の回答 (1)

回答No.2

普段ファイルからの読み込みをしないので、全く自信がないですが、 普通、固定長のバイナリファイルならランダムアクセスで 処理しませんか?(間違ってるかもしれませんが) 例えば、 Type Rec_Type   No As Long   Code As String * 5   Name As String * 10 End Type Sub test()   Dim Rec As Rec_Type   Dim FlName As String   Dim n As Long   Dim dat As String   FlName = "c:\TEST.ZZZ"   n = FileLen(FlName) / Len(Rec)   Open FlName For Random As #1 Len = Len(Rec)   For i = 1 To n     Get #1, i, Rec     With Rec       dat = .No & Chr(13)       dat = dat & .Code & Chr(13)       dat = dat & .Name     End With     MsgBox dat   Next i   Close #1 End Sub これなら2バイト文字でも拾ってきます。 固定長では、無いのでしょうか? 1バイト単位で読み込む理由があるのですか?

関連するQ&A

  • ExcelVBA バイナリファイルの全半角の判断

    Excel VBAでテキストファイルを、バイナリファイルとして読込み シートに出力しようとしています。 しかしテキストファイルには全角半角が混ざっており、うまく出力できません。 Dim buf As Byte 上記の変数に読込んだバイナリデータ1バイト分を入れるとして、 これが半角文字なのか、全角文字の半分なのか、判断することはできるのでしょうか。

  • バイナリデータの取り方

    VB6を使用して、バイナリファイルをバイナリデータとして文字列にとりたいのですが、全角文字が絡んだ時の処理がうまくいきません。 バイナリファイルをString型の変数に丸ごと読み込んで、後は何バイトから何バイト目を抜き取り数値に変換…という処理をしようとしています。 本来は、バイナリでファイルをオープンして、Getコマンドで取得するのが手っ取り早いのですが、ファイルアクセス回数を減らすため、このような面倒な方法をとっております。 そこで仮に、 dim test as string dim i as integer test = "aあ" & chr(1) & "0 " For i = 1 to 6 Debug.Print Asc(Strconv( _ MidB(Strconv(test,vbFromUnicode),i,1), _ vbUnicode)) Next のようなソースを作ってみました。(本来は文字列は数100KByte…) しかしながら、この方法ですと上の例では2Byte目、つまり「あ」の文字の1Byte目が「&H00」になってしまいます。その次は「&HA0」、他の箇所も問題ないのですが… おそらくは根本的に違う方法で解決すべきではないかと思うのですがその方法がわかりません。 なお、この格納データはバイナリデータなので、意図的に全角文字にしていくてもその値によって(偶然)全角文字になったり制御文字になったりしますので前もって全角文字に対する処理は難しいと考えてます。 質問の仕方が良くなく、質問の内容がなかなかご理解いただけないとは思いますが、ご存知の方、ご経験者の方、ご教授お願いいたします。

  • バイナリ5バイトを文字10バイトに変換

    バイナリ5バイトを文字10バイトに変換 いつもお世話になっています。 C++初心者です。 12 34 56 78 90(バイナリ5バイト)を 1234567890(文字10バイト)に変換する方法はありますか? バイナリで読み込んだデータがあり、特定箇所に、数字10桁が格納されてます。 下記イメージです。 12 34 56 78 90(バイナリ5バイト) それを文字10バイトで処理するしたいのですが、変換方法がネットで探せませんでした。 お知恵をお貸しください。 環境はVC++6 です。 よろしくお願いします。

  • EXCELVBA 文字の判別

    excelVBAで困っていることがあります。 あるセルに入っているデータの先頭の文字より半角数字5桁の数字を取得する処理を作っています。 先頭5文字をmid関数で取得すれば、簡単だと思っていたのですが、 データを見てみたところ、以下のようなデータがあることがわかりました。 (例)20-500(半角-),20―500(ダッシュ),20500(全角) 20 500(半角スペース),20 500(全角スペース),205(桁落ち),2050あ(全角文字付き) 5桁の数字が取得できると思われる箇所は 半角5桁で取得しなければいけません。 また、正しいデータは半角数字5桁だよ、 ということをユーザに知らせるため、半角数字5桁のデータ以外は それぞれ半角-は赤、ダッシュは青等セルの色を変更する必要があって困っています。 ご教授ください。よろしくお願いいたします。

  • 半角/全角文字混在データの分割方法

    VB6.0にて、あるデータ項目の内容を、画面上の2つの表示領域に分割して セットする方法を教えて下さい。 あるファイルの項目として、「住所」という項目があるとします。 このデータを取得し、画面に表示する際に、「住所1」「住所2」とに分割して、 セットします。 この場合、ファイル上の「住所」は、キャラクタタイプで40バイトと定義されており、 ”半角/全角文字混在”でデータが格納されています。 画面上の、「住所1」「住所2」はそれぞれ、20バイトとします。 この様な条件で、単純に取得したデータを2分割すると、 取得したデータが、全て半角か全角なら問題はないのですが、 例えば、1文字目が半角で、以降が全て全角文字だった場合に、 最後の全角文字がぴったり収まらなくなり、うまく表示できないように思います。 また、文字を取得する際に、使用している、Mid(MidB)関数やLen(LenB)関数も、 うまく利用できていないようです。(コード体系の違いでしょうか?) どなたかご教授下さい。 よろしくお願いします。

  • ExcelVBAで文字の比較

    いつもお世話になっています。 ExcelVBAでソフトを作っているのですが、 ユーザフォーム上のコンボボックスとセルの文字比較がうまくいきません。 コードは、 For i = 1 To 100 If Controls("ComboBox" & h).Value = Sheets("Sheet1").Cells(i, 8) Then  ~ 処理 ~ Exit Sub End If Next i としているのですが、文字と半角数字の組み合わせ「北1」等だとうまく処理に行くのですが、 半角数字のみ「1」だけだとコンボボックスとセルの値が同じでも 処理に行かず終了してしまいます。 セルの書式設定で文字列に指定しても変わりませんでした。 解決法がわからずに困っています。 お分かりの方いましたらご回答よろしくお願いします。

  • mpgのバイナリデータの先頭の数バイトカットしたい

    mpgファイルの先頭数byteをカットしたものを作りたいのです。 例えば、 先頭256byteだけカットしたmpgファイルを作成する場合は、やはり変数にファイルをバイナリ形式で読み込んで、それを書き出すという処理を行うのでしょうか? 変数に取り込むのであれば そこで、APIのopenfile(API)を使おうとおもうのですが どなたか、よい方法がありましたらお教え願えませんでしょうか? よろしくお願いします

  • ExcelVBAを使ったときの文字化け

    ダウンロードしたhtmlファイルを、ExcelVBAを使ってExcelに転記しています。 ファイル数は20程度、各々5列100行程度のデーターで、1つのファイルを1つのシートに転記しています。 ダウンロードした状態では文字化けはなくすべて正常に表示されているのですが、エクセルに転記すると文字化けするものがあります。 どのようなことが原因として考えられるのでしょうか。 環境はOS win2000pro + office2000で使っています。 よろしくお願いします。

  • マクロで1ファイルに複数の文字コードで出力する方法

    研究室で使用しているツールの文言表示用の テキストファイルを出力するようにマクロを組んだエクセルファイルが有るのですが、 2年続けて中国人の方が研究室に入ってきたため ツールを中国語化しようとツールとエクセルファイルをメンテしているのですが ツールの構造と動作環境の関係から出来たら 日本語→shift-jis 中国語(繁)→big5 中国語(簡)→GB2312 の各文字コードで1つのファイルにまとめて出力したく試行錯誤していたのですが うまい方法が見つからず困っています。 何かヒントになりそうな事柄でもいいので情報お持ちの方が居ましたらお願いします。 ---------------------------------------- ◆シート側 ┏―┳―――┳―――┳―――┓ |ID|日本語|繁体字|簡体字| ┣―╋―――╋―――╋―――┫ |01| 開始 | 開始 | 开始 | ┣―╋―――╋―――╋―――┫ |02| 終了 | 結束 | 结束 | ┣―╋―――╋―――╋―――┫ |03| 編集 | 編輯 | 编辑 | ┗―┻―――┻―――┻―――┛ ・ ・ ・ ◆出力したいテキストファイル 01J  開始 01C1 開始 01C2 开始 02J 終了 02C1 結束 02C2 结束 03J 編集 03C1 編輯 03C2 编辑 ・ ・ ・ ◆コード概要 ※概要説明用に簡略してるので多少変なところがあるかも知れません ファイル出力部分です Dim FileNum As Long Dim text As Object ’オブジェクトを宣言 Set text = CreateObject("ADODB.Stream") ’ADODB.Streamを使用 text.Type = adTypeText text.Charset = "shift-jis" ’文字コード設定 For FileNum = 0 To (SheetCount) ’全シートを対象にシートごとにファイルを出力 text.Open Count = 0 Do While Count < lItemNum(FileNum) ’各シートにおける項目数分 text.WriteText Output(FileNum, Count) ’Outputにシートから読込み出力用に形を整えた全ての文言が入ってます Count = Count + 1 Loop text.SaveToFile ("C:\TEST.txt"), adSaveCreateOverWrite text.Close Next FileNum Set text = Nothing ここでファイルに追記する形にすれば出来るのでは!? とかも 考えたのですがこの出力方法における追記方法が 出力済のデータを再度読み込み、その末尾に新たなデータを追加し 全て出力し直すといった方法しか見つけられなかったため、 結局1種類の文字コードでしか出力できませんでした。 1つのファイルに複数の文字コードでの出力は無理なんでしょうか?

  • エクセルVBAでのファイル入力(GET)

    1レコードのとあるテキストファイルがあります。 形式は、‘\’+「文字コード(HEX)」 の羅列です。 \20\20\20\20\20\31\32\33\34\35\36\37\38・・・ 目的としては、このファイルから\を取り除いて、データ項目別に 読み込み、文字に変換することです。 即ち、上記の例だと   △△△△△12345678・・・   ←項目1→←項目2→ といった感じになります。(△:スペース) そこで、\を外した文字列をセットする際に、最初のコードでは うまくいかず、その後試してみながら結果的にはうまくいきました。 ですが、最初のコードでうまくいかなかった理由というのが理解 できません。 どこがおかしかったのでしょうか? ≪正常に行かなかったコード≫----------------- 'ファイルオープン Open(パス)For Binary Access Read As #FileNum '1つ分の項目のデータをGET For j = 1 To n   Get #intFileNum, j , tempStr   If tempStr <> "\" Then     Str = Str & tempStr Else   End If Next j ※これだと「tempStr」には何もセットされず、結果と  して「Str」も空になってしまいます。 ≪正常に行ったコード≫---------------------- 'ファイルオープン&全てGET Open(パス)For Binary Access Read As #FileNum Get #FileNum, , Buff '1つ分の項目のデータを入力 For j = 1 To n   tempStr = Mid(Buff, j , 1)   If tempStr <> "\" Then     retStr = retStr & tempStr   Else   End If Next j ※これだと正常に「tempStr」に文字がセットされます。

専門家に質問してみよう