エクセル顧客管理 | 第8回.顧客一覧より顧客データを取得 | Excelマクロを駆使したカスタマイズ可能なエクセル顧客管理、エクセルVBAの学習教材



最終更新日: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






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

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

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

SUMIFの間違いによるパフォーマンスの低下について|エクセル関数超技(6月17日)
条件式のいろいろな書き方:TrueとFalseの判定とは|ExcelマクロVBA技術解説(6月15日)
空白セルを正しく判定する方法2|ExcelマクロVBA技術解説(5月6日)
フルパスをディレクトリ、ファイル名、拡張子に分ける|ExcelマクロVBA技術解説(4月15日)
テキストボックスの各種イベント|Excelユーザーフォーム入門(4月9日)
フォルダ(サブフォルダも全て)削除する、Optionでファイルのみ削除|ExcelマクロVBAサンプル集(4月4日)
最後の空白(や指定文字)以降の文字を取り出す|エクセル関数超技(3月26日)
先頭の数値、最後の数値を取り出す|エクセル関数超技(3月26日)
Excelファイルを開かずにシート名をチェック|ExcelマクロVBAサンプル集(3月23日)
数式の参照しているセルを取得する|ExcelマクロVBAサンプル集(3月18日)

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

1.最終行の取得(End,Rows.Count)|ExcelマクロVBA入門
2.RangeとCellsの使い方|ExcelマクロVBA入門
3.徹底解説(VLOOKUP,MATCH,INDEX,OFFSET)|エクセル関数超技
4.Range以外の指定方法(Cells,Rows,Columns)|ExcelマクロVBA入門
5.変数とデータ型(Dim)|ExcelマクロVBA入門
6.セルのコピー&値の貼り付け(PasteSpecial)|ExcelマクロVBA入門
7.セルの参照範囲を可変にする(OFFSET,COUNTA,MATCH)|エクセル関数超技
8.ひらがな⇔カタカナの変換|エクセル基本操作
9.定数と型宣言文字(Const)|ExcelマクロVBA入門
10.CSVの読み込み方法|ExcelマクロVBAサンプル集



  • >
  • >
  • >
  • 顧客一覧より顧客データを取得

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


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

    ↑ PAGE TOP