プロが教える店舗&オフィスのセキュリティ対策術

この度初めて投稿させて頂きます。
当方、VBAを始めてまだ1ヶ月も経たない初心者ですが、何卒宜しくお願い致します。

まずやろうとしていることですが、
表(5列)の1行から言葉を検索し、その言葉がある1列のみにロック(入力等の操作不可)をかけ、その後複数カラムのロックを解除、入力を可能なものにするというものです。(説明が下手で申し訳ないです。)

恥ずかしながらコードの方を記載します。


Sub test()

Dim KEKKA As Range
Dim I As Long
Dim J As Long

With Worksheets("シート名")

For I = 2 To 6
Set KEKKA = .Range("B1" & I).Find(what:="ABC")
If KEKKA Is Nothing Then

ElseIf Not KEKKA Is Nothing Then
' シート保護を解除
ActiveSheet.Unprotect

For J = 1 To 27
'該当するセルの一列をロック
.Range("B1" & I).Offset(0, J).MergeArea.Locked = True【ここでエラーになります。「RangeクラスのLockedプロパティを設定できません。」】
'ロックを有効にする。
ActiveSheet.Protect
Next J
.Range("X1" & I).Locked = False
.Range("Z1" & I).Locked = False
.Range("AB1" & I).Locked = False
End If
Next I
End With

End Sub

デバックしてみたのですが、I・Jには値が代入されていました。
また、offset部分を外したりすると(求める動作ではなくなりますが、原因を突き止めるために試したりしています。)「型が一致しません。」というエラーになります。
おそらく相当初歩的なことだとは思われますが、何卒ご助力願えますよう、お願いいたします。

OS:XP
エクセルバージョン:2000

A 回答 (1件)

>表(5列)の1行から言葉を検索し、その言葉がある1列のみにロック


>(入力等の操作不可)をかけ、・・・

キーワードが並んでいるのが縦なのか横なのか、ロックをかけるのが列(縦)なのか行(横)なのかよくわかりませんね。
キーの検索が列なら、ロックをかけるのは行というように、違っていないとおかしいのだけれど…?

とりあえず、縦(例ではB列)にキーワードが並んでいて、該当するものがあったら、その行(横)をロックするというように勝手に解釈しました。
(質問文のコードだとキー列が B12:B16 になるけど、違うみたいなので)
サンプルでは、表がA2:Z6にあって、その中のB列(=B2:B6)にキーワードが並んでいると仮定しています。
(検索キーの列は、表の中に含まれていると仮定)

キーが一致するのを一行だけに限定してもいいのか、複数行一致する可能性があるのか不明でしたので、複数行にも対応しているので、サンプルは少々複雑になっています。
(最後の処理の .Range("X1" & I).Locked = False などがどのセルを指定
 したいのか不明なので省略してます。 このままだとX15とかになる。)

<参考サンプル>
Sub test()
Dim c As Range, rng As Range
Dim rw As Long
Const tableArea = "A2:Z6"  '//ロック対象の全体範囲
Const keyColumn = "B"     '//キーワードのある列
Const keyWord = "ABC"    '//検索対象キーワード

Set rng = Nothing
'//キーワード一致行を検索(複数行可)
For Each c In Intersect(Columns(keyColumn), Range(tableArea))
 If c.Text = keyWord Then
  If rng Is Nothing Then Set rng = c Else Set rng = Union(rng, c)
 End If
Next c

ActiveSheet.Unprotect  '//シート保護を解除
Range(tableArea).Locked = False  '//一旦全部のロックを解除
If Not (rng Is Nothing) Then    '//一致した行だけロック
 Intersect(rng.EntireRow, Range(tableArea)).Locked = True
End If
ActiveSheet.Protect  '//シートを保護
End Sub

この回答への補足

ご回答ありがとうございます。

補足ですが、

_________________________________
|No. |キーワード|・・・・・・・・
_________________________________
| |ABC    |・・・・・・・・//一列ロック
| |EFG    |・・・・・・・・//ロックなし
| |DDD    |・・・・・・・・//ロックなし
| |ABC    |・・・・・・・・//一列ロック
| |ABC    |・・・・・・・・//一列ロック
_________________________________
(レイアウト崩れてたら申し訳ありません。)

感覚的にはこのような形です。

言葉間違いがありましたね。
>表(5列)
→表(5行)です。
申し訳ありません。

>キーワードが並んでいるのが縦なのか横なのか、ロックをかけるのが
>列(縦)なのか行(横)なのかよくわかりませんね。
キーワードは縦、ロックをかけるのは該当キーワードのある列(横)です。

>とりあえず、縦(例ではB列)にキーワードが並んでいて、該当するも
>のがあったら、その行(横)をロックするというように勝手に解釈し
>ました。
その解釈で問題ございません。

>キーが一致するのを一行だけに限定してもいいのか、複数行一致する
>可能性があるのか不明でしたので、複数行にも対応しているので、サ
>ンプルは少々複雑になっています。
複数行で可能性があります。

>(最後の処理の .Range("X1" & I).Locked = False などがどのセル
>を指定
>したいのか不明なので省略してます。 このままだとX15とかにな
>る。)
表のカラム数が多いため、最終的にはAC16まで表が伸びる予定です。
最後の処理は、キーワード検索に引っかかった一列をロック、その後対象セルのみをロック解除して操作可能にしようと考えました。
(「入力可能セルを制限させようとしています。」
大事な部分を書き忘れておりました。大変失礼しました。)

補足日時:2009/02/25 09:00
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ただいま別件で作業をしております関係でソースの方を拝見するのみの状況ですが、後ほど試してみたいと思います。

ご丁寧にありがとうございます。

お礼日時:2009/02/25 09:22

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