Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2877 / 13646 ツリー ←次へ | 前へ→

【65487】エラー制御 みるく 10/5/26(水) 1:28 質問[未読]
【65489】Re:エラー制御 Jaka 10/5/26(水) 10:49 発言[未読]
【65502】Re:エラー制御 みるく 10/5/27(木) 22:00 お礼[未読]

【65487】エラー制御
質問  みるく  - 10/5/26(水) 1:28 -

引用なし
パスワード
   ウィンドウズxp
エクセル2007を使用しています。

ある表を開いたとき、H〜J列を非表示になるようにシート保護をかけ、
さらにパスワードを設定しています。
H〜J列を表示したい場合は、シート保護を解除するのですが、
シート終了時、H〜J列を非表示設定にし忘れても、
自動的にH〜J列を非表示にして、保存するマクロを作りました。


============================
Private Sub Workbook_BeforeClose(Cancel As Boolean)

  Columns("H:J").Select
  Selection.EntireColumn.Hidden = True
   ActiveSheet.Protect Password:="123", DrawingObjects:=True, contents:=True, UserInterfaceOnly:=True
 
End Sub
============================

実際にシート保護を解除して、H〜J列を表示させれば、
問題ないのですが、
シート保護を解除せずに、H〜J列を表示することなく、
そのまま終了してしまうと、以下のエラーメッセージが出てしまいます。


============================

実行時 エラー'1004'
RangeクラスのHiddenプロパティを設定できません

============================

おそらく隠す必要がないのでエラーになってしまうのだと思います。
もちろん、エラーメッセージをそのまま終了してしまえば、
改めてシートを開いたときには、H〜J列は非表示になっており、
シート保護もパスワードで保護されてはいるのですが、
このエラーメッセージを表示させずに終了したいのです。

私の考え方としては、H〜J列が表示されていなければ、
そのまま上書き保存するかどうかを聞いてきて、Yesで保存して終了。
H〜J列が表示されていれば、現状のマクロを作動させる。
このように考えてコードを作りたいのですが、
なかなかうまくいきません。

どなたか、どうかご教示いただけないでしょうか。
私の考え方よりも合理的な方法などあれば、
それも教えていただければ幸いです。

どうぞ宜しく御願いいたします。

【65489】Re:エラー制御
発言  Jaka  - 10/5/26(水) 10:49 -

引用なし
パスワード
   >おそらく隠す必要がないのでエラーになってしまうのだと思います。
>もちろん、エラーメッセージをそのまま終了してしまえば、
>改めてシートを開いたときには、H〜J列は非表示になっており、
>シート保護もパスワードで保護されてはいるのですが、
>このエラーメッセージを表示させずに終了したいのです。
動作の確認をしていませんが、エラーの原因が解っているようなので、
その原因を1個1個取り除いていけば良いと、素直に考えればいいんじゃないかと思います。

Sub aaaa() '注
Dim Ragcol As Range, Flg As Boolean
For Each Ragcol In Columns("H:J")
  If Ragcol.Hidden = True Then
   Flg = True
  End If
Next
If Flg = True Then
  MsgBox "非表示列があります。"
Else
  MsgBox "全表示"
End If
End Sub

Sub bbbb()
Dim Sh As Worksheet
For Each Sh In ActiveWorkbook.Worksheets
  If Sh.ProtectContents Then
    MsgBox Sh.Name & "が、保護されています。"
  End If
Next
End Sub

注)
ど素人や、表面だけ格好つけたがる人は、下記のように
なんでも一括で書きたがる傾向がありますが、常に全く同じようにH:J列そろって、
非表示になっているとは考えられないので、面倒でも1列づつチェックした方が良い。
と、私は思っています。

If Columns("H:J").EntireColumn.Hidden = True Then
  MsgBox "非表示"
Else
  MsgBox "表示"
End If

【65502】Re:エラー制御
お礼  みるく  - 10/5/27(木) 22:00 -

引用なし
パスワード
   ▼Jaka さん:

ありがとうこざいました。
無事、解決しました。

おっしゃるように、、
面倒でも1列づつチェックした方が良い。とのアドバイス、
本当にその通りですね。
もっと、色々な状況を想定できるように
がんばって、勉強していきます。

ありがとうございました。

2877 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free