ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

EXCEL VBAコミュの .Visible = xlSheetVisible のエラー400

  • mixiチェック
  • このエントリーをはてなブックマークに追加
昨日まで動いていたプログラムが、今日はエラーになってしまいます。
原因がわかりません。

何をしていたかというと、B列にシート名を書いてその隣のC列のセルに「表示」と記入してあれば、同じ名前のシートが表示され、「非表示」となっていれば表示しないというものですが、 「.Visible = xlSheetVisible」がおかしいのでしょうか・・・

 A___B___C
:
6 ___項目1__非表示
7 ___項目2__非表示
8 ___項目3__非表示
:

OSはXPです。Vistaでは動いているようですが・・・でも、XPでも昨日は動いていました。おかしいな〜?

だんだんわからなくなってきて・・・解る人いましたらよろしくおねがいします。

以下にコードを書きました。


Sub シートの表示非表示()

ActiveWorkbook.Unprotect Password:="1234" 'ブックの保護解除

Dim i As Integer 'ループカウンタ

Dim sheet_name As String 'シート名


ActiveSheet.Range("c6").Select



For i = 0 To 24 '10回処理を繰り返す(nextまでの間)

If ActiveSheet.Range("c6").Offset(i, 0).Value = "表示" Then '「表示」の場合次を実行する

sheet_name = Range("c6").Offset(i, -1).Value

With Worksheets(sheet_name)
.Visible = xlSheetVisible
End With

Else '「表示」でない場合次を実行する



sheet_name = Range("c6").Offset(i, -1).Value

With Worksheets(sheet_name)
.Visible = xlSheetHidden
End With

End If


ActiveSheet.Range("c6").Offset(i + 1, 0).Select '次範囲の再定義



Next i
ActiveWorkbook.Protect Password:="1234", Structure:=True

End Sub

コメント(14)

補足します。
動かないと言うのは・・・非表示のシートが表示されないということです。
EXCEL を再起動したところ、元通り機能するようになりましたが、原因がわかりません。
ぱっと見てですが、マクロを実行するときに、開いているシート(アクティブなシート)が、
・表示とか非表示とか定義しているシートだとうまくいって、
・それ以外のシートだとうまく行かない、
ということがありえそうです。
>トキハ さま

コメント有り難うございます。
エラーになるのは、非表示状態のシートをこれから表示させようとするときでした。
そして、「.Visible = xlSheetVisible 」としているのに逆に非表示になってしまったりと、おかしな動きをしていたので、Excel自体を1回閉じてもう一度立ち上げたところ、正常に機能するようになりました。
もしかしたら、同時に複数のExcelのファイルを開いていたりというのも原因かもしれません。
複数のブックを開いていても、マクロを実行している時のシートが
A___B___C
:
6 ___項目1__非表示
のシートで、このシートが非表示にならなければActiveSheetが変更されることが無いので影響はないと思います。
もしかして、表示非表示の欄に、このシート名があったりしないでしょうか??
(無ければ不思議ですね??)
>トキハさま

この表示・非表示の項目が書かれているシートのことですね。このシートはマクロの実行には関係ないようになっています。

色々ネットでも調べてみたんですが、同じような症状のエラーが幾つか出てきました。そのうちの1つが下のURLなんですが、ここでも何かのタイミングでエラーになったりならなかったりで、原因がわからないそうです。

http://www.moug.net/faq/viewtopic.php?t=31277

excelを再起動すればエラーが出なくなるので不思議です。
>KENさん

一つデバッグして解ったことがあるのですが、
sheet_name = Range("c6").Offset(i, -1).Value ’※1
これがシートを特定していないため、ある条件下で変な動きをすることがありました。
Range("c6")が、どうやらアクティブなシートのRangeではなく、前回実行時に取得したRangeオブジェクトが参照されているっぽいのです。
一度取得したオブジェクトはブックを閉じるまで消えることは無く、再利用され続けていました。

具体的には、KENさんと同様のコードを利用し、Sheet1から実行したときの※1と、その後Sheet3から実行したときの※1が同じ値でした。

ワークブック・シートを特定して記述するとこの現象は直りました。(↓一例)
sheet_name = ActiveSheet.Range("c6").Offset(i, -1).Value

なので、コード上の曖昧な範囲指定をきちんとブックから記述すると解決するかもしれません。(他の曖昧な箇所↓)
Worksheets → ActiveWorkbook.Worksheets

長々とすみません;w;
>トキハさま

いろいろ検証して頂き有り難うございます。

このコメントを参考にデバッグしてみましたが、確かに、はじめにワークシートを特定していない状態になっていました。違うシートをあえて開いておいてこのマクロをVBEの画面から実行すると、はじめに開いておいたシートの"c6"を選択してしまい、その後は・・・当然「表示」という文字はどこにもないので、このマクロを実行させるボタンが付いているそのシート以外のすべてのシートが非表示になってしまいました。でも、このときシート名をしっかり選んでいるところが不思議でしたが・・・これは、

ActiveSheet.Range("c6").Offset(i, 0).Value = "表示"・・・の"c6"と、
sheet_name = Range("c6").Offset(i, -1).Value・・・の"c6"は
「違うシートの"c6"という指定になっている」ことなのかもしれません。
実際は同一のもののつもりで指定していたのですが、何かのはずみで、別のシートを指定してしまっていたということなんでしょうね。

表示・非表示の項目が書かれているシートをSheet6としたとき、

Sheet6.Select

を始めに記入することでこの部分は解決したように思えます。


曖昧な指定の仕方がこういうエラーを誘ってしまうということですね。
Active〜ではまだあいまいかと思います。
開いているbookなりsheetなりによって処理を切り替える意図がないのであれば、
ThisWorkBookや、Worksheets("sheet6")などを利用すべきかと。

ちなみに2回出てくるselectの文は意味がないと思います。
>KENさん

>このときシート名をしっかり選んでいるところが不思議でしたが・・・
Range("c6") なのですが、「コードを埋め込んだシートの"c6"」になるみたいです。前回値を忘れないというのは間違ってました;w;
ちなみに標準モジュールにコードを書いている場合は、アクティブなシートの"c6"、が正解みたいです。
なので、シート名指定するかしないか、どちらかに統一するのが良いかも知れないですね!?

>きぬちゃんさま

ご指摘有り難うございます。
確かに Active〜 ではあいまいかもしれません。

Sheet6.Range("c6").Select

とすれば良いと言うことですね。(動作確認しました指でOK)


>トキハさま

>Range("c6") なのですが、「コードを埋め込んだシートの"c6"」になるみたいです。

ああ!それは知りませんでした。
だから、「ActiveSheet.Range("c6")」の値と「Range("c6")」が違っていたんですね。
今回は標準モジュールを使っていないので、シート名の指定でいこうと思います。
ああ、しかし、他のワークシートを開きながらデバックすると”1004エラー”になってしまいます。

Sheet6.Select
Sheet6.Range("c6").Select

にすると、OKなんですけど。

でも、実行ボタンはSheet6にあるので

Sheet6.Select は、なくても良いのかもしれませんが、一応つけておいた方がいいのかなと思いました。
実行ボタンがSheet6にあるなら、必要十分かなっ?と思うのでこれは蛇足なのですが、
今回、表示・非表示をするために、セルの情報を取得したいだけなので、
セルをSelectする必要はあんまりないと思います。(Selectしても全然問題ないですけどw)
ActiveSheetから取得しようとしてるので、
Sheet6.Selectだけで大丈夫です。(個人的には、エラー処理をしないならSheet6.Activateがお勧めです)

逆に、ActiveCellで値を取得する場合はSelectする必要があります。
>トキハさま

sheet_nameで定義しているからいらないということですね。
デバックしましたがSheet6.ActivateだけでOKでした。

ここまで長々つき合って頂き有り難うございました。すごく勉強になりました。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

EXCEL VBA 更新情報

EXCEL VBAのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。