/* * 4.CSVから固定長(普通の)に変換 楽して、、、 */ CSVから固定長(普通の)に変換 かぁ、、、 Excelの機能で、できないかなぁ、、、 チョット、やってみますか。 まず、Excelを起動して、 ファイル開くのテキストファイル、、、 ファイル名を指定して、 おっと、次は、カンマやタブなどの区切り文字、、 を選択して、、 区切り文字の種類をカンマにレ(チェック)を付けて、 文字列にして、取り込み、、、完了。 あとは、固定長で、テキストを保存すれば、OKかな。。。 あれ、、名前を付けて保存に、固定長テキストファイルが無い??? えっ、なんで???Excelの機能にないの? (↑、、これ、Ken3のマチガイかもしれないので、要調査です、、) /* * 5.しかたない、、、自分で作ろう、、、 */ 自分で、作ることにします。 Accessのテーブルに入れれば、なんかできそうな気がする けど、Excel VBAでカッコわるく作ります。 (とりあえず、固定で、汎用性の無いプログラムで、、、) マクロ記録で、途中まで作ります。。。 オイオイ、そんなんで、いいの? まぁまぁ、、、途中までは、適当に、、最後の味付けだけ、 今回は、がんばります。 ツール、マクロ記録を選択。 先ほどの手順で、テキストファイルを読み込みます。 ALT+F11を押すと、 すると、下記のようなモジュールができてます。 *あいかわらず、Excel君すごいような、、 バカ正直なようなコード書いてくれます (ほんと、助かります、三流の私は、、、) Sub Macro1() ' ' Macro1 Macro ' ' Workbooks.OpenText FileName:="D:\034\Sample.txt", StartRow:=1, DataType:= _ xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, _ Tab:=False, Semicolon:=False, Comma:=True, Space:=False, Other:=False _ , FieldInfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2), Array(4, 5), Array(5, 2), _ Array(6, 2)) End Sub まぁ、意味わかんないけど、これで、CSVがExcelになります。 あとは、このコードに肉づけして、、、 Sub Macro1() Dim strINFname As String Dim strOUTFname As String Dim nYLINE As Integer Dim x As Integer Dim OUT_FNO% Dim nOUTSIZE(10) As Integer '10もいらないでしょ、、、 Dim strOUTBUF As String ' csvtotxt.xls のパスを使用して、INファイル、Outファイルの 'ファイル名を作成する strINFname = ActiveWorkbook.Path & "\Sample.txt" strOUTFname = ActiveWorkbook.Path & "\out.txt" 'お行儀良く、入力ファイルがアルか、チェックしますか、、、 If Len(Dir(strINFname) & "") = 0 Then MsgBox strINFname & "ファイルが見つかれません" Exit Sub 'モジュールを抜ける End If '入力ファイルをCSVで開く ↓変数に変更 Workbooks.OpenText FileName:=strINFname, StartRow:=1, DataType:= _ xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, _ Tab:=False, Semicolon:=False, Comma:=True, Space:=False, Other:=False _ , FieldInfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2), Array(4, 5), Array(5, 2), _ Array(6, 2)) '出力テキストファイルを作成する 'シーケンシャル ライト モードで開きます OUT_FNO = FreeFile Open strOUTFname For Output As #OUT_FNO '出力先のサイズを代入 'サンプルデータは会員番号1(8桁)、漢字氏名(20桁)、ローマ字 '(18桁)、生年月日(10桁)、会員番号2(10桁)、暗証番号 '(3桁)で構成されています。 nOUTSIZE(1) = 8 nOUTSIZE(2) = 20 nOUTSIZE(3) = 18 nOUTSIZE(4) = 10 nOUTSIZE(5) = 10 nOUTSIZE(6) = 3 'データが無くなるまでループ(A列が空白になるまで) 'おいおい、データが1行しかなかったら、どうなるの?<<<知らない、、 nYLINE = 2 'タイトルを抜かし、2行目から、スタート While Len(Cells(nYLINE, 1) & "") <> 0 For x = 1 To 6 'AからF列まで処理 strOUTBUF = LeftB(Cells(nYLINE, x), nOUTSIZE(x)) Print #OUT_FNO, strOUTBUF; '←を付けると改行されない Next x Print #OUT_FNO, "" '改行のみする nYLINE = nYLINE + 1 '忘れないようにカウントアップ Wend Close #OUT_FNO ' ファイルを閉じます。 '結果をメモ帳表示 Shell "notepad.exe " & strOUTFname, vbNormalFocus End Sub こんな感じで、、、、 あれ、、、うまく行かない、、、 今日は、あきらめます(すみません) strOUTBUF = LeftB(Cells(nYLINE, x), nOUTSIZE(x)) これが、おかしいみたいですが、、、 私なりの答え(再度の味付け)を下記に記載します。 *まだ、変換サイズなどを外部に出すなど、してませんが、、 '-------- Sub TEST_MAIN() Dim strINFname As String Dim strOUTFname As String ' csvtotxt.xls のパスを使用して、INファイル、Outファイルの 'ファイル名を作成する strINFname = ActiveWorkbook.Path & "\Sample.txt" strOUTFname = ActiveWorkbook.Path & "\out.txt" 'お行儀良く、入力ファイルがアルか、チェックしますか、、、 If Len(Dir(strINFname) & "") = 0 Then MsgBox strINFname & "ファイルが見つかれません" Exit Sub 'モジュールを抜ける End If 'サンプルモジュールをコールする Call Excel97_CSVtoTXT(strINFname, strOUTFname) '結果をメモ帳表示 Shell "notepad.exe " & strOUTFname, vbNormalFocus End Sub 'サンプルモジュール '固定処理が多いので流用・汎用性が無い、なぁ。。 'サイズを(も)引数で渡したり、工夫しないと、、 Sub Excel97_CSVtoTXT(strINFname As String, strOUTFname As String) Dim nYLINE As Integer Dim x As Integer Dim OUT_FNO% Dim nOUTSIZE(10) As Integer '10もいらないでしょ、、、 Dim strOUTBUF As String '入力ファイルをCSVで開く ↓変数に変更 Workbooks.OpenText FileName:=strINFname, StartRow:=1, DataType:= _ xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, _ Tab:=False, Semicolon:=False, Comma:=True, Space:=False, Other:=False _ , FieldInfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2), Array(4, 2), Array(5, 2), _ Array(6, 2)) '出力テキストファイルを作成する 'シーケンシャル ライト モードで開きます OUT_FNO = FreeFile Open strOUTFname For Output As #OUT_FNO '出力先のサイズを代入 'サンプルデータは会員番号1(8桁)、漢字氏名(20桁)、ローマ字 '(18桁)、生年月日(10桁)、会員番号2(10桁)、暗証番号 '(3桁)で構成されています。 nOUTSIZE(1) = 8 nOUTSIZE(2) = 20 nOUTSIZE(3) = 18 nOUTSIZE(4) = 10 nOUTSIZE(5) = 10 nOUTSIZE(6) = 3 'データが無くなるまでループ(A列が空白になるまで) 'おいおい、データが1行しかなかったら、どうなるの?<<<知らない、、 nYLINE = 2 'タイトルを抜かし、2行目から、スタート While Len(Cells(nYLINE, 1) & "") <> 0 For x = 1 To 6 'AからF列まで処理 strOUTBUF = Cells(nYLINE, x) 'XXバイトに満たない場合、空白を後ろに詰めています strOUTBUF = LeftB(StrConv(strOUTBUF & Space(nOUTSIZE(x)), vbFromUnicode), nOUTSIZE(x)) strOUTBUF = StrConv(strOUTBUF, vbUnicode) 'データ書きこみ Print #OUT_FNO, strOUTBUF; '←を付けると改行されない Next x Print #OUT_FNO, "" '改行のみする nYLINE = nYLINE + 1 '忘れないようにカウントアップ Wend Close #OUT_FNO ' ファイルを閉じます。 End Sub '-------- こんな感じです。 /* * 3.読者より、アドバイス 自作関数作ってみました */ 無いものは、自分で作ろうって、こころ、忘れてた、、、 読者からいただいた、固定長、右スペース埋め関数です。。 '---------------------------------------- Public Function SetKoteicho(input_str As String, length As Integer) As String Dim check_char As Integer 'Asc関数で全角かどうか調べる文字の位置 Dim sjis_length As Integer 'シフトJIS換算の文字数 Dim sjis_code As Integer '文字コード(シフトJIS) Dim output_str As String '固定長に変換した文字列 sjis_length = 0 check_char = 1 Do sjis_code = Asc(Mid(input_str, check_char, 1)) '文字コードから全角文字か半角文字かを調べる If sjis_code > 256 Or sjis_code < 0 Then '全角文字 sjis_length = sjis_length + 2 Else '半角文字 sjis_length = sjis_length + 1 End If check_char = check_char + 1 Loop While (check_char <= Len(input_str)) '必要なだけスペースを加える output_str = input_str & Space$(length - sjis_length) SetKoteicho = output_str End Function '-------------------------------------- '下記のようにコールすると、使用できます For x = 1 To 6 'AからF列まで処理 '感謝して、関数を使用する、、、 strOUTBUF = SetKoteicho(Cells(nYLINE, x), nOUTSIZE(x)) '-----------↑^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Print #OUT_FNO, strOUTBUF; '←を付けると改行されない Next x '-------------------------------------- ありがたいですね、、、ホント。サンプル→034.LZH 13KB をダウンロードして、見てください。
元データです
まず、Excelを起動して、 ファイル開くのテキストファイル、、、
ファイル名を指定して、 おっと、次は、カンマやタブなどの区切り文字、、 を選択して、、
区切り文字の種類をカンマにレ(チェック)を付けて、
文字列にして、
取り込み、、、完了。
あとは、固定長で、テキストを保存すれば、OKかな。。。
あれ、、名前を付けて保存に、固定長テキストファイルが無い??? えっ、なんで???Excelの機能にないの? (↑、、これ、Ken3のマチガイかもしれないので、要調査です、、)
マクロ記録で、途中まで作ります。。。 オイオイ、そんなんで、いいの? まぁまぁ、、、途中までは、適当に、、最後の味付けだけ、 今回は、がんばります。 ツール、マクロ記録を選択。 先ほどの手順で、テキストファイルを読み込みます。
ALT+F11を押すと、 すると、下記のようなモジュールができてます。 *あいかわらず、Excel君すごいような、、 バカ正直なようなコード書いてくれます (ほんと、助かります、三流の私は、、、)
作成したマクロをボタンへ登録、、する方法 まず、ツールバー、フォームを表示します
次に、ボタンを選択します
シートにボタンを貼ると、登録マクロが選択できます
質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
感想や質問・要望・苦情など 三流君へメッセージを送る。 時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。 |
←パソコンの技術系の書籍を探しているなら コンピュータ関連の出版社33社(アスキー、インプレス等)が共同運営するコンピュータの本・専門店 ※種類が豊富で探し易い※在庫ありが48時間以内発送 |