エクセル顧客管理
顧客一覧より顧客データを取得

Excelマクロを駆使したカスタマイズ可能なエクセル顧客管理、エクセルVBAの学習教材
公開日:2013年5月以前 最終更新日:2014-11-11

第8回.顧客一覧より顧客データを取得


エクセルで顧客管理を作ります、


これまでの感じはどうでしょうか、


本当は、ここまでの全てが理解出来ていれば、もう自分でどんどんプログラムを作れてしまうと思います。


つまり、全てが理解出来る人は、このブログを読んだりはしないと言う事です。


と言う事は、全ては理解出来ていないからこそ、読まれているのですよね。


でも、問題ありません。


プログラムが数学だとしたら、理解出来ない部分を残して、先に進むことは無理です。


しかし、プログラムは言語です。


私は英語が苦手です、英英辞典を使ったとしても、理解出来ないでしょう。


しかし、分からない単語を連鎖的に調べていくことを繰り返すうちに、


自然と力が付いてくるのではないかと思います。


子供が言葉を覚えるのと同じだと思います。



では、今回は、シート「顧客登録」に入力された、顧客番号で、


「顧客一覧」から該当の顧客データを取得し、「顧客登録」に表示してみましょう。


その前に、「顧客一覧」にデータを入力しておいて下さい、数行で良いでしょう。


以下のコードを、モジュール「Mod顧客登録」に追加して下さい。



Sub 顧客一覧より取得()
  Dim r1 As Long, c1 As Long '顧客一覧の見出しの行,列位置
  Dim r2 As Long, c2 As Long '顧客登録の行,列位置
  Dim rngFind As Range    'Findの結果保存
  
  Call マクロ開始処理
  
  r1 = 開始セル取得("顧客一覧").Row  '顧客一覧の開始行位置を取得
  c1 = 開始セル取得("顧客一覧").Column '顧客一覧の開始列位置を取得
  r2 = 開始セル取得("顧客登録").Row  '顧客登録の開始行位置を取得
  c2 = 開始セル取得("顧客登録").Column '顧客登録の開始列位置を取得
  
  '顧客番号が未入力は処理終了
  If IsEmpty(シート取得("顧客登録").Cells(r1, c1 + 1)) Then

    Call マクロ終了処理
    Exit Sub
  End If
  
  With シート取得("顧客一覧")
    '顧客登録の顧客番号で、顧客一覧の顧客番号を検索
    Set rngFind = .Range(.Cells(r1 + 1, c1), .Cells(r1 + .UsedRange.Rows.Count - 1, c1)) _
.Find(What:=シート取得("顧客登録").Cells(r2, c2 + 1), _
After:=.Cells(r1 + 1, c1), _
LookIn:=xlFormulas, _
LookAt:=xlWhole, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlNext, _
MatchCase:=False, _
MatchByte:=False)

    If rngFind Is Nothing Then '見つからなかった場合
      MsgBox "指定の" & シート取得("顧客登録").Cells(r2, c2) & "は存在しません。", vbOKOnly

      Call マクロ終了処理

      Exit Sub
    End If

    r1 = rngFind.Row '検索された行
    Do Until IsEmpty(.Cells(r1, c1)) '顧客一覧の見出し列の終わりまで
      '顧客登録←顧客一覧
      シート取得("顧客登録").Cells(r2, c2 + 1) = .Cells(r1, c1)
      c1 = c1 + 1 '顧客一覧の列を右に
      r2 = r2 + 2 '顧客登録の行を2つ下に
    Loop
  End With
  
  Call マクロ終了処理
End Sub




シート「顧客登録」の「顧客番号」に入力後、このマクロを起動すると、顧客データが表示されます。


マクロの実行方法

1.エクセルの画面に戻って、A1をクリアし

2.2003なら、「ツール」→「マクロ」→「マクロ」

  2007以降、「開発」→「マクロ」

  ショートカットは、Alt+F8です。

3.「Mod顧客登録」を選択し、「実行」

または、「Mod顧客登録」のコード中のどこでもよいので、カーソルを当てて、

メニューの「実行」、またはF5です。



Subモジュール「顧客登録シート作成」と、ほとんど似たようなものです。


プログラムは、使いまわし(再利用)が重要です。


逆に言えば、使いまわす事を考えて、コーディングすることが必要なのです。


If IsEmpty(シート取得("顧客登録").Cells(r1, c1 + 1)) Then

IsEmptyは前回までにも、説明無しで使っていたようです。

シート取得("顧客登録").Cells(r1, c1 + 1)) = ""

と同じです、好みでどちらでも良いです。


Exit Sub

Subモジュールを抜けます。

呼び出し元があれば、そこに戻ります、直接起動された場合は、マクロが終了します。


重要

Set rngFind = .Range(.Cells(r1 + 1, c1), .Cells(r1 + .UsedRange.Rows.Count - 1, c1)) _
.Find(What:=シート取得("顧客登録").Cells(r2, c2 + 1), _
After:=.Cells(r1 + 1, c1), _
LookIn:=xlFormulas, _
LookAt:=xlWhole, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlNext, _
MatchCase:=False, _
MatchByte:=False)

Findメソッド(オブジェクトに対する動作・操作)です。

検索対象.Find(What:=検索値, その他の名前付引数)

検索値で検索対象を検索し、一致するセルを返します。


名前付引数は多数あります、ただし全て省略可能です。

After:=検索を開始するセルを指定、省略時は左上端から

LookIn:=検索の対象。数式(xlFormulas)、値(xlValues)、 コメント(xlComments)

LookAt:=完全に同一なセルだけを検索(xlWhole)、一部分でも一致(xlPart)
SeachOrder:=検索方向を指定。列方向(xlByColumns)、行方向(xlByRows)

SearchDirection:=前方に検索(xlNext:規定値)、後方に検索(xlPrevious)
MatchCase:=大文字と小文字を区別する(True)、区別しない(False)
MatchByte:=半角と全角を区別する(True)、区別しない(True)
引数が多いので、省略できるものは省略して良いでしょう。

ただし、省略した場合、前回時の指定が引き継がれます。

また、エクセルでの検索にも影響を受けるので、極力指定して下さい。

一度書いてしまえば、コピーで使いまわせますので。


検索値が見つからない場合は、Nothingが返ってきます。

従って、.Find(・・・).Row等の記述はエラーが発生しますので、

上記のように、一度Rangeオブジェクトにいれて、Nothingの判定を行います。


Findメソッドはちょっと扱いが面倒にも思えます、他の方法もあります。

(余談ですが、VlooUpや配列を使う事もできますが、それはそれで面倒です。)

しかし、VBAを覚える上では必須ですので、覚える必要があります。


If rngFind Is Nothing

Findの結果を判定しています。

オブジェクトの比較には、=ではなく、Isを使用します。


MsgBox "指定の" & シート取得("顧客登録").Cells(r2, c2) & "は存在しません。", vbOKOnly
MsgBox(表示する文字列,ボタンの種類,タイトル,使用するヘルプ ファイル,コンテキスト番号)

表示する文字列以外は、省略可能です。

ボタンの種類を省略すると、vbOKOnlyになりますので、上記では省略可能です。

ボタンの種類は多数ありますので、ヘルプやネット検索してみて下さい。

ただし、「,」を入力した時点で、候補が表示されます。

この候補を見れば、分かりやすい名前になっていますので、その中から選択すれば済むはずです。

当然、この場合は、「OK」のボタンのみ表示されます。


r1 = rngFind.Row

Findで検索されたRangeオブジェクトから、行番号を取得しています。


これ以降は、Subモジュール「顧客登録シート作成」で使用した、

Do Untilの部分と同じです。


今回は、ここまで。


ほとんど、Findの説明だけで終わってしまいました。


しかし、利用頻度の高いので、しっかりと覚えましょう。


次回は、イベントの処理に入る予定です。



今回の復習

Find

MsgBox





同じテーマ「エクセル顧客管理」の記事

第5回.顧客登録のシートを作成(2)
第6回.ここまでの復習
第7回.本格的なプログラムへ
第8回.顧客一覧より顧客データを取得
第9回.イベントを使ってマクロを起動させる
第10回.コーディングとデバッグ
第11回.顧客登録より顧客一覧へ更新
第12回.最終行の判定、Rangeオブジェクトと配列、高速化の為に
第13回.コントロールのボタンを配置
第14回.オブジェクトとプロパティの真実(GW特別号No1)
第15回.記述による処理速度の違い(GW特別号No2)


新着記事NEW ・・・新着記事一覧を見る

VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)
スピらない スピル数式 スピらせる|エクセル雑感(2023-12-06)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ