エクセル顧客管理
納品書を作成、商品情報を取得(3)

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

第25回.納品書を作成、商品情報を取得(3)


エクセルで顧客管理を作ろう、


前回までで、「商品番号」で「商品マスタ」より情報を取得が一応できました、


しかし、「顧客番号」で「顧客一覧」より情報取得の時のように、


一覧を検索して、そこで選択した情報を取得するようにはなっていません。


今回は、商品情報を取得3部作の最終です。


明細部にボタンを付けて、「商品マスタ」へ移動し、そこで選択できるようにします。


前回同様に、エクセルのサンプル をアップします。

ダウンロード用の別サイトが表示されます。


さて、まず言い訳をする必要があります。


第22回.コントールについて 」、ここで私は、


エクセルで顧客管理を作ります、今回は、コントロールについての、補足と復習です、マクロを作っても、起動方法がマクロの一覧からでは、ちょっと淋しいです。また、色々なコントロールを使えるようになれば、出来る事が増えてきます。まずは、この違いから。


作成中のエクセルでは、「ActiveX コントロール」のみ使用します。


と言い切ってしまいました。


すみません、今回は「フォーム コントロール」の「ボタン」を使用します。


明細行にボタンを付ける事を忘れていました。


「ActiveX コントロール」では、ボタン毎にSubモジュールが必要になってしまい、ちょっと不便です。


「フォーム コントロール」のボタンなら、1つのSubモジュールで済みますし、


ボタンのコピペだけで増やす事ができるのです。



シート「商品マスタ」にコンボボックスを作ります


コンボボックスの追加方法は何回かやりましたが、

1.2003なら「コントロールツールボックス」、2007以降なら「ActiveXコントロール」

  の「コンボボックス」を適当な位置に追加して下さい。

2.プロパティを変更する

  「オブジェクト名」を「cmbシート名」

このコンボボックスには、コードを入れません。

選択を変更しても何もすることがないからです。


コンボボックスにリストを追加します


シート「商品マスタ」のシートモジュールに以下を追加します。

Private Sub Worksheet_Activate()
  Dim ary As Variant
  ary = シート取得("設定").Range("シート名")
  cmbシート名.Clear
  cmbシート名.List() = ary
End Sub


シート「設定」のシート名を、配列に取り出し、その後、コンボボックスのListに入れています。


これは、「顧客一覧」と全く同一です。

標準モジュールを作り、それをCallするようにすれば、

「商品マスタ」と「顧客一覧」で共通に使えるのですが、

行数が短いので、コピペで済ませました。

今後、さらに増えるようなら、標準モジュールに作成します。



シート「商品マスタ」で、F1押下時の処理を追加します


「Mod共通」の「ファンクションF1」に以下を追加します。

Sub ファンクションF1()
  Dim varWork As Variant

  Select Case True
    Case ActiveSheet Is シート取得("商品マスタ")
      Select Case ActiveSheet.cmbシート名.Text
        Case シート取得("納品書").Name
          If Not IsEmpty(Cells(ActiveCell.Row, 開始セル取得("商品マスタ").Column)) And _
            ActiveCell.Row > 開始セル取得("商品マスタ").Row Then
            varWork = Cells(ActiveCell.Row, 開始セル取得("商品マスタ").Column)
            シート取得("納品書").Select
            ActiveCell = varWork
          End If
      End Select


太字が追加する部分です。


商品番号の入力されている行のセルが選択されている状態で、

F1が押下された場合に、「納品書」のアクティブなセルに商品番号を設定します。

ActiveCellを取得するには、そのシートをActiveにする必要があります。

従って、varWork = Cells(ActiveCell.Row, 開始セル取得("商品マスタ").Column)
で、「商品マスタ」のアクティブ行の商品番号を変数ヘ一旦入れておき、

シートを「納品書」に変更後に、この変数をアクティブセルへ入れています。


これはいかにも面倒なのですが、直接入れる事ができません。

できれば、WorkSheets(1).Activecell = WorkSheets(2).Activecell

のように記述したいところなのですが、

WorkSheetsにActivecellのプロパティが無いのです。

何かExcelとして、都合の悪い事があるのかもしれません。



標準モジュールを追加します


「挿入」→「標準モジュール」ですね、

プロパティで「Mod納品書」にオブジェクトを変更して下さい。

今後、「納品書」に関する、標準モジュールはここに記述していきます。


このように、なるべく処理内容毎に、標準モジュールは分けて作成することをお勧めします。


以下のSubモジュールを追加します。



Sub 商品検索()
ActiveSheet.Shapes(Application.Caller).TopLeftCell.Select
Call 商品マスタへ(ActiveSheet.Name)
End Sub


今回のメインの内容です。


Application.Callerは、このプロシージャーの呼び元の名前が入っています。

ここでは、ボタンの名称になります。

ActiveSheet.Shapes(ボタンの名称)で、ボタンそのものになります。

.TopLeftCellは、そのボタンが属するセルの左上のセルです。

そして、そのセルをSelectしています。

つまり、クリックしたボタンが含まれるセルをアクティブにしています。


シート「納品書」に「フォーム コントロール」の「コマンド ボタン」を作成


1.2003なら「フォーム」、2007以降なら「フォーム コントロール」

  の「ボタン」を商品番号の入力セルに追加して下さい。

  セルからはみ出さないようにして下さい。

2.ボタンの文字を変更します。

  「ボタン1」等になっていますので、「検索」にして下さい。

  ボタンの文字なので、自由な文字で結構です。

3.「マクロの登録」で、

  一覧より、「商品検索」を選択し、「OK」

4.このボタンをコピーし、他の行に貼り付けて下さい。

  ボタンは一度選択状態が解除されると、左クリックでは選択できません。

  右クリックで選択することができます。



以上で完成です。


どうですか、全てのボタンの処理が、たった2行の記述で終わりです。


この為に、今回は、「フォーム コントロール」を使用しました。


これで、


「納品書」でボタンクリック

「商品マスタ」へ移動

商品を選び、当該行のセルを選択し、F1

「納品書」のボタンをクリックした行の商品番号が設定されます。

商品情報が表示されます。


以上の機能が完成しました。



ただし、問題が1つあります。

フォームのボタンは、マウスポインタが指定できないのです。

ActiveXは、指定できますけど、ハンドは標準ではできません。

カスタムで指定しないと・・・

結局バラバラ、まあ、とりあえずは良しとしましょう。



これで、商品情報を取得の3部作が終了です。


次回は、WorksheetFunctionについて書く予定です。





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

第22回.コントールについて
第23回.納品書を作成、商品情報を取得(1)
第24回.納品書を作成、商品情報を取得(2)
第25回.納品書を作成、商品情報を取得(3)
第26回.WorksheetFunctionについて
第27回.RangeとCellsの深遠
第28回.納品書データをデータベース化(1)
第29回.納品書データをデータベース化(2)
第30回.配列の使い方について
第31回.売上一覧(伝票合計の一覧)を作成(1)
第32回.売上一覧(伝票合計の一覧)を作成(2)


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

ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
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)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門




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


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


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