• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ExcelVBAで非表示列を選択不可にしたい)

ExcelVBAで非表示列を選択不可にする方法

このQ&Aのポイント
  • ExcelVBAにおいて、非表示にしている列のみを選択できないようにする方法を教えてください。
  • 手動で選択不可にするのではなく、VBA内でシートの保護や非表示設定を行い、特定の列だけが選択できない状態にしたいです。
  • シートの保護では全ての列が選択不可になってしまうため、特定の列だけを選択不可にする方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

> シートの保護で行うと、全ての列(セル)が選択不可になってしまい、困ります。 ご希望としては、『手動で「可視セル」指定』と同じ動作を VBAで実行したい、ということでよろしいでしょうか。 上記の理解でよろしければ、以下の方法で可能です。 (なお、ワークシート全体を選択したときの「オーバーフロー」  エラーの回避策がわからなかったので(汗)、エラー処理で  逃げています。そのため、他の箇所で同一エラーが出た  際に問題とならないよう、ワークシートへの直接記述では  なく、ワークシートから呼び出す関数として作成しました) 1)当該ワークブックに標準モジュールを新規追加 2)下記コードを貼付: Public Function SelectVisibleCells(Target As Range) As Boolean 'エラー発生時は「エラー処理」の行に飛ばす On Error GoTo エラー処理   Dim Rsl As Boolean, Rng As Range   Const PrcName As String = "SelectVisibleCells"   '戻り値の初期値   Rsl = True      '選択範囲に不可視セルが確実にない場合はそのまま終了   If Target.Cells.Count <= 1 Then GoTo 終了処理      '手動で「可視セル」を選択するのと同じ動作を実行   Set Rng = Target.SpecialCells(xlCellTypeVisible)   Rng.Select 終了処理:   '戻り値を設定&メモリを明示的に解放して終了   SelectVisibleCells = Rsl   Set Rng = Nothing   Exit Function エラー処理:   Select Case Err.Number     Case 6  'シート選択時のCount確認による「オーバーフロー」エラーへの対処       Resume Next     Case Else       MsgBox Err.Number & ":" & Err.Description, vbCritical, PrcName   End Select   Rsl = False   Resume 終了処理 End Function 3)当該ワークシートの「SelectionChange」イベントで、  以下のように呼出コードを記述: Private Sub Worksheet_SelectionChange(ByVal Target As Range)   SelectVisibleCells(Target)   '他にコードを記述する場合は、例えば以下のようにします:   'If SelectVisibleCells(Target) = False Then Exit Sub End Sub ・・・以上です。

amamaq
質問者

お礼

DexMachina 様 大変遅くなって申し訳ありません。 ご回答どうもありがとうございました。

その他の回答 (1)

回答No.1

手元にエクセルが無いので、想像でになりますが。 列の表示非表示でWorksheet_Changeが実行されるのであれば、下記のような処理 ■Worksheet_Change使用案■ 概要:非表示列の情報を取得し、セルをロック (1)Worksheet_Changeで取得するTargetオブジェクトから非表示の列情報(何列目が操作されたか)を取得 (2)列.RockdeプロパティをTrueにする もし、Worksheet_Changeでイベントを引き起こせなかった場合、下記のような処理 ■標準モジュール使用案■ 概要:ボタン等を設置し、表示、非表示を行った後、ボタンクリックで非表示列の情報を取得し、セルをロック (1)ボタン等により標準モジュールに書いた表示非表示処理を呼び出す ※標準モジュールに下記処理を記述 (2)繰り返し処理(For文あたり)で、列.hiddenプロパティがTrueになっている列を取得 (3)対象の列に対して列.RockdeプロパティをTrueにする このどちらかで、(たぶん)実装できると思います 実装に使えそうな感じがしたサイト↓ VBAの基礎知識 http://excelvba.pc-users.net/ hiddenプロパティの基本的な考え方 http://www.moug.net/tech/exvba/0050108.html Rockdeプロパティの基本的な考え方 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_030_030.html

amamaq
質問者

お礼

piyo_dansyaku 様 大変遅くなって申し訳ありません。 ご回答どうもありがとうございました。

関連するQ&A