エクセル顧客管理
第35回.メニューを作成

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

第35回.メニューを作成


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


エクセルも大分出来てきましたので、シート見出しを頼りに移動しているのは不便です、


今回はメニューを作成します。


以下が作成したメニューです。


Excel VBA 解説


いろいろ、機能が増えていますが、プログラムは「納品書」とほぼ同様です。


次回、エクセルをアップしますので、確認して下さい。


メニューの作り方


ボタンを配置すれば終了です(笑)


いや、本当に、ボタンを配置して、Clickイベントで、当該シートへ移動すれば良いのです。


でも、それだけでは面白くないので、少し細工を施します。



ワークブックモジュールの「Workbook_Open」を以下にします。




Private Sub Workbook_Open()
  Application.OnKey "{F1}", "ファンクションF1"
  Call シート移動("メニュー")
  シート取得("メニュー").ScrollArea = "$A$1:$F$14"
  ActiveWindow.DisplayHeadings = False
  ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
  ActiveWorkbook.Saved = True
End Sub


Application.OnKey "{F1}", "ファンクションF1"

これは元々入れてあった、F1押下時に、プロシージャーを起動するものです。

Call シート移動("メニュー")

指定シートに移動し、他のシートは非表示にするモジュールです。

後述します。


シート取得("メニュー").ScrollArea = "$A$1:$F$14"

指定範囲のみスクロール可能ににします。

スクロール不可の範囲は、セルの選択も出来なくなります。


ActiveWindow.DisplayHeadings = False
行列の見出しを非表示にします。


ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False

シート保護です。


ActiveWorkbook.Saved = True

ブックを保存済状態にします。

この後、何らかの変更がブックに加えられると、Falseになります。

つまり、ブックを開いた直後は、変更無しの状態にしています。

これが無いと、Workbook_Openが動作していますので、何も変更していなくても、

未保存状態になってしまい、閉じる場合に、保存確認が表示されます。



次に、上に出てきた、「シート移動」です。


Sub シート移動(ByVal strSht As String)
  Dim sht As Worksheet
  
  Application.EnableEvents = True
  シート取得(strSht).Visible = True
  シート取得(strSht).Select
  Application.EnableEvents = False
  For Each sht In ActiveWorkbook.Worksheets
    If Not sht Is ActiveSheet Then
      sht.Visible = False
    End If
  Next
  Select Case ActiveSheet.Name
    Case シート取得("顧客一覧").Name, シート取得("商品マスタ").Name
      Dim ary As Variant
      ary = シート取得("設定").Range("シート名")
      ActiveSheet.cmbシート名.Clear
      ActiveSheet.cmbシート名.List() = ary
      Application.MoveAfterReturnDirection = xlDown
    Case シート取得("顧客登録").Name, シート取得("事跡登録").Name
      Application.MoveAfterReturnDirection = xlToRight
    Case Else
      Application.MoveAfterReturnDirection = xlDown
  End Select
  Application.EnableEvents = True
End Sub


各シートに、タイトルを入れると見やすいのですが、わざわざタイトル表示も面倒なので、

代わりに、シート見出しを使います。

アクティブシート以外は非表示にし、アクティブシートのシート名のみ表示された状態にします。


Application.EnableEvents = True
シート取得(strSht).Visible = True
シート取得(strSht).Select
Application.EnableEvents = False
イベントを有効にしているのは、各シートの「Worksheet_Activate」を有効にするためです。

Visible = Trueで表示し、Selectしています。


For Each sht In ActiveWorkbook.Worksheets
  If Not sht Is ActiveSheet Then
    sht.Visible = False
  End If
Next
現在のシート以外は、全て非表示にしています。


Select Case ActiveSheet.Name

シート毎に、必要な初期処理を記述する為です。


Application.MoveAfterReturnDirection = xlToRight
「Enter」時の移動を、右に移動するように設定しています。

「顧客登録」では、EnabledSelectionをxlUnlockedCellsに設定し、シート保護しています。

この場合、セルロックしていないセルのみ移動できるようになっていますが、

セル結合しており、結合数もバラバラなので、「Enter」で、下に移動しない場合が発生します。

この為、右移動で下に移動させる為です。(右側に有効セルがないので、下に移動します)



各シートには、メニューへ移動する為のボタンを配置します。


これで、ちょっとしたアプリっぽくなりました(笑)


さらに、ちょっとしたお遊びです。


「Workbook_Open」に「ActiveWorkbook.Saved = True」を入れた理由です。


ワークブックモジュールに以下を追加します。




Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Dim rtn As Integer
  If ActiveWorkbook.Saved = False Then
    rtn = MsgBox("あれ、保存してないですよね?" & vbLf & vbLf & _
          "この後「いいえ」とか押したら大変ですよ。" & vbLf & vbLf & _
          "「終了」ボタンを使いましょうね。" & vbLf & vbLf & _
          "保存しちゃっても良いですか?", vbYesNo, "確認")
    If rtn = vbYes Then
      ActiveWorkbook.Save
    End If
  End If
End Sub


メニューの終了ボタンを使わなかった場合のメッセージです。


ただし、ブックを開いた直後や、保存直後はメッセージが表示されません。


これを判定しているのが、

If ActiveWorkbook.Saved = False Then
です。

ActiveWorkbook.Savedは、ブックに変更があった場合に、Falseになります。

保存した場合は、Trueになります。

この為に、「Workbook_Open」でTrueにしたのです。



どうでしょう。


大分それらしくはなってきました。


当初の予定機能で、未実装がまだありますが、本シリーズは、次回で一旦終了する予定です。


次回は全体の解説と、現時点でのエクセルも次回アップします。





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

第28回.納品書データをデータベース化(1)
第29回.納品書データをデータベース化(2)
第30回.配列の使い方について
第31回.売上一覧(伝票合計の一覧)を作成(1)
第32回.売上一覧(伝票合計の一覧)を作成(2)
第33回.売上一覧より納品書を作成
第34回.伝票番号の自動採番機能を追加
第35回.メニューを作成
第36回.最終回
その後№1、CSV出力を追加
その後№2、ベクター掲載


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

多階層フォルダ(ディレクトリ)の作成|VBAサンプル集(7月31日)
VBAのインデントについて|VBA技術解説(7月16日)
「VBA Match関数の限界」についての誤解|エクセル雑感(7月15日)
省略可能なVariant引数の参照不可をラップ関数で利用|VBA技術解説(7月12日)
100桁の正の整数値の足し算|エクセル雑感(7月9日)
LSetとユーザー定義型のコピー(100桁の足し算)|VBA技術解説(7月9日)
Variant仮引数のByRefとByValの挙動違い|エクセル雑感(7月5日)
Variant仮引数にRange.Valueを配列で渡す方法|エクセル雑感(7月5日)
Variantの数値型と文字列型の比較|エクセル雑感(7月1日)
VBAのVariant型について|VBA技術解説(6月30日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.マクロって何?VBAって何?|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




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


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



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