[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.102 Excel 範囲を選択して、カンマ区切りのファイルを作る

Excel 範囲を選択して、カンマ区切りのファイルを作る

メルマガ発行内容

<Excel 範囲を選択して、カンマ区切りのファイルを作る>

どうも、三流プログラマーのKen3です。 今回は、 Excelで範囲を選択して、カンマ区切りのファイルを作ってみたいと思います。 たいした内容じゃないのですが。 http://www.ken3.org/p/f/lzh/office-019.lzh に今回のサンプル保存されてます。 あわせてみてください。

/* * 1.プログラムは流用と新機能の作成? */

Excel範囲をHTMLのテキストファイルにするプログラムを作成ました。 詳細は、 http://www.ken3.org/backno/backno_vba17.html の [No.80 Excelのセル範囲をHTMLの表(.html)にしてみる] [No.81 セルの右寄せ、中央寄せをHTMLの表にしてみる] [No.82 背景色、フォントカラーをHTMLの表にしてみる] [No.83 改行LFを<BR>などHtml用にエンコードして書き込む] を見てください。 なんていつもの過去マガの宣伝は置いといて、 今回は、HTML部分をCSVの出力に変えて、作ってみたいと思います。 まずは、流用して、工夫も無しに出力してみました。
Sub Main()

    'Application.InputBoxでセルを選択させる
    Dim objTARGET As Range '選択されたセルの集合
    Set objTARGET = Application.InputBox(prompt:="セルを選択", Type:=8)
    If IsEmpty(objTARGET) Then 'キャンセルが押されたかチェックする
        MsgBox "キャンセルが押されました"
        Exit Sub
    End If
    
    'ファイル名を作成 ファイル名は自分のパス+\test.html
    Dim strFNAME As String   'ファイル名保存用
    strFNAME = ThisWorkbook.Path & "\test.csv" 'ファイル名を作る

    'テーブルデータを作成する
    Call MAKE_CSV_FILE(strFNAME, objTARGET)

    'できたファイルをメモ帳で表示して確認する
    Shell "notepad.exe " & strFNAME '手抜きでShellで起動
    
    '終わりの挨拶
    MsgBox strFNAME & "を作成しました"
    
End Sub
'ファイル名とセルの範囲RANGEを受け取り、 'ファイルを開きカンマ区切りのファイルを作成する
Sub MAKE_CSV_FILE(strFNAME As String, objHANI As Range)

    'ファイルをオープンする
    Dim FNO      As Integer  'ファイル番号
    FNO = FreeFile '空いてるファイル番号を取出す
    Open strFNAME For Output As #FNO  'テキストファイルを新規作成

    '行、列でループを作る
    Dim y As Integer
    Dim x As Integer
    For y = 1 To objHANI.Rows.Count         '行のループ
        For x = 1 To objHANI.Columns.Count  '列のループ
            Print #FNO, objHANI.Cells(y, x).Value;
            Print #FNO, ",";
        Next x
        Print #FNO, ""  '改行のみ出力
    Next y

    'ファイルをクローズする
    Close #FNO

End Sub
ファイルを開いて、何も考えないで出力してみました。 ポイントは、 ~~~~~~~~~~~~ For y = 1 To objHANI.Rows.Count '行のループ For x = 1 To objHANI.Columns.Count '列のループ Print #FNO, objHANI.Cells(y, x).Value; Print #FNO, ","; Next x Print #FNO, "" '改行のみ出力 Next y で、セルの範囲をループさせて、 .Valueをそのまま出力してます。

/* * 2.実行テスト */

プログラムが完成したら、テスト、不具合修正、またテスト・・ といった作業になるのかなぁ。 データを用意して、テストしてみました。 日付 単価 数量 合計金額 備考 2003/6/7 22:34 10 5 50.0 文字列は、、、 2003年6月7日 12.5 5 62.5 文字列は、、、 平成15年6月7日 25.5 1.15 29.3 文字列は、、、 H15.6.7 750 1.3 975.0 文字列は、、、 合計は表示形式で小数点以下1位まで。 日付は=Now()関数と表示形式を変えてます。 上記の表を変換してみました。 すると、変換結果は、 日付,単価,数量,合計金額,備考, 2003/06/07 22:34:14 , 10 , 5 , 50 ,文字列は、、、, 2003/06/07 22:34:14 , 12.5 , 5 , 62.5 ,文字列は、、、, 2003/06/07 22:34:14 , 25.5 , 1.15 , 29.325 ,文字列は、、、, 2003/06/07 22:34:14 , 750 , 1.3 , 975 ,文字列は、、、, でした。 う〜ん、一工夫必要ですね。 ^^^^^^^^^^^^^^^^^^^^^^^^^^ まず、気になるのは、実害は無いかもしれないが、 カンマが1つ多く出力されている(行最後のカンマ) 日付,単価,数量,合計金額,備考,←の最後の改行前のカンマ これは、 For x = 1 To objHANI.Columns.Count '列のループ Print #FNO, objHANI.Cells(y, x).Value; Print #FNO, ","; Next x データ出力 Print #FNO, objHANI.Cells(y, x).Value; カンマを出力 Print #FNO, ","; とペアで出力しているからです。 これを、値の前にカンマを出力すように変更してみます。 For x = 1 To objHANI.Columns.Count '列のループ Print #FNO, ","; Print #FNO, objHANI.Cells(y, x).Value; Next x これだけだと、今度は、先頭にカンマが付く(笑) ,日付,単価,数量,合計金額,備考 カンマを出力してからデータを書いてるので、あたりまえか。。。 なので、もう一工夫、 For y = 1 To objHANI.Rows.Count '行のループ Print #FNO, objHANI.Cells(y, 1).Value; '先頭項目の出力 For x = 2 To objHANI.Columns.Count '列のループ Print #FNO, ","; Print #FNO, objHANI.Cells(y, x).Value; Next x Print #FNO, "" '改行のみ出力 Next y と、先頭項目を出力後、カウンタを2からスタート、 カンマを出力後、データを出してみました。 ※小細工だけどね。 'ファイル名とセルの範囲RANGEを受け取り、 'ファイルを開きカンマ区切りのファイルを作成する
Sub MAKE_CSV_FILE(strFNAME As String, objHANI As Range)

    'ファイルをオープンする
    Dim FNO      As Integer  'ファイル番号
    FNO = FreeFile '空いてるファイル番号を取出す
    Open strFNAME For Output As #FNO  'テキストファイルを新規作成

    '行、列でループを作る
    Dim y As Integer
    Dim x As Integer
    For y = 1 To objHANI.Rows.Count         '行のループ
        Print #FNO, objHANI.Cells(y, 1).Value; '先頭項目の出力
        For x = 2 To objHANI.Columns.Count  '列のループ
            Print #FNO, ",";
            Print #FNO, objHANI.Cells(y, x).Value;
        Next x
        Print #FNO, ""  '改行のみ出力
    Next y

    'ファイルをクローズする
    Close #FNO

End Sub

/* * 3..Value , .Value2 , .Text */

現在、.Valueで出力してます。 これを表示形式通りで出力できないか?(画面の見た目通り)と思い、 いろいろと見てみると、おっ、.Value2ってあるじゃん。 これ試してみよう。 ↑プロパティの選択画面※ここから冒険して探すのも一つの手です。 ? range("b3").Value 2003/06/07 22:34:14 ? range("b3").Value2 37779.9404351852 あらら、期待ハズレか、、、 おっ、.Textってのがある、これを試してみると、 ? range("b3").Text 2003/6/7 22:34 ? range("b4").Text 2003年6月7日 ? range("b5").Text 平成15年6月7日 と、表示形式が効いて、出力されます。 ※場合によっては、使い分けてみたいですよね。 今回みたいに、プログラムに組み込む前に イミディエイト ウインドウ で 関数やプロパティのテストをすると、簡単でいいですよ。 ? Len(a) とか関数の実行できるので便利です。 (詳細解説は、 http://www.ken3.org/vba/iwind.html 参照 )

/* * 4.終わりの挨拶 */

今回は、 選択範囲をカンマ区切りのCSVファイルにしてみました。 カンマの隣に空白が出力されて、まだまだ使えないルーチンだけどね。 .Value , .Value2 , .Text 似てるけど、少し違うので、みなさんも、探ってみてください。 何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。


ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

種類別のリンク や 広告など

気になったジャンル↓を選択してください。

人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [VBAやASPのサンプルコード]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]