CSVファイルからの連続取り込み − GoGoマクロ!のWebサイト

HOME > レッスン > CSV連続取込



前回 から、CSVデータを取り扱うマクロについての勉強をしています。

まず最初に、前回のおさらいですが、

CSVの大量データは「絞ってからエクセルに取り込む」という内容でした。 取り込んでからの選別削除するのは大変ですから、そのためのマクロを前回 作成するところまでをやりました。

なお、一部ご質問をいただきました前回の

++++++++++++++++++++++++++++─
Sub Macro2()
'
  ChDir "C:\Users\santa\Desktop"
  Workbooks.Open Filename:="C:\Users\Santa\Desktop\KEN_ALL.CSV"
End Sub
++++++++++++++++++++++++++++─

の「ChDir」の意味ですが、これについては当講座HPにその詳しい解説が ありますので、こちら ご覧ください。


で、前回その辺の基本プログラムが出来たところで、今回はその続きです。


1)
まずはじめに、前回作成したプログラムの中身の確認です。
――――――――――――――――――――――――――――+
1."gogo197"を開きます。(セキュリティ警告が表示された場合
 には、その右横の[コンテンツの有効化]というボタンを押して
 ください。)

2.プログラムの画面を表示します。
 [開発]タブの[コード]で [Visual Basic]をクリック。

3.この画面の左上半分の[−標準モジュール]という所の下の
 [Module1]の方をダブルクリックします。
――――――――――――――――――――――――――――+


++++++++++++++++++++++++++++―
Sub Macro1()
  Dim a(256) As String

  s = InputBox("検索したい地名を入力してください。")
  If Trim(s) = "" Then Exit Sub
  Open "C:\Users\Santa\Desktop\KEN_ALL.CSV" For Input As #5
  j = 1
  Do While Not EOF(5)
    Line Input #5, buf
    If buf Like "*" & s & "*" Then
      Call wReadCsv(buf, a, n)
      For i = 1 To n
        Cells(j, i).Select
        ActiveCell.FormulaR1C1 = a(i)
      Next i
      j = j + 1
    End If
  Loop
  Close #5
  MsgBox j - 1 & "件のデータを取り込みました。"
  Range("A1").Select
End Sub

Sub wReadCsv(ByVal bufbuf As String, aa() As String, num)
  Dim char1 As String

  num = 1
  aa(num) = ""
  For n = 1 To Len(bufbuf)
    char1 = Mid(bufbuf, n, 1)
    Select Case char1
      Case ","
        num = num + 1
        If num > 20 Then Exit For
        aa(num) = ""
      Case Chr(34)
      Case Else
        aa(num) = aa(num) & char1
    End Select
  Next n

End Sub
++++++++++++++++++++++++++++―

※上記プログラム中のフォルダ名の部分(パス名を示す C:\Users\・・・ の部分)は各個人のPC環境やファイルを保存した場所によって異なります ので、上記は私のPCのデスクトップにファイルがある場合の例となってい ます。

これは、前回作成した「CSVファイルから入力した文字を含む行のデータ だけエクセルに選んで取り込むためのマクロ」のプログラムです。前回も言 ったように、この下の部分はブラックボックス(中身は見なくてよいもの) としてご利用ください。

なお、[Module2]の中のMacro2の方はもう使いませんので割愛します。

引き続き今回も、作成したマクロのテスト実行の際には前回に郵便局のホーム ページからダウンロードしていただいた全国郵便番号CSVデータを用います。


2)
それでは、確認の為に実行してみましょう。
――――――――――――――――――――――――――――+
1.エクセルの画面に戻って、空のシートを開いてください。
(空のシートがない場合はシートの新規作成をしてください。)

2.では、実行します。

 [開発]タブの[コード]で [マクロ] をクリック → 「マクロ」
 画面が出るので、そのまま(Macro1が選ばれた状態で)[実行]
 をクリック。

3.すると、「検索したい地名を入力してください。」という
 入力欄のあるポップアップ画面が表示されますので、その
 入力欄に

泉町

 と打ち込んで、[OK]ボタンを押してください。

4.しばらく待つと、「○○件のデータを取り込みました。」
 とのポップアップ画面が出ますので、この画面の[OK]
 ボタンを押すと終了します。

5.続けてもう一度、そのまま同じシートを開いた状態で
(データ消さずにそのまま)、実行します。

 [開発]タブの[コード]で [マクロ] をクリック → 「マクロ」
 画面が出るので、そのまま(Macro1が選ばれた状態で)[実行]
 をクリック。

6.再び、「検索したい地名を入力してください。」という
 入力欄のあるポップアップ画面が表示されますので、その
 入力欄に今度は

末広町

 と打ち込んで、[OK]ボタンを押してください。

7.しばらく待つと、「○○件のデータを取り込みました。」
 とのポップアップ画面が出ますので、この画面の[OK]
 ボタンを押すと終了します。
――――――――――――――――――――――――――――+

この結果、全国の「泉町」の郵便番号一覧に、「末広町」の郵便番号が上書き されてしまったことと思います。

で今回は、表題の連続取り込みというのをやりたいですので、これではまずい ですね。そこで、前回作ったプログラムをちょっと直していきます。


3)
では、少々プログラムに手を加えていきます。
────────────────────────────+
1.まず、Macro1 の

    j = 1

 の行を、

    j = Cells(Rows.Count, "B").End(xlUp).Row + 1

 に修正してください。
────────────────────────────+

修正した後のプログラム(Macro1)は下記の様になります。

++++++++++++++++++++++++++++─
Sub Macro1()
  Dim a(256) As String

  s = InputBox("検索したい地名を入力してください。")
  If Trim(s) = "" Then Exit Sub
  Open "C:\Users\Santa\Desktop\KEN_ALL.CSV" For Input As #5
  j = Cells(Rows.Count, "B").End(xlUp).Row + 1
  Do While Not EOF(5)
     ・
     ・
     ・
  (以下省略)
++++++++++++++++++++++++++++─

今ここの修正のポイントは、これは既にデータがある場合に上書きせずに その最下行の次の行から書いていく(データを取り込んでいく)という方法 になります。

これには、単純にいつも当講座で使っている下記の構文

  j = Cells(Rows.Count, "B").End(xlUp).Row

を使えばよいわけですが、今回はそれに1を足して

  j = Cells(Rows.Count, "B").End(xlUp).Row + 1

とします。

このお尻に付けた+1というのが重要です。これは、「最後のデータ行の次」 という意味になりますので、もしこれを付けないと「最後のデータの行」が (既存する一番最後のデータ一行が)上書きされて消えてしまうことになる からです。ご注意ください。


4)
それでは、再び実行してみましょう。
――――――――――――――――――――――――――――+
1.エクセルの画面に戻って、再び空のシートを開いてください。
(空のシートがない場合はシートの新規作成をしてください。)

2.では、実行します。

 [開発]タブの[コード]で [マクロ] をクリック → 「マクロ」
 画面が出るので、そのまま(Macro1が選ばれた状態で)[実行]
 をクリック。

3.すると、「検索したい地名を入力してください。」という
 入力欄のあるポップアップ画面が表示されますので、その
 入力欄に

天神町

 と打ち込んで、[OK]ボタンを押してください。

4.しばらく待つと、「○○件のデータを取り込みました。」
 とのポップアップ画面が出ますので、この画面の[OK]
 ボタンを押すと終了します。

5.続けてもう一度、そのまま同じシートを開いた状態で
(データ消さずに)、実行します。

 [開発]タブの[コード]で [マクロ] をクリック → 「マクロ」
 画面が出るので、そのまま(Macro1が選ばれた状態で)[実行]
 をクリック。

6.再び、「検索したい地名を入力してください。」という
 入力欄のあるポップアップ画面が表示されますので、その
 入力欄に今度は

弥生町

 と打ち込んで、[OK]ボタンを押してください。

7.しばらく待つと、「○○件のデータを取り込みました。」
 とのポップアップ画面が出ますので、この画面の[OK]
 ボタンを押すと終了します。
――――――――――――――――――――――――――――+

この結果、条件を入れながら連続したデータ抽出取込みというのがこんな 簡単な修正でできるということが分かったかと思います。

なお、大した問題ではないですが、この場合に最初に空きのできる1行目は 見出し行に使うなり、じゃまであれば行削除するなり、してください。

というわけで、このようなごく簡単な修正だけで、上書きするか、連続的に データを取り込んでいくか、その変更は可能となるわけです。そして、今回 の連続データ取り込みができるようになったことによって、より高機能な マクロへと発展させていくことが可能となってきます。


それでは、ここで問題です。

Q.
いま大した問題ではないと言いましたが、このような問題をマクロで解決 する方法を述べなさい。

ヒント.
この方法には主に2つがあります。

少々中級者向けの問題ですが、腕に自信のある方はこの答えちょっと考えて みてください。答え合せは次回おこないます。


今回はこれで終了です。

今日作ったマクロプログラムは次回もこの続きでまた使いますので、 ファイルの種類を必ず「マクロ有効ブック」にて、大切に保管して おいてください。(ファイル名:gogo198.xlsm)

次回もこの続きです。お楽しみに!


NEXT >>
・準備中です。m(__)m
エクセルでプログラミングの極意
VBA高速化ランキング【CSVデータ取込】



 

▼一から自分で作れるマクロ講座の登録はこちら((無料))  まぐまぐ
Go!Go! エクセルマクロをはじめよう! (マガジンID:0000135169)   
メルマガ登録
  メールアドレス: