[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『改ざん防止プログラムを作ったのですが、今一エレガントでありません。』(タカタカホーク)
@セル範囲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.