アプリ版:「スタンプのみでお礼する」機能のリリースについて

ExcelVBAにおいて、非表示にしている列のみを選択できないようにしたいのですが、
どうすればよいのでしょうか? (Excel2007,Excel2010)

よく非表示列(セル)をコピーしないように、手動で「可視セル」指定することはできますが、
そうではなく、シートの保護や非表示設定をVBA内でプログラムするように、
シートの選択の可不可も、プログラム内で行いたいのですが。

シートの保護で行うと、全ての列(セル)が選択不可になってしまい、困ります。


具体的には、VBA以下のことをします。

1.特定列を非表示にする。(この時、選択不可にしたい)

2.1の列を表示にする。(この時、選択可能にしたい)


よろしくお願いします。 m(_ _)m

A 回答 (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


・・・以上です。
    • good
    • 0
この回答へのお礼

DexMachina 様

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

お礼日時:2012/10/22 08:56

手元にエクセルが無いので、想像でになりますが。



列の表示非表示で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/sub0 …
    • good
    • 0
この回答へのお礼

piyo_dansyaku 様

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

お礼日時:2012/10/22 08:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!