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

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

第19回.納品書を作成、顧客情報を取得(2)


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


前回の続きです、


再度、エクセルのサンプル です、


実際のエクセルを見ながら確認して下さい。


まず、シート「納品書」です。


Excel VBA 解説

今回は、シート上部の、コンボボックスの機能説明になります。


コントロールの追加方法の詳細は、「第13回.コントロールのボタンを配置 」を参照して下さい。


エクセルで顧客管理を作ります、前回は、話が難しかったかもしれません、今回は簡単です、コントロールのボタンを配置して、マクロを割り当てます。「顧客一覧」から、新規登録する為に、「顧客登録」のシートへ移動する為に使用します。直接シート選択すれば良さそうですが、最終的には、シート名は非表示にすることになりますので。


コンボボックス


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

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

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

  「オブジェクト名」を「cmb顧客一覧」

  「ListRows」を20、これは、ドロップダウン時の行数なのでお好きな数値で


追加された「コンボボックス」をダブルクリック、または、「コードの表示」


このモジュールを以下のようにします。


Private Sub cmb顧客一覧_Change()
  Dim strSplit() As String
  If cmb顧客一覧.ListIndex < 0 Then
    Exit Sub
  End If
  strSplit() = Split(cmb顧客一覧.List(cmb顧客一覧.ListIndex), " , ")
  Range("納品書_顧客番号") = strSplit(0)
End Sub


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

Private Sub Worksheet_Activate()
  Dim ary1 As Variant
  Dim ary2() As String
  Dim r1 As Long, c1 As Long '顧客一覧の見出しの行,列位置
  Dim i1 As Long, i2 As Long

  r1 = 開始セル取得("顧客一覧").Row  '顧客一覧の開始行位置を取得
  c1 = 開始セル取得("顧客一覧").Column '顧客一覧の開始列位置を取得
  
  With シート取得("顧客一覧")
    ary1 = .Range(.Cells(r1, c1), .Cells(最終行取得(シート取得("顧客一覧")), c1 + 2))
  End With
  ReDim ary2(UBound(ary1, 1) - LBound(ary1, 1))

  For i1 = LBound(ary1, 1) To UBound(ary1, 1)
    For i2 = LBound(ary1, 2) To UBound(ary1, 2)
      If i2 = LBound(ary1, 2) Then
        ary2(i1 - LBound(ary1, 1)) = ary1(i1, i2)
      Else
        ary2(i1 - LBound(ary1, 1)) = ary2(i1 - LBound(ary1, 1)) & " , " & ary1(i1, i2)
      End If
    Next
  Next
  
  cmb顧客一覧.Clear
  cmb顧客一覧.List() = ary2
End Sub


上の2つのSubモジュールを作成します。



先に、

Private Sub Worksheet_Activate()

の説明をします。

これは、シートが選択された直後に動くイベントです。


「顧客一覧」より、「顧客番号」から3列分の情報を、" , "で、結合し、コンボボックスに表示します。


With シート取得("顧客一覧")
ary1 = .Range(.Cells(r1, c1), .Cells(最終行取得(シート取得("顧客一覧")), c1 + 2))
End With
「顧客番号」から3列分を、配列として、ary1に取り出します。


ReDim ary2(UBound(ary1, 1)-LBound(ary1, 1))

ary2には、3列を結合した文字列を格納します。

その為、まず、ary1の要素数に合わせて、配列の定義します。

このように、配列の要素を動的に決定する事を、動的配列と言います。

-LBound(ary1, 1)は、セル範囲から配列にした時、配列の先頭が、1から始まっているからです。

ary2には、0から入れる必要がありますので、このようにしています。

コンボボックスに設定する場合、0が空いていると、コンボボックスの1行目があいてしまうからです。


For~Next

ここでは、3列分のセル値を、" , "で、結合しています。


cmb顧客一覧.Clear

コンボボックスのリストをクリアします。


cmb顧客一覧.List() = ary2

先性された配列ary2を、コンボボックスのリストとして設定します。


以上で、シートを切り替えて、「納品書」を選択すると、コンボボックスに顧客の一覧が作成されます。



Private Sub cmb顧客一覧_Change()
これは、コンボボックスの選択が変更された時に起動されます。


If cmb顧客一覧.ListIndex < 0 Then

.ListIndexは、コンボボックスの選択された行インデックスが入ります。

先頭行は0になります。
コンボボックスが未選択の場合は、ListIndexは、-1です。

従って、未選択の場合は、処理を終了します。


strSplit() = Split(cmb顧客一覧.List(cmb顧客一覧.ListIndex), " , ")

コンボボックスから、顧客番号を取り出します。

先の、コンボボックス作成時に、" , "で結合しましたので、これを区切り文字として取り出します。

Split(文字列,区切り文字)

文字列を区切り文字で分割し、配列で返します。

配列は、要素0から作成されます。


Range("納品書_顧客番号") = strSplit(0)
「顧客番号」のセルに、先に取り出した、顧客番号をいれます。

これにより、コンボボックスで選択した顧客情報が表示されます。

コンボボックス選択→顧客番号に設定

これにより、前回、顧客番号の変更で自動で顧客情報を表示する部分が起動されます。

Subモジュールの流れは、

cmb顧客一覧_Change→Worksheet_Change

となります。



今回は、ここまでです。


続きは、次回に。


ちょっと駆け足すぎますね。


次回で、ボタンの説明が終わったら、要所の復習をする事にしましょう。


そうそう、プログラム内のコメントは止めました。


面倒だから・・・ウソ!


WEBで見ると、無い方がプログラムが読みやすいので。


また、コピペする人は、分かりづらい所に、自分なりのコメントを付けた方が、理解が進むと思いますので。


ではでは。





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

第16回.処理速度の向上はどこまでやれば良い(GW特別号No3)

エクセルで顧客管理を作ろう、ゴールデンウイーク特別号No3です、前回の「記述による処理速度の違い」が好評(本当に?)のようでしたので、再度、処理速度に関する内容をお届けします。実際に、作成中の顧客管理で処理速度対策を施してみます。具体的にどの処理を対策するかですが、以前から気になっていたのですが、「顧客一覧」でF1…
第17回.商品マスタを作成、2段階の可変リスト
エクセルで顧客管理を作ろう、GW特別号が続いたので、そろそろ本題のソフト作成を進めましょう。でも、技術解説していた方が楽しい気もしますが… これからも時々、やることにします。どうしても、ソフト作成の説明では、VBAそのものの解説がおろそかになってしまうので、それを補完する形で、特集で技術解説をしようと思います。
第18回.納品書を作成、顧客情報を取得(1)
エクセルで顧客管理を作成します、前回までで、顧客マスタ、商品マスタができましたので、いよいよ、売上関係の作成に入ります。呼び名は、売上伝票や納品伝票等々になりますが、名前は自由に変更可能なので、今回は「納品書」にしました。マイクロソフトテンプレートで直ぐにみつかったので(笑) 迷わず先頭のテンプレートをダウンロード…
第19回.納品書を作成、顧客情報を取得(2)
第20回.納品書を作成、顧客情報を取得(3)
エクセルで顧客管理を作成します、とうとう、20回まできました、では、前回の続き、3部作の最終です。再度、エクセルのサンプルです。実際のエクセルを見ながら確認して下さい。まず、シート「納品書」です。今回は、シート上部の、ボタンの機能説明になります。
第21回.イベント処理について
エクセルで顧客管理を作ります、前回で20回を達成しました、気張らず、気負わず、気を抜かず、これからも続けて行きます。今回は、特に前3回が駆け足で、説明不足であった事もあり、補足しつつ復習しましょう。その中でも、おそらく初心者が特に分かりづらいと思われるイベントについて説明します。
第22回.コントールについて
エクセルで顧客管理を作ります、今回は、コントロールについての、補足と復習です、マクロを作っても、起動方法がマクロの一覧からでは、ちょっと淋しいです。また、色々なコントロールを使えるようになれば、出来る事が増えてきます。まずは、この違いから。
第23回.納品書を作成、商品情報を取得(1)
エクセルで顧客管理を作ります、前回までで、「顧客番号」で、「顧客一覧」より情報取得が出来ました、今回は、明細部の「商品番号」で「商品マスタ」より情報取得します。今度は、複数行ですので、さらに難しくなります。本来なら、顧客番号で作成した、コードの使い回しをしたいところですが、別の方法にします。
第24回.納品書を作成、商品情報を取得(2)
エクセルで顧客管理を作ります、前回、、明細部の「商品番号」で「商品マスタ」より情報を取得しました、このコードを使って、「顧客番号」で「顧客一覧」より情報取得する部分を変更します。変更箇所は限定的です。コードの使い回しの参考にして下さい。
第25回.納品書を作成、商品情報を取得(3)
エクセルで顧客管理を作ろう、前回までで、「商品番号」で「商品マスタ」より情報を取得が一応できました、しかし、「顧客番号」で「顧客一覧」より情報取得の時のように、一覧を検索して、そこで選択した情報を取得するようにはなっていません。今回は、商品情報を取得3部作の最終です。
第26回.WorksheetFunctionについて
エクセルで顧客管理を作ります、今回は、予告通り、期待を裏切らずに、誰も期待してないかもしれないけど(笑)、やります…WorksheetFunctionについてです。VBAをやれば、必ず使用することになるでしょう。と言いますか、これを使わないと、エクセルの意味がなくなっちゃいますので。


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

TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(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)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門




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


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


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