-
三流君の [コンビニ系HPへ] [VBA系HPへ] [ASP系HPへ] [愚痴系HPへ]

CSVから固定長(普通の)に変換

/*
 * 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 をダウンロードして、見てください。
Excel97 VBA csvtotxt.xls バグ付きが入っています




元データです

まず、Excelを起動して、 ファイル開くのテキストファイル、、、

ファイル名を指定して、 おっと、次は、カンマやタブなどの区切り文字、、 を選択して、、
区切り文字の種類をカンマにレ(チェック)を付けて、
文字列にして、
取り込み、、、完了。
あとは、固定長で、テキストを保存すれば、OKかな。。。
あれ、、名前を付けて保存に、固定長テキストファイルが無い??? えっ、なんで???Excelの機能にないの? (↑、、これ、Ken3のマチガイかもしれないので、要調査です、、)
マクロ記録で、途中まで作ります。。。 オイオイ、そんなんで、いいの? まぁまぁ、、、途中までは、適当に、、最後の味付けだけ、 今回は、がんばります。 ツール、マクロ記録を選択。 先ほどの手順で、テキストファイルを読み込みます。


ALT+F11を押すと、 すると、下記のようなモジュールができてます。 *あいかわらず、Excel君すごいような、、  バカ正直なようなコード書いてくれます  (ほんと、助かります、三流の私は、、、)
作成したマクロをボタンへ登録、、する方法 まず、ツールバー、フォームを表示します
次に、ボタンを選択します
シートにボタンを貼ると、登録マクロが選択できます

VBA系の無料メルマガ書いてます
メルマガ『VBAで楽しくプログラミング』(無料) を購読しませんか?
めろんぱん E-mail


...



番外編 愚痴系で書いてた今日の一品 (短いサブ関数など)
2000/05/13 SQL Count関数を使ってみる
2000/05/11 Access97 標準関数Midなどが使えない
2000/05/09 SendObjectのエンコード
2000/05/08 クエリーで〜以外とは
2000/04/27 Imagingコントロールを使ってみた
2000/04/25 Excel97 VBA イベントなど
2000/04/24 Access97で複数のプリンタを切替えて使用
2000/04/20 書式付きエクスポート DoCmd.OutputToで、できます
2000/04/19 Access97でExcel形式へExport時に書式設定を行いたい
2000/04/13 Access97でOutlook97/98とリンクする方法
2000/04/13 VBA Nameステートメント
2000/04/04 Accessでキー取得
2000/04/04 AccessでFile参照ダイアログ?
2000/04/03 縦書用数値変換改良
2000/04/01 Access Err テーブルを消したい
2000/03/31 縦書き数値、どうしてますか?
2000/03/29 VBA 手抜きで、処理後、explorerを開く
2000/03/28 Access --> Word へデータ
2000/03/24 名前一覧Excelの機能で、同じことできました
2000/03/23 Excel97 VBA セルに付けた名前一覧を作成する
2000/03/21 Excel セルに名前付け
2000/02/25 iniFileを読む GetPrivateProfileString
2000/02/15 Excel VBA Rangeオブジェクトとサンプル
2000/02/14 Access97 SizeMode/OLEサイズ で画像調整
2000/02/10 Access97 Pictureプロパティとサンプル
2000/02/09 Access97 集計クエリーで重複値をハジク
2000/02/07 Access97 サブフォームへ値をセット
2000/02/04 Access97 コントロールソース、チョットした使用法
2000/02/01 Access97 フォームフッター
2000/01/18 Access97 now()関数で有効期限処理、、、

_/_/ _/_/ _/_/ _/_/ _/_/
三流君のHP主な飛び先
VBAで楽しくプログラミング 最新情報 掲示板 バックナンバー メルマガ登録と解除
コンビニのオモテとウラ話 最新情報 掲示板 バックナンバー メルマガ登録と解除
ASPで遊ぶ、失敗する 最新情報 掲示板 バックナンバー メルマガ登録と解除
AB型三流PG 業務のグチ 最新情報 掲示板 バックナンバー メルマガ登録と解除
初心者にやさしいプログラム 最新情報 掲示板 バックナンバー メルマガ登録と解除
ネットで稼ぐ本音と失敗談 最新情報 掲示板 バックナンバー
www.ken3.org(サイト内)から Google を利用して、

人気ページ/アクセスランキング
↑一週間の訪問者数と人気のページを表示してます

その他、宣伝ページです
・[ アンケート/ポイント]などで月500円を必死に稼いでます(笑)
・[ SOHO/在宅プログラマー/派遣]の話題、Webエントリー後の反応など
・[ 出会い系]のお話、自分で出会い系のシステム作れないか?探ったお話
・[ ネットで小金を稼げるか?]実験中だが成果は無し
※あとは、[パソコン関係の書籍]や[ゲームソフト]、 [パソコンパーツ] をバナーから売ろうとするけど、
 なかなかうまくはいかないよね(笑)
←パソコンの技術系の書籍を探しているなら コンピュータ関連の出版社33社(アスキー、インプレス等)が共同運営するコンピュータの本・専門店 種類が豊富で探し易い※在庫ありが48時間以内発送

プログラム系、流れや基本系?
[No.4 プログラムって?流れって?]
[No.5 変数・乱数・定数]
[No.8 配列とArray関数]
[No.9 If文で範囲のチェック]
[No.10 Select Case XX To XX と Is >= XX]
[No.11 InputBox関数で簡単な値を受け取る]
[No.12 入力結果の判断いろいろ]
[No.19 Exit Subで途中退場する]
[No.20 配列変数ですっきりと?(2次元配列)]
[No.21 変数の型を意識する]
[No.22 関数って?Subプロシージャを呼ぶ]
[No.23 値を返すユーザー関数、Function関数]
[No.24 関数のパターンを少し]
[No.35 イベント処理について]
[No.36 オブジェクトのプロパティについて]
[No.37 オブジェクトのメソッドについて]
[No.45 歌詞の表記を参考に関数を作成]
[No.73 オブジェクトのループはFor Each In でループさせる]

VBA関数
[No.3 Dir関数でファイルの存在をチェックする]
[No.17 Val関数で文字列を数値に変換してみた]
[No.18 文字列を数値に変換、CIntで変換]
[No.38 キャラクタコード?って何? Chr関数、Asc関数]
[No.39 StrConv関数で半角を全角文字にしてみた]
[No.40 Len関数で遊ぶ、遊ばれる]
[No.72 文字列を日付型に変換、Cdateへの値の渡し方いろいろ?]
[No.77 Not演算子で細工する、プログラムはパズルのように...]

Excel関係
[No.28 Excelのグラフをgifへ変換 .Exportメソッド使用]
[No.43 セルのB3を参照するには?]
[No.44 Cells(257)とCells(2,1)の関係]
[No.49 Excel Rows(n).Select で行選択]
[No.47 Excel Application.GetOpenFilenameでファイル名取得]
[No.60 Cancel=Trueの使い方(例題:Excel 右クリック禁止)]
[No.51 Excel Range オブジェクトを使う]
[No.86 Excel 起動オプションのお話(引数的なラブレターを渡したい)]

Excel UserForm
[No.30 Excel UserForm テキストボックスのイベント]
[No.32 Excel UserForm_KeyDownイベント発生条件]
[No.34 ┌ ─ ┐│└ ┘を使って、文字列を囲ってみたい]
[No.42 ExcelのForm シートと連動させる]
[No.46 カウンタで先頭行チェック、空白で終わりの判断]
[No.61 Excel Form 閉じる方法 Unload Me]
[No.63 Excel UserForm で データ・フォームの機能を真似てみる]
[No.68 Excel Formで値を設定、標準モジュールで使用したい]
[No.84 Excel UserFormでコンボボックスを使用してみた]

Access 関係
[No.1 いきなりサンプルじゃぁねぇ、、文句の一つ言いたいよ]
[No.75 空のMDBを作成後、DoCmd.CopyObjectでテーブルコピー]
[No.85 Access クエリーで演算フィールドを使ってみる]

Access フォーム
[No.41 AccessのForm .Pictureプロパティで画像参照]
[No.62 Access フォームでパスワード入力(入力後*****表示)]
[No.65 Access Form TextBoxの.SelLength .SelStartプロパティ]
[No.66 Access ユーザーマスターのチェックとメニュー切り替え]
[No.67 Access Formを隠す Me.Visible = False (Closeとの違い)]
[No.69 Access コンボボックスを自動で開きたい]

Access レポート
[No.74 Access 列型レポートの左端に印刷したい]
[No.76 Access レポート Me.NextRecord = Falseで移動を止める]

Access から Excel 連携
[No.2 AccessからExcel出力]
[No.7 MDBと同フォルダのExcelファイルを開く]
[No.13 Excel セルに名前を付けてみる]
[No.14 Excel 隣のシートを参照して逃げる]
[No.48 AccessからExcelブックを開き、書式設定を行う]
[No.54 AccessからExcel開いて、処理終了後に閉じたい]
[No.58 Access クエリーを Excel既存シートへ エクスポート]
[No.59 Excelのマクロ付きフォーマットを壊されないように]
[No.64 AccessからExcelファイルを開いて・印刷して・閉じたい]

Excel から Access 連携
[No.15 ExcelからAccessのフォームを開いてみました]
[No.16 ExcelからAccessのモジュールを呼んでみました]

テキストファイル処理
[No.27 テキストファイル処理 ファイルへの書き込み]
[No.29 テキストファイル処理 ファイルからの読み込み]
[No.31 Write #で ””を付けた書き込み]
[No.33 FreeFile関数で空いてるファイル番号を返す方法]

インターネットエクスプローラーの操作(InternetExplorer.application)
[No.50 IE起動 CreateObject("InternetExplorer.application")]
[No.52 InternetExplorer.application .document.body.innerText]
[No.53 文字列を探す、InStr関数の使い方]
[No.70 InternetExplorer.application .document.all(0).innerHTML]
[No.71 IE操作 リンク先を取出す .Document.links(i).href]

Outlookを操作する
[No.55 Outlookを操作してメールを送りたい]
[No.56 Outlookから複数のアドレスにBCC送信]
[No.57 Outlook メールアイテムの形式でハマる]
[No.78 Outlookでファイルを添付するには?.Attachments.Add]

FTPの設定ファイルを作成してみた
[No.25 コマンドラインのFTPを使ってみた]
[No.26 FTP -n オプションとuserコマンド]

Excel HTML表作成ツールもどき
[No.80 Excelのセル範囲をHTMLの表(.html)にしてみる]
[No.81 セルの右寄せ、中央寄せをHTMLの表にしてみる]
[No.82 背景色、フォントカラーをHTMLの表にしてみる]
[No.83 改行LFを<BR>などHtml用にエンコードして書き込む]

その他
[No.6 ファイルの起動場所を知る方法]
[No.79 SJIS--JISコードの文字列を作成したい]

...
挨拶
最後まで読んでいただき、どうもです。
失敗続きのAB型の変わり者 三流プログラマー Ken3です。
[Excel/Access VBA],[ ASP(Active Server Pages)]の解説
[ プログラマーの愚痴]、[ 元コンビニ店長時代の話] をネタにしてHP作成、メルマガ書いてます。
最近、[初心者にやさしいプログラム]の解説と[ ネットで稼ぐ小悪テク]の解説を始めようかなぁと思ってます。
作者に感想・質問/要望を送る(気軽に質問・感想書いてください)
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 掲示板 E-mail で受信したい
※送っていただいた質問・感想はアドレス以外、メルマガで紹介する場合があります

...