お世話になります。
ExcelVBAで、コマンドバーの類を全て消去した後に残る、
空白部分ができる原因が解りません。
この部分をダブルクリックすると、エラーになって強制終了に
なってしまいます。
完全に消してしまいたいのですが、この状況になってしまう、
原因と対策を教えてください。
内容は、『システム』という名のシートにある『ロック』ボタンを
押すと、コマンドバーを全て消去して、Sheet1に切り替わるといった
流れです。
↓モジュール側
-------------------------------------------------------------
Dim myCB As CommandBar
Public Sub onCmdBarAttr()
DoEvents
With Application
For Each myCB In Application.CommandBars
myCB.Enabled = True
Next myCB
.CommandBars("Standard").Visible = True
.CommandBars("Formatting").Visible = True
.CommandBars("Visual Basic").Visible = True
.CommandBars("Worksheet Menu Bar").Enabled = True
.CommandBars("CELL").Enabled = True
' タスクバーに表示させる
.ShowWindowsInTaskbar = True
' 数式バーを表示
.DisplayFormulaBar = True
' ステータスバーを表示
.DisplayStatusBar = True
End With
End Sub
Public Sub offCmdBarAttr()
Dim myCB As CommandBar
On Error Resume Next
For Each myCB In Application.CommandBars
myCB.Enabled = False
Next myCB
On Error GoTo 0
With Application
.CommandBars("Worksheet Menu Bar").Enabled = False
.CommandBars("CELL").Enabled = False
' 数式バーを消去
.DisplayFormulaBar = False
' ステータスバーを消去
.DisplayStatusBar = False
' タスクバーに表示させない
.ShowWindowsInTaskbar = False
End With
End Sub
' シートロック
Public Sub protectSheet(ByVal stSheetName As String)
Application.ScreenUpdating = False
' 一旦シート保護をかけ直す
With Worksheets(stSheetName)
.Activate
.Unprotect
.Protect UserInterfaceOnly:=True
' カーソルの移動範囲を設定する
.ScrollArea = "$A$1"
' 左上セルを選択
.Range("H16").Select
' 保護されたセルは選択不可にする
.EnableSelection = xlNoRestrictions
End With
Application.ScreenUpdating = True
End Sub
' シートロック解除
Public Sub unprotectSheet(ByVal stSheetName As String)
' 一旦シート保護をかけ直す
With Worksheets(stSheetName)
.Unprotect
' スクロール範囲を解除する
.ScrollArea = ""
' 保護されたセルでも選択可能にする
.EnableSelection = xlUnlockedCells
End With
End Sub
Public Sub setBookAttribute(ByVal bFlg As Boolean)
With Windows(ThisWorkbook.Name)
' タブを設定
.DisplayWorkbookTabs = bFlg
' スクロールバーを設定
.DisplayHorizontalScrollBar = bFlg
.DisplayVerticalScrollBar = bFlg
' グリッドを設定
.DisplayGridlines = bFlg
' 行列数表示を設定
.DisplayHeadings = bFlg
End With
End Sub
↓シート側
------------------------------------------------------
Private Sub btnProtect_Click()
' アプリケーション全体の処理
Call Module1.offCmdBarAttr
' シート単位の処理
Call Module1.protectSheet("Sheet1")
' ブック単位の処理
Call setBookAttribute(False)
Worksheets("Sheet1").Activate
End Sub
Private Sub btnUnprotect_Click()
Call Module1.onCmdBarAttr
Call Module1.unprotectSheet("Sheet1")
Call setBookAttribute(True)
End Sub
以上、よろしくお願いいたします。
No.7ベストアンサー
- 回答日時:
前述した私の環境と[vista/xl2000SR1]の環境では
・[フォーム]のボタンを使う
・ActiveCell.Selectを入れる
・TakeFocusOnClick=False
それぞれで解消できます。
なので、もしかしたら現象がちょっと違うかも。
(違うというより、+αでPosition = msoBarFloatingのCommandBarがある?)
だとすると、CommandBarを仕舞う処理を最後に(ScreenUpdating = Trueの後に)
持ってくると良いでしょう。
念のためbtnProtectのプロパティでTakeFocusOnClickをFalseにして、
Private Sub btnProtect_Click()
Call Module1.protectSheet("Sheet1")
Call setBookAttribute(False)
'この処理を最後に
Call Module1.offCmdBarAttr
Worksheets("Sheet1").Activate
End Sub
offCmdBarAttrの内容は以下。
Public Sub offCmdBarAttr()
Dim myCB As CommandBar
With Application
.ScreenUpdating = False '不要と思う。
.DisplayFormulaBar = False
.DisplayStatusBar = False
.ShowWindowsInTaskbar = False
.ScreenUpdating = True
'以下の処理を最後に
On Error Resume Next
For Each myCB In .CommandBars
'myCB.Visible = False
myCB.Enabled = False
Next myCB
On Error GoTo 0
End With
End Sub
#元コードの
#.CommandBars("Worksheet Menu Bar").Enabled = False
#.CommandBars("CELL").Enabled = False
#これは myCB.Enabled = False とダブってるので不要。
end-uさん、何度もありがとうございます。
上記の方法でもなかなかうまくいかなかったので、
全体を見直して、ScreenUpdatingを使用せずに
回せるように書き換えてみることにしました。
本当にいつもありがとうございます。
今後とも、何かありましたらお願いいたします。
No.6
- 回答日時:
myRangeです。
当方(WinXp, xl2000sp-3)ではどうやっても再現できないので
はっきりとは言えないのですが、
end-uさんが指摘されたbtnProtectにFocusがある状態が原因だとすれば
提示のように、Activecell.Selectで上手くいくはずですね。
ま、ダメもとで、
即、btnUnProtectにFocusを当てるとかしてみたらどうでしょうか。
'-----------------------------------------
Private Sub btnProtect_Click()
●Sheets("Sheet1").btnUnProtect.Select
' アプリケーション全体の処理
Call Module1.offCmdBarAttr
'----------------------------------------
同じバージョンで現象が出たり出なかったりするわけですから
バグであることは確かでしょう。
当方では現象の再現を確認できませんので、
後はend-uさんにお任せ、ということで。(^^;;;
お役に立てず申し訳ないことです。
myRangeさん、なんどもありがとうございます。
再現できませんでしたか…。
完全にExcelの『不具合』ということであれば、それはそれで
あきらめはつくのですが…。
なにはともあれ、何度もありがとうございました。
何とか回避方法を見つけて、対処したいと思います。
No.5
- 回答日時:
[フォーム]のボタンでも解消しませんでしたか?
もしくはCommandButtonのプロパティでTakeFocusOnClickをFalseにしてみるとかはどうでしょう。
次善の策として
>ScreenUpdatingを無効にしておかないと、一瞬でもユーザー
>情報が表示されてしまうため
これはコードを見直す事によって対応可能だと思います。
内容不明なので具体的には書けませんが表示やSelectしてなくても検索は可能ですが?
No.4
- 回答日時:
ぁ...CommandButtonにフォーカスを残しておかなければいいので
Private Sub btnProtect_Click()
ActiveCell.Select '●
' アプリケーション全体の処理
Call Module1.offCmdBarAttr
' シート単位の処理
Call Module1.protectSheet("Sheet1")
' ブック単位の処理
Call setBookAttribute(False)
Worksheets("Sheet1").Activate
End Sub
これでもいいかも。
この回答への補足
end-uさん、いつもありがとうございます。
いただいた方法で試してみましたが(Activecell.Select)、
私のほうでは解消しませんでした。
現在はダミーでツールバーを表示させておく方法で、
回避していますが、できればきれいに解決したいものです。
ScreenUpdatingを無効にしておかないと、一瞬でもユーザー
情報が表示されてしまうため、なんとか解決しないといけないの
ですが…。
お手数をおかけしますが、引き続きお願いできたらと思います。
No.3
- 回答日時:
[win2000sp4/xl2000sp3]の環境で、提示コードの2種類を試して再現しました。
実行後、CommandButtonがある『システム』シートに切り替えると出てくるようですね。
Application.ScreenUpdating = False を削除すれば出ないわけですから、
それで良いような気がしないでもないです。
(画面のチラつきも全然気になりませんが)
試してみてもいいかもしれないのは
Sub test()
Call offCmdBarAttr
Call protectSheet("Sheet1")
Call setBookAttribute(False)
Worksheets("Sheet1").Activate
End Sub
こんなコードを標準モジュールに置いて、
[コントロールツールボックス]ではなく[フォーム]のボタンにこのマクロを登録して実行してみるとか。
少なくとも私の環境では解消されます。
No.2
- 回答日時:
いま、ScreenUpdating=False(画面更新をしない)を
標準モジュールの全てのプロシージャに入れて
最初のコードを実行してみましたが再現できません。
(補足要求)
(1)xl2000は、SP-3になってるでしょうか。
(2)補足のコードは最初のコードからすると大分削除されてますが
それでも質問の現象が出るのでしょうか?
(当方ではこれも上手く動作します)
ScreenUpdatingをTrueにすると上手くいくが、
飽くまでも、Falseでやりたいということですね。
で、次を試してください。
ツールバー、数式バー、行列番号をFalseにする時に
APIのSleepを使って、200~300ミリ秒実行を止めてみてください。
(ご存知とは思いますが、Sleepの使い方)
●標準モジュールの宣言セクションで次の1行を宣言
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
●プロシージャでは、Sleep 止めたいミリ秒 とするだけです
Sub test55555()
MsgBox "aaa"
Sleep 300
MsgBox "bbb"
End Sub
この回答への補足
myRangeさん、続けてありがとうございます。
いただいた方法を試してみたのですが(Sleep)、
やはりだめなようです。
あの後試してみた結果、ツールバーを非表示にし、ScreenUpdatingを
falseにし、シートを切り替えると発生するようです。
サンプルのソースでは、必要なところのみ絞っているので、
ScreenUpdatingを行わなくても、大きな問題にはならないのですが、
実は本活用部分では、直前にユーザ情報を開き、そこから
ユーザIDとハスワードを検索するといった処理が入っているため、
Updatingを無効にしないと、一瞬とはいえ、ユーザー情報が
見えてしまうため、どうしてもUpdatingは無効にしておかないと
いけないのです。
現在では、『開く』と『閉じる』の二つのボタンをもったツールバー
を表示させておき、応急手段としています。
…が、やはり気分的には納得したいので、できればきちんと
解決できればと思います。
お手数をおかけいたしますが、よろしくお願いいたします。
No.1
- 回答日時:
xl2000で提示のコードを試してみましたが再現できませんでした。
考えられる原因としては、画面表示更新にあるようにも思えますが
提示のOnOffのプロシージャにはScreenUpdating = Falseがないので
ん?という感じですが。
で、ダメもとで
標準モジュールの全てのプロシージャに
強制的に、画面表示更新の
Application.ScreenUpdating = True
を入れてみたらどうでしょうか。
●それから、Excelのバージョンも提示しておいた方がベターだと思いますが。
この回答への補足
myRangeさん、ありがとうございます。
あれからいろいろ試してみたのですが、やはり
状況は変わりませんでした。後、最初に掲示したサンプルでは
頭にScrollUpdatingが抜けていました。これを行わなければ
問題の空白部分は出ないのですが…。記述漏れですみませんでした。
今回もサンプルを掲示します。必要な限り絞って調べてみました。
↓モジュール側
---------------------------------------------------
Option Explicit
Dim myCB As CommandBar
'*******************************
Public Sub onCmdBarAttr()
DoEvents
With Application
For Each myCB In Application.CommandBars
myCB.Enabled = True
Next myCB
.CommandBars("Standard").Visible = True
.CommandBars("Formatting").Visible = True
.CommandBars("Visual Basic").Visible = True
.CommandBars("Worksheet Menu Bar").Enabled = True
.CommandBars("CELL").Enabled = True
End With
End Sub
'******************************
Public Sub offCmdBarAttr()
Dim myCB As CommandBar
On Error Resume Next
Application.ScreenUpdating = False
For Each myCB In Application.CommandBars
myCB.Enabled = False
Next myCB
On Error GoTo 0
With Application
.CommandBars("Worksheet Menu Bar").Enabled = False
.CommandBars("CELL").Enabled = False
End With
Application.ScreenUpdating = True
End Sub
↓シート側
---------------------------------------------------
Option Explicit
Private Sub btnProtect_Click()
Call Module1.offCmdBarAttr
Worksheets("Sheet1").Activate
End Sub
Private Sub btnUnprotect_Click()
Call Module1.onCmdBarAttr
End Sub
なお、使用しているVerは2000ですが、2003でも同じ現象が
起きました。
以上、よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【VBA】別シートにデータ転記
-
EXCEL vbaでシート上に配置した...
-
Excel VBA 定義されたプロージ...
-
VBA 別ブックからコピペしたい...
-
【ExcelVBA】インデックスが有...
-
vbaにてseleniumを使用したedge...
-
VBA 別ブックから条件に合うも...
-
配列のペースト出力結果の書式...
-
郵便番号検索APIにてget Elemen...
-
エクセルのマクロについて教え...
-
【ExcelVBA】値を変更しながら...
-
2つのマクロでチェックボックス...
-
エクセルのマクロについて教え...
-
VBA実行後に元のセルに戻りたい
-
Outlookにて既にウィドウ単体で...
-
VBA 入力箇所指定方法
-
エクセルのマクロについて教え...
-
メールの件名をデコードしたい
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 別ブックからコピペしたい...
-
Vba ファイル書き込み時に書き...
-
Excel_VBAについて質疑です。(...
-
VBAの間違い教えて下さい
-
VBA コードどこがおかしいですか?
-
VBA 円グラフ 特定条件に一致し...
-
VBA 別ブックから条件に合うも...
-
pdfファイルの複数添付 引数の型
-
【ExcelVBA】インデックスが有...
-
ExcelVBAマクロで実行した時の疑問
-
Vba UserformからExcelシートの...
-
VBA初心者です。次のVBAコード...
-
Outlookの「受信日時」「件名」...
-
Excel 範囲指定スクショについ...
-
vbs ブック共有を解除
-
配列のペースト出力結果の書式...
-
Excel VBAで値を変えながら、pd...
-
VB.net(VB)で、フォームにExcel...
-
vbaにてseleniumを使用したedge...
-
ExcelVBA シート名を複数セルか...
おすすめ情報