- ベストアンサー
マクロの対象範囲
以前にセルを普段はたたんでおきダブルクリックで展開させるマクロを教えていただきました。 そのマクロで実行の対象セルが複数になった時の対象の設定がわかりません。マクロは↓です。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Address = "$B$1" Then If Target.Offset(0, 1).ColumnWidth = 0 Then Target.Offset(0, 1).ColumnWidth = 10 Else Target.Offset(0, 1).ColumnWidth = 0 End If End If End Sub このマクロだと"B1"をダブルクリックするとC列が対象となり、Offset(x、y)内で対象を指定されているのですがB列をダブルクリックでC,D,Eと複数の列を隠すようにするにはどのように設定すればよいのでしょうか? また、その対象をセルの名前の定義で行うことは可能でしょうか? 何から何までお伺いして申し訳ありませんが、宜しくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> 名前を定義して(前者を”開く”後者を”表示・非表示”)”開く”と定義されたセルをダブルクリックすると”表示・非表示”とされたセルが展開・折りたたむという事です。 こういうことですか? Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("開く")) Is Nothing Then Exit Sub With Range("表示・非表示") If .EntireColumn.Hidden = True Then .EntireColumn.Hidden = False Else .EntireColumn.Hidden = True End If End With End Sub
その他の回答 (3)
- onlyrom
- ベストアンサー率59% (228/384)
>具体的にはセルの名前の定義でB1,B2,G3、G4等複数のセルに名前を定義し、C~F、H~Kの列にも名前を定義して(前者を”開く”後者を”表示・非表示”)”開く”と定義されたセルをダブルクリックすると”表示・非表示”とされたセルが展開・折りたたむという事です。 ”具体的に”と言いながら、なお意味不明になっておりませんか。 大体の想像はつきますが。。 以下のようなことでしょうか。 (1)B1,B2,G3,G4に "開く" と名前定義 (2)列C-F,H-Kに "表示・非表示" と名前定義 (3)B1またはB2のダブルクリックで、列C-Fの表示非表示を切り替える (4)G3またはG4のダブルクリックで、列H-Kの表示非表示を切り替える これでもちょっと疑問が残ります。 なぜ、B1,B2と2つのセルなのか(結合してある?) G3,G4も然り。 >”何から何までお伺いして申し訳ありませんが、宜しくお願い”する時は、 実際の処理に即したより具体的な質問をした方が的確な回答を一発で得られると思いますが、どうでしょう。
お礼
すいませんでした。 要領を得ない質問に対してご注意とアドバイスありがとうございます。 はい。(1)~(4)で指摘して頂いているような事をしたかったのです。 B1とB2をセル結合するのではなくそれぞれで同じ対象を展開させたり折りたたんだりとしたかったのです。 B列のどのセルをクリックしてもC~Fを表示させG列のどのセルをクリックしてもH~Kを表示させたかったのです。 グループとアウトラインの設定をしたものの折りたたみと展開の操作を各セルでできないものかと悩んで質問したのです。 すいませんでした。ありがとうございます。
- Wendy02
- ベストアンサー率57% (3570/6232)
>C~F、H~Kの列にも名前を定義して(前者を”開く”後者を”表示・非表示”)”開く”と定義されたセルをダブルクリックすると”表示・非表示” 逆に、良く分からないです。セルの定義された名前とAction が、一致しないのでは、混乱します。 要するに、トグルボタンを、セルで行わせるということではないでしょうか? 以下は、「セル1」,「 セル2」 という名前にしました。セルの名前は、ご自身の任意の名前を新たにつけ直してください。 それと、Offset は、今回の場合は、必要ないのでは? Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _ Cancel As Boolean) Dim strRng As String Select Case Target.Address Case Range("セル1").Address strRng = "C:E" Case Range("セル2").Address strRng = "H:K" 'Case Range("セル3").Address '加筆例 ' strRng = "J:K" Case Else Exit Sub End Select If Range(strRng).Cells(1).ColumnWidth = 0 Then Columns(strRng).ColumnWidth = StandardWidth 'or 8.38 Else Columns(strRng).ColumnWidth = 0 End If Cancel = True End Sub ただし、実際に使ってみると、今回の場合、トグルボタンが一番・確実で、イベントが速いです。ダブルクリック・イベントは、セルの枠線のところに、本来のショートカットが入っているので、それが誤動作を呼ぶときがあります。確実に、セル内をクリックしなければならない、という前提があります。 このような設計の場合は、セルが確実にイベントとして機能させるために使うので、トグルボタンか、コマンドボタンをセルの上に乗せてしまったほうが確実かもしれません。(ラベルは、レイアウトは自由ですが、若干イベントの速度が落ちます) ダブルクリック・イベントは、#1さんが作られたように、列全体や、行全体を対象にさせるというのが、基本的な設計です。 なお、経験値だけで、今回の物自体に、十分にテストしたわけではありませんので、ミスがありましたら、ご容赦ねがいます。
お礼
皆さんすいませんでした。 具体的にと思ったのですが要領を得ない聞き方で本当に申し訳ありません。 どのよう聞けばよいのかもわかってなくてすいませんでした。 処理をしたいものそのまま書いてみます。 A列には工事名を入れます。 B列には日付を記入しておきます。 その日付の工事内容をC列~F列まで入れます。 E列にはその翌日の日付を記入し、工事内容の記入を また繰り返します。 一覧表示で普段は日付の列だけが表示され必要に応じて その日の工事内容をみれるようにしたかったのです。 A B C D E 1 工事種目 7/14 工事内容 内容2 内容3 2 型枠工事 15人 建込 ~~ ~~ 3 仮設工事 5人 解体 ~~ ~~ こういった形の物を普段見ないものはたたんでおき必要に応じて展開させる形をとりたかったのですが、すいませんでした。
- merlionXX
- ベストアンサー率48% (1930/4007)
イベントの発生範囲を、B1だけでなく、B列全体に広げる。 CDEの3列を非表示にする。 以上でよければ、 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column = 2 Then If Target.Offset(0, 1).Resize(1, 3).ColumnWidth = 0 Then Target.Offset(0, 1).Resize(1, 3).ColumnWidth = 10 Else Target.Offset(0, 1).Resize(1, 3).ColumnWidth = 0 End If End If End Sub です。 上記は、CDE列と指定しているのではなく、イベント発生セルの右から3つの列という指定です。 > その対象をセルの名前の定義で行うことは可能でしょうか? 意味不明です。具体的におっしゃってくださいませ。
お礼
ありがとうございます。 補足させていただきます。 具体的にはセルの名前の定義でB1,B2,G3、G4等複数のセルに名前を定義し、C~F、H~Kの列にも名前を定義して(前者を”開く”後者を”表示・非表示”)”開く”と定義されたセルをダブルクリックすると”表示・非表示”とされたセルが展開・折りたたむという事です。 こういったことは不可能でしょうか?
お礼
ありがとうございます。 思っていた通りの結果が得られました。