[[20091018211511]] 『改ざん防止プログラムを作ったのですが、今一エレ』(タカタカホーク) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『改ざん防止プログラムを作ったのですが、今一エレガントでありません。』(タカタカホーク)

 @セル範囲A1〜C15のロックを外し、シートを保護して、ファイルを保存しておきます。
 Aエクセルのファイルを開いたとき、
  セル範囲A1〜A15は空白で、セルA15に予め「決定」と書いてある。
 セル範囲B1〜B15は空白で、セルB15に予め「決定」と書いてある。
 セル範囲C1〜C15 〃           C15    〃
 Bある列の空白セルにデータを入力し、その列の「決定」と書いてあるセルにカーソルを
  合わせると、その行の1行目から15行目の背景が黄色になります。
 C背景が黄色になった部分には、もうデータの入力はできません。

 さて、質問ですが、A,B,Cの3列だけなら下記のプログラムでなんとか行けますが、
 C,D,E・・・・と列が増えた場合はVBAを書くのがしんどいし、VBA自体がエレガントでないので、
 繰り返し処理でなんとかできないかと思いましたが、
 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 との相性が悪いのか上手く行きません。具体的なVBAを教えてください。
 
 このプログラムのオブジェクトはWorksheet、プロシージャーはSelectionChangeになっています。

 なお、最後にここまでこれたのは、Seiyaさん貴方のおかげです。ありがとう。

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     Dim ある縦に連続する数個の空白セル As Range, ある一定のせる As Range

     Set ある縦に連続する数個の空白セル = Range("A1:A15")
     Set ある一定のせる = Range("A15")
     If Target.Address = ある一定のせる.Address Then
         Me.Unprotect
         Call 色変更1
         ある縦に連続する数個の空白セル.Locked = True
         Me.Protect
     End If

     Set ある縦に連続する数個の空白セル = Range("B1:B15")
     Set ある一定のせる = Range("B15")
     If Target.Address = ある一定のせる.Address Then
         Me.Unprotect
         Call 色変更2
         ある縦に連続する数個の空白セル.Locked = True
         Me.Protect
     End If

     Set ある縦に連続する数個の空白セル = Range("C1:C15")
     Set ある一定のせる = Range("C15")
     If Target.Address = ある一定のせる.Address Then
         Me.Unprotect
         Call 色変更3
         ある縦に連続する数個の空白セル.Locked = True
         On Error GoTo 0
         Me.Protect
     End If
 End Sub

 'サブルーチン(A1〜A15のセルの背景を黄色にする。)
 Sub 色変更1()
     Range("A1:A15").Select
     Call 黄色
 End Sub

 'サブルーチン(B1〜B15のセルの背景を黄色にする。)
 Sub 色変更2()
     Range("B1:B15").Select
     Call 黄色
 End Sub

 'サブルーチン(C1〜C15のセルの背景を黄色にする。)
 Sub 色変更3()
     Range("C1:C15").Select
     Call 黄色
 End Sub

 'サブルーチン(選択されたセルの背景を黄色にする。)
 Sub 黄色()
     With Selection.Interior
         .ColorIndex = 6
         .Pattern = xlSolid
         .PatternColorIndex = xlAutomatic
     End With
 End Sub


 > VBA自体がエレガント

 エレガントとは、「優雅なさま。上品なさま。」という意味のようで、それは具体的にどういうことなのかよくわかりませんが、
 少なくとも、インデントは、整理したほうがいいと思います。
 上記は、こちらで勝手に、修正させていただきました。

 (VBA勉強中)


 > C,D,E・・・・と列が増えた場合はVBAを書くのがしんどいし、VBA自体がエレガントでないので、
 > 繰り返し処理でなんとかできないかと思いましたが、

 書かれたコードを基本にまとめてしまうならば、以下のような感じになるのではないでしょうか?

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     If Target.Count > 1 Then Exit Sub
     If Not Intersect(Target, Rows(15)) Is Nothing Then
         If Target.Value = "決定" Then
             Me.Unprotect
             Call 黄色(Target.Offset(-14).Resize(15))
             Target.Offset(-14).Resize(15).Locked = True
             Me.Protect
         End If
     End If
 End Sub

 'サブルーチン(選択されたセルの背景を黄色にする。)
 Sub 黄色(rng As Range)
     With rng.Interior
         .ColorIndex = 6
         .Pattern = xlSolid
         .PatternColorIndex = xlAutomatic
     End With
 End Sub

 (とおりすがり)


とおりすがり様ありがとうございました。うまく行きました。
スマートかつエレガントなプログラムですね。(タカタカホーク)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.