- ベストアンサー
VBAで非表示にすると該当のシートが開けなくなる
VBA超初心者です。 先ほど、 シート1にカレンダーを作成しています。 カレンダーの1をダブルクリックしたら”1”のシートというように、同じ数字のシートを開くようにしたいのですとの質問にご回答頂きまして、解決できたのですが… 式は Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Worksheets(CStr(Target.Value)).Activate End Sub を入れ、カレンダーの”1”をダブルクリックしたら、見出しが”1”のシート、 カレンダー”2”をダブルクリックしたら見出しが”2”のシートが開くようになったのですが、見出し”1””2”のシートを非表示にすると見出し”3”のシートが開くようになってしまいます。 非表示にしてもダブルクリックしたら隠れている見出し”1”や”2”のシートが出てくるようには出来ないのでしょうか? 超初心者なので、式の組み立て方がうまくいきません。 言いたい事も上手に説明できてないと思います。 申し訳ございません。 どのように式を入れたらよいのでしょうか。 そもそも1つのブック内にまとめてるのがよくないのでしょうか? この3連休中に作成したいのですが、思うように進みません。 よろしくお願い致します。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
A No.2から5です 画像が添付できません。 不調の影響ですね。 すみません。 期間限定で 下記サイトからこのサンプルをダウンロードできるようにしておきます。 ファイルの取得期限は 2010年1月14日 3時31分57秒 JST です。 https://www.datadeliver.net/receiver/fileBox.do?fb=ff055c9730a747c298c5ec49b37601b5&rc=ed92a2ab00b74e6abe8ec76ca924e38b&lang=ja ファイル名は Cal.xls です。 同意にチェックするとダウンロードできます。
その他の回答 (7)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 すでに回答は出ていますが、こちらも作ってみました。 個人的には、私は、こうした設定はしません。理由は、昔、ワークシートの繰り返しの開け閉めは、不具合が発生することがあったからです。一般的には、そういう認識を持っている人は少ないとは思いますが、シートやワークブックのオブジェクトが大きければ大きいほど、トラブルの可能性が高くなるような気がしています。マクロ上の意味の分からない不明なエラーが発生したりすることがあります。 オプションのツールで、シート作成、シート名の調整、シート名の削除を作っておきました。ただし、シート名の調整は厳密に作動するようには作られていません。経験的に、数字をシート名にするのは、結構誤動作が起こりやすいので、#2さんがお書きのように、本来は、「日」などの接尾辞を入れたほうが安定がよいです。それに代わる方法として、シート名をマクロで入れるとうまくいくようです。一応、テキストコンペアモードにしていますから、既存のものでも対応しているはずです。また、日付は、シリアル値でも、数字である限りは、問題ないようにしています。 '------------------------------------------- 'ワークシートモジュール Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim i As Long Dim shName As String Cancel = True If Target.Value = "" Then Exit Sub If IsNumeric(Target.Value) = False Then Exit Sub Application.ScreenUpdating = False For i = 2 To Worksheets.Count If StrComp(Worksheets(i).Name, CStr(Target.Text), 1) = 0 Then Worksheets(i).Visible = -1 shName = Worksheets(i).Name Else Worksheets(i).Visible = 0 End If Next i Application.ScreenUpdating = True Worksheets(shName).Select End Sub '=========================================- 'オプションツール 'シートの作成削除ツール '標準モジュール '========================================= Sub AddShPr() '日付分のシートを作る 'マウスカーソルをカレンダーのところに置いてください。 'カレンダーのシートひとつにして実行します。 Dim i As Long Dim maxDay As Integer If Worksheets.Count > 1 Then MsgBox "シートが二つ以上あるので、設定できません。", vbExclamation Exit Sub End If If WorksheetFunction.Max(ActiveCell.CurrentRegion) < 26 And _ WorksheetFunction.Max(ActiveCell.CurrentRegion) > 31 Then MsgBox "カレンダーリストにマウスを置いて実行してください。", vbInformation Exit Sub Else maxDay = WorksheetFunction.Max(ActiveCell.CurrentRegion) End If For i = 1 To 32 If i > 1 Then With Worksheets.Add(After:=Worksheets(Worksheets.Count)) .Name = i - 1 .Visible = False End With End If Next i End Sub '------------------------------------------- Sub AddChangePr() 'シート名の整理 Dim i As Long For i = 1 To 32 If i > 1 Then On Error Resume Next Worksheets(i).Name = i - 1 On Error GoTo 0 End If Next i End Sub '------------------------------------------- Sub DelSheet1() 'シートの削除 Dim i As Long For i = Worksheets.Count To 1 Step -1 If i > 1 Then Application.DisplayAlerts = False On Error Resume Next Worksheets(i).Visible = True Worksheets(i).Delete Application.DisplayAlerts = True End If Next i End Sub
お礼
Wendy02様 ありがとうございます。 皆様、一般人と書いていますがすごいですね。 本を見ても、式はどこから取り掛かったらよいのか分からないもので。 役立ちました。
- NOBNNN
- ベストアンサー率50% (93/186)
A.NO 2から4です。 どうも、調子がわるいですね。 同じものが3件掲載されてしまいました。 ================================================================== OKWaveコミュニティ アクセスが集中しています いつもOKWaveをご利用いただきまして誠にありがとうございます。 アクセスの集中にともない、つながりにくい状態になっております。 大変お手数ではございますが時間をおいてから再度お試し下さい。 ================================================================== 画像を載せます。 カレンダーのシートです。
- NOBNNN
- ベストアンサー率50% (93/186)
A.NO2から4です。 どうも OKwave が不調でアップロードが失敗していた影響で同じものが3件掲載されています。 「時間をおいてから再度・・・」 というメッセージでした 本題、 画像を添付します。 カレンダーのシートです。
- NOBNNN
- ベストアンサー率50% (93/186)
あらかじめ、1カ月、31日分のシートを用意します。 シート名は 「1日」から「31日」 とします。 カレンダーの入っているシート名は 「カレンダー」とします。 カレンダーの内容は添付画像のとおり ブックを開いたときにすべて31日分ののシート「1日」から「31日」は非表示にします。 クリックすると 以前開いていたシートは非表示にし、今回クリックしたシートが表示され アクティブになります。 以下はサンプルコードです。 ============================= ■標準モジュールのコード Public G_PrevSheet As String '以前アクティブだったシート名 Sub S_Wsheet_NotVisible() Dim I As Integer ' For I = 1 To 31 1か月分 For I = 1 To 7 'テストのため7日分とした Worksheets(I & "日").Visible = False Next End Sub ====================================================== ■ ThisWorkBookのコード Private Sub Workbook_Open() Call S_Wsheet_NotVisible End Sub ====================================================== ■ Sheet1(カレンダー)のコード Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If G_PrevSheet <> Empty Then Worksheets(G_PrevSheet).Visible = False End If Worksheets(CStr(Target.Value) & "日").Visible = True Worksheets(CStr(Target.Value) & "日").Activate G_PrevSheet = ActiveSheet.Name End Sub ====================================================== つづく
- NOBNNN
- ベストアンサー率50% (93/186)
あらかじめ、1カ月、31日分のシートを用意します。 シート名は 「1日」から「31日」 とします。 カレンダーの入っているシート名は 「カレンダー」とします。 カレンダーの内容は添付画像のとおり ブックを開いたときにすべて31日分ののシート「1日」から「31日」は非表示にします。 クリックすると 以前開いていたシートは非表示にし、今回クリックしたシートが表示され アクティブになります。 以下はサンプルコードです。 ============================= ■標準モジュールのコード Public G_PrevSheet As String '以前アクティブだったシート名 Sub S_Wsheet_NotVisible() Dim I As Integer ' For I = 1 To 31 1か月分 For I = 1 To 7 'テストのため7日分とした Worksheets(I & "日").Visible = False Next End Sub ====================================================== ■ ThisWorkBookのコード Private Sub Workbook_Open() Call S_Wsheet_NotVisible End Sub ====================================================== ■ Sheet1(カレンダー)のコード Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If G_PrevSheet <> Empty Then Worksheets(G_PrevSheet).Visible = False End If Worksheets(CStr(Target.Value) & "日").Visible = True Worksheets(CStr(Target.Value) & "日").Activate G_PrevSheet = ActiveSheet.Name End Sub ====================================================== 以上
- NOBNNN
- ベストアンサー率50% (93/186)
あらかじめ、1カ月、31日分のシートを用意します。 シート名は 「1日」から「31日」 とします。 カレンダーの入っているシート名は 「カレンダー」とします。 カレンダーの内容は添付画像のとおり ブックを開いたときにすべて31日分ののシート「1日」から「31日」は非表示にします。 クリックすると 以前開いていたシートは非表示にし、今回クリックしたシートが表示され アクティブになります。 以下はサンプルコードです。 ============================= ■標準モジュールのコード Public G_PrevSheet As String '以前アクティブだったシート名 Sub S_Wsheet_NotVisible() Dim I As Integer ' For I = 1 To 31 1か月分 For I = 1 To 7 'テストのため7日分とした Worksheets(I & "日").Visible = False Next End Sub ====================================================== ■ ThisWorkBookのコード Private Sub Workbook_Open() Call S_Wsheet_NotVisible End Sub ====================================================== ■ Sheet1(カレンダー)のコード Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If G_PrevSheet <> Empty Then Worksheets(G_PrevSheet).Visible = False End If Worksheets(CStr(Target.Value) & "日").Visible = True Worksheets(CStr(Target.Value) & "日").Activate G_PrevSheet = ActiveSheet.Name End Sub ====================================================== 以上
- DreamyCat
- ベストアンサー率56% (295/524)
>>非表示にしてもダブルクリックしたら<< シート1が非表示になっているのに どうやってそこにある数字(文字?セル?)を ダブルクリックするのですか? 「シート3をダブルクリックする」ということであれば visibleプロパティの値をtrueにすればできますが・・・。 Sheets("Sheet1").Visible = True Sheets("Sheet2").Visible = True
お礼
NOBNNN様 ご丁寧にありがとうございます。 すごいですね。 3連休最後の日ですが、完成できそうです。 本当にありがとうございました。