HOME >> バックナンバー

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
□□□□□□□□□□  □□□□□  □□□□  □□□  □□  □

  「Go! Go! エクセルマクロをはじめよう! 」
                    2008/08/20号 ― No. 107 ―

  面倒くさ〜いルーチンワークを撃退させるソーラーマガジン

◇  ◇◇  ◇◇◇  ◇◇◇◇  ◇◇◇◇◇  ◇◇◇◇◇◇◇◇◇◇
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


みなさんこんにちは、三太郎です。




■□ 今日のもくじ――――――――――――――――――――――――――
□■

  ◇リクエスト紹介
  ◇今日の講座
    <複数シートを検索して行の一覧を表示させるマクロ>
  ◇次回の予告
  ◇編集後記
    <何も言えない・・・>




―――――――――――――――――――――――――――――――――――
◆リクエスト紹介
―――――――――――――――――――――――――――――――――――

今回は、下記のリクエストをご紹介しています。


投稿者:さくらさん

 >  あるデータベース状のシート(複数あり)の中から、
 >  指定の文字列にヒットしたセルのある行データ(全て)を
 >  一覧表示させるマクロを作りたいのですが。。。
 >  可能でしょうか?


はい、もちろん可能です。さくらさん、リクエストありがとうございます。






―――――――――――――――――――――――――――――――――――
◆今日の講座
―――――――――――――――――――――――――――――――――――

┏━━▼ Lesson 107   --- 「リクエストガンガン特集」 ---
┃
┃   ・複数シートを検索して行の一覧を表示させるマクロ(その3)
┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━▲


前回は、IF文で条件が一致した行のデータを別のシート上に行コピーをして
貼りつける、というところまでを作りました。


それでは早速、前回作成したエクセルマクロ"gogo106.xls"をご用意ください。



※今回からはじめてご登録いただいた皆さんへ

上記ホームページにこのメルマガのバックナンバー(No105、No106)を公開して
いますので、まずはそちらから学習してみてください。(今回はその続きから
の内容になっています。)
    ◆Go!Go!ホームページ http://www.wat3d.com/gogo/




1)
まずはじめに、プログラムの中身の確認です。
――――――――――――――――――――――――――――+
1."gogo106.xls"を開きます。(セキュリティ確認画面が表示された
 場合には、[マクロを有効にする]を選んでください。)

2.マクロプログラムを表示します。
 [ツール(T)] → [マクロ(M)] → [Visual Basic Editor(V)]
――――――――――――――――――――――――――――+


++++++++++++++++++++++++++++―
Sub Macro1()
'
    For i = 1 To 10
        Range("A" & i).Select
        a = ActiveCell.Value
        If a = "みかん" Then
            Rows(i & ":" & i).Select
            Selection.Copy
            Sheets("Sheet2").Select
            n = Cells(Rows.Count, "A").End(xlUp).Row + 1
            Rows(n & ":" & n).Select
            ActiveSheet.Paste
        End If
    Next i
End Sub
++++++++++++++++++++++++++++―


これは、マクロの処理をIF文ではさみ込むことによって、a = "みかん"
という条件に一致した場合だけ、出力する一覧シートの"Sheet2"にその行を
行コピーによって順次書き出していくプログラムです。

が、前回の最後に実行した結果で分かるように、未だこのプログラムでは本
来の正しい結果は得られません。そこで、前回の最後に以下の問題を出題し
ましたので、今回はこの答え合わせからです。


Q.このプログラムを正しく動かすために必要な追加すべき処理とは
  いったい何でしょうか?

ヒントは、何かの処理を1行追加します。
ヒント2、それはシートの操作に関するものです。


みなさん、この答えはお解かりになりましたでしょうか?

今回の問題はけっこう難しかったかも知れませんが、これが解けた方はもう
立派にマクロの中級者レベルだ!と言えますので、まだ解いていなかったと
いう方は、ぜひ自分の実力診断のつもりで以下に進む前に考えてみてくださ
いね。



2)
それでは、その答え合わせを兼ねてプログラムの修正をします。
――――――――――――――――――――――――――――+
1.このプログラムの下方の「 End If 」の上に
 下記の1行を追加します。
      Sheets("Sheet1").Select
――――――――――――――――――――――――――――+

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

++++++++++++++++++++++++++++―
Sub Macro1()
'
    For i = 1 To 10
        Range("A" & i).Select
        a = ActiveCell.Value
        If a = "みかん" Then
            Rows(i & ":" & i).Select
            Selection.Copy
            Sheets("Sheet2").Select
            n = Cells(Rows.Count, "A").End(xlUp).Row + 1
            Rows(n & ":" & n).Select
            ActiveSheet.Paste
            Sheets("Sheet1").Select
        End If
    Next i
End Sub
++++++++++++++++++++++++++++―


ということで、
正解は「 Sheets("Sheet1").Select という1行を入れる。」でした。(なお、
追加する位置はこの場合 For文 の下でも構いません。どちらでも正解です。)

この「 Sheets("Sheet1").Select 」というのはもう言うまでもありませんが
シートを開く時の決まりの一文です。


いま、このマクロでは、"Sheet1"が入力側、"Sheet2"が出力側、というように
2つのシートを使い分けていますので、ループの中で行なっている入出力の度
に、開くシートを切り替えてやる必要がある。ということがこの問題を説く
ポイントです。

必要があって他のシートを開いて、そのシートに対する処理が終わった後は、
忘れずに元のシートを必ず開き直しておく、ということです。(でないと、
一度"Sheet2"を開いた以降の処理は、"Sheet2"からデータを取り込んでしまう
ことになるからです。)


エクセルの場合は、こうしたシート操作が非常に重要かつ頻繁ですから、初心
者の方で自分で作ったマクロがどうもうまく結果が出ない!?という場合には
シート操作がうまくやれていないケースというのが多く見うけられます。

逆に言うと、このシート操作さえ的確にできるようになってしまえば、マクロ
でエクセル上のデータを自動操作することは至って容易くなりますし、それに
は、このたった1行「 Sheets("シート名").Select 」を追加するだけですから
プログラムとしては至って簡単ですね。



3)
それでは、確認のために実行してみましょう。
――――――――――――――――――――――――――――+
1.エクセルの画面に戻って、まず実行する前にシート[Sheet2]を開いて
 このシートにいま表示されているデータを全て削除してください。

2.そうしたら次に、[Sheet2]の1行目に下記の見出しを入れておきます。
 まず、A1のセルに くだもの名 と打ってください。
 次に、B1のセルに NO と打ってください。
 (打ち終わったら一度[Enter]キーを押して、セルの入力モードを解除
 してください。)

3.シート[Sheet1]を開いてから、では実行します。
 [ツール(T)] → [マクロ(M)] → [マクロ(M)...] → マクロ画面が
 出るので、そのまま[実行]をクリック。
――――――――――――――――――――――――――――+


実行した結果、[Sheet2]にNo2とNo7の”みかん”2行が今度は正しく表示され
ていればOKです。


このように、シート操作(シート切り替え)の処理がちゃんとできさえすれば、
後はいつもやっているように細かな基本部分をちょい修正していくだけです。



4)
それでは、このプログラムにちょい修正を加えていきます。
――――――――――――――――――――――――――――+
1.Windows画面下方のタスクバーでプログラムの画面を表示します。

2.まず、プログラム最初の行
     For i = 1 To 10
 の上に、下記の1行を追加します。
     n = Cells(Rows.Count, "A").End(xlUp).Row

3.次ぎに、For文の行
     For i = 1 To 10
 を下記に書き改めてください。
     For i = 2 To n

4.次ぎに、先ほど追加した行
     n = Cells(Rows.Count, "A").End(xlUp).Row
 の上に、下記の1行を追加します。
     b = InputBox("検索したい果物名を入力してください。")

5.最後に、IF文の行
      If a = "みかん" Then
 を、下記に書き改めてください。
     If a = b Then
 ("みかん" の部分を b に直すだけです。)
――――――――――――――――――――――――――――+


修正した後のプログラムはつぎの様になります。


++++++++++++++++++++++++++++―
Sub Macro1()
'
    b = InputBox("検索したい果物名を入力してください。")
    n = Cells(Rows.Count, "A").End(xlUp).Row
    For i = 1 To n
        Range("A" & i).Select
        a = ActiveCell.Value
        If a = b Then
            Rows(i & ":" & i).Select
            Selection.Copy
            Sheets("Sheet2").Select
            n = Cells(Rows.Count, "A").End(xlUp).Row + 1
            Rows(n & ":" & n).Select
            ActiveSheet.Paste
            Sheets("Sheet1").Select
        End If
    Next i
End Sub
++++++++++++++++++++++++++++―


これは、もう何度もこの講座で繰り返しやっている見なれた修正だと思います
ので詳しい解説は割愛しますが、
 n = Cells(Rows.Count, "A").End(xlUp).Row
でデータの行数を取得して、見出し行を抜いた2行目からその行数まで
 For i = 2 To n
のループで繰り返し、インプットボックス
 b = InputBox("検索したい果物名を入力してください。")
で入力したデータと、
 If a = b Then
で一致するかを判定している。という内容になります。


これで、前回のプログラムが何個のデータにも対応し、また任意の入力文字列
を検索できて、結果を別シートに一覧表示するといったマクロになったという
ことになります。



5)
それでは、実行してみましょう。
――――――――――――――――――――――――――――+
1.まず、エクセルの画面に戻って、シート[Sheet1]を開いてください。

2.では、実行します。
 [ツール(T)] → [マクロ(M)] → [マクロ(M)...] → マクロ画面が
 出るので、そのまま[実行]をクリック。

3.すると、入力窓のあるポップアップ画面が表示されたと思いますので、
 その入力窓に以下の3文字

バナナ

 と入力して、このポップアップ画面にある[OK]ボタンをクリック。

4.同様に、もう一度実行します。
 [ツール(T)] → [マクロ(M)] → [マクロ(M)...] → マクロ画面が
 出るので、そのまま[実行]をクリック。

5.すると、入力窓のあるポップアップ画面が表示されたと思いますので、
 その入力窓に以下の3文字

すいか

 と入力して、このポップアップ画面にある[OK]ボタンをクリック。
――――――――――――――――――――――――――――+


実行した結果、[Sheet2]に先ほどの”みかん”の続きに、No4の”バナナ”と
No8の”すいか”が並んで表示されていればOKです。


それで、最初の回で言ったように今回のリクエストのマクロ作りには以下の
3つのポイントがありましたが、

 (1) 複数のシートから検索すること。
 (2) ヒットしたセルのある行の全てのデータを対象とすること。
 (3) その検索結果を一覧表示させること。

この内の(2)と(3)の部分については概ねこれで完成しましたので、次回は残る
(1)の「複数のシートから検索すること」について、今回のシート操作を踏ま
えて進めていきたいと思います。



今回はこれで終了です。
今日作ったマクロプログラムは次回もこの続きでまた使いますので、大切に
保管しておいてください。(ファイル名 "gogo107.xls" )




―――――――――――――――――――――――――――――――――――
◆次回の予告
―――――――――――――――――――――――――――――――――――

┏━━▼ Lesson 108   --- 「リクエストガンガン特集」 ---
┃
┃   ・複数シートを検索して行の一覧を表示させるマクロ(その4)
┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━▲



―――――――――――――――――――――――――――――――――――
◆編集後記
―――――――――――――――――――――――――――――――――――


今回も最後までお付き合いいただきまして、ありがとうございます。

北京オリンピックもいよいよ大詰めに入ってきましたが、四年に一度しかない
夢の祭典ですから、テレビ見始めちゃうと中々止まりませんよね。
私なんか結局、先週の夏休み中のほとんどをオリンピックのテレビ観戦に費や
してしまいました。^^;

期待していた女子マラソンは大変残念な結果に終わってしまいましたが、何と
言っても感動的だったのは、水泳の北島選手の100決勝後のインタビューで、
あの北島康介が、「超ー気持ちいいー」どころか「何も言えない」と声を詰ま
らせた姿は、何度見ても泣けてしまいました。

ほんとに金メダルというのは、取るまでの4年間より取ってからの期待され続
ける4年間というのがどんなに辛く険しい長い道のりであるのか。ということ
が、あの北島選手の涙からも窺い知るに余りありますね。

それにしても、しかし驚きだったのが男子陸上100mの決勝で最後欽ちゃん走
りで優勝して、世界新まで出したあのジャマイカのボルト選手の走りの凄さ
でした。真に驚きと衝撃と笑いと、いろんな意味でかつて無い歴史的なレース
が堪能できてよかったでした。

そんなこんなで、多くの感動を与えてくれたオリンピック選手の人達に、深い
感謝の気持ちと、自分も負けじと仕事やその他諸々「がんばらねば!」と思う
今日この頃です。
三太郎でした。



―――――――――――――――――――――――――――――――――――
◆筆者プロフィール
―――――――――――――――――――――――――――――――――――

1962年埼玉県生まれ
中央大学卒後、大手情報処理会社に就職し、プログラマー、SE、プロジェク
トマネージャーなどを経て、ITコンサルタントとして独立し、現在は、主に
エクセルを活用したITシステムの導入指導からシステム開発に至るまで幅広
く行なう、IT業界歴20年以上の大ベテランです。
その一方で、IT教育、人材育成にも力を入れ、富士通のSE育成研修メイン
講師、中小企業大学のC言語実習講師、CSKの研修講師などを歴任するIT
教育者の一人でもあります。IT業界の各方面に散らばる教え子の数は、かれ
これもうざっと6百人近くに達しています。訪れた客先やセミナーで「あら、
先生っ!」なんて教え子に声を掛けられることもしばしばです。^^; 




◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

   このメルマガ講座「Go! Go! エクセルマクロをはじめよう!」
   のご登録(無料)は、こちらから

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■




戻る