いろいろと埋め込める事を紹介しました。
今回は実践編と言う事で、
シートの保護とセル結合を作ったbookに組み込んで行こうと思います。
今回の内容としては、
・ボタンを各所に埋め込む
・シート保護のパスワードを自前で用意する
・シート保護忘れ防止の処理を作る
この辺をまとめようと思います。
・セル結合ボタンをタブに埋め込む
もともとセル結合は、ホームタブ内の、配置グループにあるので、
マクロのセル結合もタブに設定した方が使い易いと思います。
前回記事を参考にタブに組み込んでみます。

リボンの▼から、その他のコマンドを選択してExcelのオプションを開きます。
開いたら、左メニューからリボンのユーザー設定を選択します。

コマンドの選択をマクロに切り替えて、セル結合_解除を表示します。
メインタブの項目にセル結合マクロを登録させたいのですが、
新しいタブにすると分かりにくいので、

ホーム内の、配置グループの下に、新しいグループを作成して、名前をマクロに変更します。
マクロ自体は、既存のグループに入れる事ができないので、
新しいタブか新しいグループを作る必要があります。
このグループにセル結合のマクロを追加します。

追加できたら、名前とアイコンを変更します。
追加したセル結合_解除を選択して、

名前をセル結合にして、赤枠のアイコンを設定します。
Excelのオプションを閉じて、ホームタブを見ると、

無事に追加されたので、シート上に設置してるボタンを削除します。
このセル結合ボタンで結合できるか確認します。
なぜかマクロのエラーが出る事があるので、確認作業を忘れない方がいいです。
・シート保護ボタンをユーザーフォームで作る
シートの保護ボタンは、
見える位置にボタンを設置すると、間違えて押されてしまう可能性が高いので、
パスワードでロックするなどの対策が必要になります。
しかし、マクロからパスワード設定をすると処理がややこしくなるので、
あまり使いたくないんですよ。( ノД`)シクシク…
そこで、保護ボタン自体をユーザーフォームで隠しておくようにすれば、
通常なら触られる事がなくなるので、解除されるトラブルも減らす事ができそうです。
ただ、ユーザーフォームを呼び出すボタンは、設定しておきたいので、
・呼び出しボタンを分かりにくくする
・パスワードフォームを作る
・パスワードフォームからシート保護を呼び出す
こんな処理に変更します。
まず、呼び出しボタンを押したら開く、パスワード入力のフォームを作ります。
VisualBasicを開いて、フォームフォルダを右クリックします。

メニューから挿入→ユーザーフォームをクリックします。
フォルダの中にUserFoam1ができるので選択すると
右のエディターにユーザーフォームが表示されます。
パスワード入力と言う事で、

パスワード入力用のテキストボックスと入力ボタンを作成します。
テキストボックスの色が黄色になってますが、プロパティのBackColorを変更してます。
テキストボックスをパスワード入力用に変更したいので設定を考えます。
・入力時に*印で見えなくする
・半角英数のみ入力できる
・文字を中寄せにする
こんな感じの設定で、パスワードっぽくなります。
手動でも設定できますが、
折角なんで、マクロから設定してみます。
コーディングなんですが、
標準モジュールは使わずにUserFoam1のモジュールを使います。
マクロに慣れてない方は、
この辺が分かりにくいと思うので軽く説明しておきます。
標準モジュールは、Book内のどこからでも使える、共用できるモジュールになります。
VBAを始めた頃は、モジュールってこれだけしかないように思っていたのですが、
実は、パーツ毎に個別のモジュールが存在しています。
book、シート、オブジェクト(部品)、これらには個別のモジュールが用意されています。
個別のモジュールと言う事で、そのパーツだけで使えるモジュールになります。
別に標準モジュールだけでも作れるやん!( ̄~ ̄;) ウーン
と思いがちなんですが、パーツ毎のモジュールには便利な点があります。
パーツ固有のコマンドが使用できる点です。
これがかなり便利なので、ぜひ使って見て下さい。
話が脱線しましたが、UserFoam1に戻ります。
UserFoam1のモジュールって、どこにあるの?なんですが、
UserFoam1を選択して、右クリックします。

コードの表示があるので、クリックするとUserFoam1モジュールが開きます。
部品毎にコーディングする場合は、部品を右クリックでコード表示すると
個別のモジュールを開く事ができます。
モジュールが開くと

既にプロシージャが書き込まれてますが、UserForm_Clickとなってます。
これが部品が持つ、固有のコマンドになります。
今回は、UserFoam1が開いたら、
自動的にテキストボックスの設定をパスワード用に設定できるようにします。

コマンド選択からInitializeを選択します。
Initializeは、部品が呼び出された時に発動するコマンドです。
UserFoam1が開くと同時に実行してくれるプロシージャになります。
要らなくなった、UserForm_Clickプロシージャは消してしまいます。
UserFoam1モジュール
Private Sub UserForm_Initialize()
With TextBox1
.TextAlign = fmTextAlignCenter
.PasswordChar = "*"
.IMEMode = fmIMEModeOff
End With
End Sub
テキストボックスの初期設定を行います。
設定内容は、上から順に、
・文字中央
・入力時の表示文字
・日本語入力をOFF
ちなみにTextBox1は、テキストボックスのオブジェクト名です。
この設定は、手動でもできます。
TextBox1を選択して、プロパティを見て行きます。
・TextAlign
・PasswordChar
・IMEMode
各項目があるので、そこで設定しておけばUserFoam1のInitializeは必要なくなります。
これでパスワード入力欄ができたので、
続てい、シート保護・解除ボタンを用意します。
フォームフォルダを右クリックして、挿入→ユーザーフォームで
新しくUserFoam2を作ります。

ラベルとボタンを追加します。
ラベルを追加したのは、シートの状態を表示できるようにする為です。
ボタンは、実質のシート保護・解除ボタンになります。
UserFoam2のCaptionをシート管理に変更しておきます。
シート保護ボタンが準備できたので、UserFoam1に戻って、
パスワード入力ボタンのコーディングを行います。
UserFoam1のボタンを右クリック

パスワード入力ボタンモジュールを開きます。
ボタンモジュール
Private Sub CommandButton1_Click()
Const pass As String = "1234"
With TextBox1
If .Value = pass Then
UserForm2.Show vbModeless
Unload UserForm1
Else
MsgBox "パスワードが違います。" & vbCrLf & _
"再入力してください", vbCritical
'テキストボックスの初期化'
.Value = vbNullString
.SetFocus
End If
End With
End Sub
Constで設定したpassがパスワードです。
テキストボックスの中身と比較して、パスワードが合っていれば、
UserFoam2をモードレスで呼び出します。
パスワードFoamは必要なくなるんで閉じます。
パスワードが違った場合ですが、間違いのメッセージを出します。
メッセージを出した後に、テキストボックスの入力文字を削除して、
カーソルが外れてるので、SetFocusでテキストボックスにカーソルを戻します。
これでパスワード入力のコーディングができたので、
呼び出しボタンを用意します。
・呼び出しボタンをリボンに埋め込む
パスワードFoamを呼び出す為のコードを準備します。
呼び出しボタンは、リボンに埋め込むので標準モジュールに作成します。
標準モジュール
Sub パスワードFoam呼び出し()
UserForm1.Show vbModeless
End Sub
ただ呼び出すだけのコードです。
ただ注意点として、モードレスで呼び出しています。
次に呼び出すUserFoam2は、モードレスで呼び出したいのですが、
UserFoam1をモーダルで呼び出すと、UserFoam2もモーダルでしか呼び出せなくなります。
なので、UserFoam1もモードレスで呼び出しています。
マクロが組めたので、リボンに登録します。
リボンの▼を開いて、その他のコマンドからExcelのオプションを開きます。

クイックアクセスツールバーを選択して、コマンドの選択をマクロにします。
コーディングした、パスワードFoam呼び出しを

右枠に追加します。
追加されたパスワードFoam呼び出しを選択して変更をクリックします。

アイコンを警告マークや、✕マークに変更します。
設定できたらExcelのオプションを閉じて、リボンを確認します。

ボタンの存在が目立たなく、警告マークや✕マークにする事で
押される事も減るのではないでしょうか。
これで、パスワード呼び出しができるようになったので、
試運転してみます。

無事に呼び出せています。
続いて、パスワード間違いで入力してみます。

入力間違いも機能しています。ヽ(´▽`)/~♪
ここまで来れば最後の仕上げをします。
VisualBasicに戻って、UserFoam2を開きます。
まず、UserFoam2には、シート状態を表示するラベルを設定しています。
これは、セルに表示していた保護状態を、フォームで見れるようにする物です。
この表示は、フォームを開いた時、シート保護・解除ボタンを押した時、
それぞれで更新する必要があります。
そうすると、フォームモジュールとボタンモジュールに、
同じコーディングをする必要があります。
しかし、二つも同じプロシージャを作るのは面倒ですよね~ ヽ(´~`;)ウーン
そこで、標準モジュールにラベル書き換えのプロシージャを作ります。
後は、フォームを開いた時とボタンを押した時に、
このプロシージャを呼び出せば、同じ処理が行えます。
なので、標準モジュールにラベル書き換えのプロシージャを作ります。
標準モジュール
Sub ProtectedState()
Const protect As String = "保護中"
Const unProtect As String = "解除中"
With UserForm2
If ActiveSheet.ProtectContents = True Then
.Label1.Caption = protect
.Label1.BackColor = RGB(153, 204, 0)
Else
.Label1.Caption = unProtect
.Label1.BackColor = RGB(255, 255, 0)
End If
End With
End Sub
簡単に説明すると、
シート保護中ならラベルに”保護中”の文字、背景を緑色に設定。
解除中ならラベルに”解除中”の文字、背景を黄色に設定。
こんな感じで作っておきます。
UserFoam2を開いたら、このプロシージャを呼び出します。
UserFoam2のモジュールに開いた時のプロシージャを作ります。
UserFoam2モジュール
Private Sub UserForm_Initialize()
Call ProtectedState
End Sub
フォームを開いた時なんで、Initializeコマンドを使います。
他のプロシージャを実行する時は、Call プロシージャ名で呼び出す事ができます。
ただし、個別のモジュールにあるプロシージャは呼び出しにくいので、
共有するプロシージャは、標準モジュールに格納しておくといいと思います。
フォームが開いた時の処理ができたので、ボタンの処理を作ります。
シート保護・解除で作った”シート保護機能”プロシージャがあるので、
修正して、流用したいと思います。
標準モジュール
Sub シート保護機能()
With ActiveSheet
If .ProtectContents = True Then
.unProtect
Else
.protect AllowFormattingCells:=True, _
UserInterfaceOnly:=True
.EnableSelection = xlUnlockedCells
End If
End With
End Sub
セルの状態表示を削除、パスワードも解除しました。
ずいぶんとスッキリしました。
これで、シートの保護と解除だけのマクロになったので、
UserFoam2のボタンを押した時に、呼び出せるようにします。
保護・解除ボタンモジュール
Private Sub CommandButton1_Click()
Call シート保護機能
Call ProtectedState
End Sub
シート保護機能を呼び出します。
当然、状態が更新されるので、状態表示もコールしておきます。
これで、ボタンを押す度にシート保護と表示が実行されるようになります。
後は、要らなくなったシート上の、ボタンと表示を削除すれば終了と言いたい…
…
…
ダメです。
UserFoam2が閉じると、シートの保護状態が分からなくなります。
解除したまま、UserFoam2を閉じると保護を忘れる可能性があるので、
閉じる時に確認できるように設定します。
UserFoam2のモジュールを開きます。
コマンドから閉じる時の選択をして、プロシージャを追加します。
UserFoam2モジュール
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Dim br As VbMsgBoxResult
If ActiveSheet.ProtectContents = False Then
br = MsgBox("保護できてませんが" & vbCrLf & _
"閉じますか?", vbYesNo + vbExclamation)
If br = vbNo Then
Cancel = True
End If
End If
End Sub
説明すると、
QueryCloseってのが、閉じる時のコマンドです。
フォームの右上の✕ボタンを押すと同時に呼び出されるコマンドになります。
閉じる時の状態が、シート解除中ならメッセージボックスを開く設定にしました。
メッセージボックスは、yes・noボタンを設定できます。
vbYesNoが設定になります。
vbExclamationは、警告マークをメッセージボックスに表示させる設定です。
この警告が開くと

こんな感じで表示されます。
警告の”はい”を押したら、そのまま警告とUserFoam2の両方が閉じます。
なので、シート解除のままシートに戻ります。
警告の”いいえ”を押したら、警告メッセージが消えて、
UserFoam2は、残ったままになります。
この警告で、シート保護をしないとUserFoam2を閉じられないようにもできるのですが、
解除状態がUserFoam2が出たままでは、問題になるような事があるといけないので、
一応、通常解除も設定しました。
警告が出る事で、保護忘れを防ぐ機能はあると思います。
ボタンの配置実践と言う事で、シート上以外の所に配置してみましたが、
割と上手く溶け込ませる事ができたんじゃないでしょうか。
ボタンを上手く隠したい方の参考にでもなれば幸いでっす。
ボタン配置の記事は、これで終わりにしたいと思います。
それでは、よりよきExcelライフを。
( ^ 0 ^ )/~~~~see you again
×
この広告は90日以上新しい記事の投稿がないブログに表示されております。
この記事へのコメント