Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


9815 / 13644 ツリー ←次へ | 前へ→

【24896】セルのロックについて つ〜じ〜 05/5/12(木) 19:28 質問[未読]
【24899】Re:セルのロックについて ichinose 05/5/12(木) 22:43 発言[未読]
【24919】Re:セルのロックについて つ〜じ〜 05/5/13(金) 19:37 質問[未読]
【24933】Re:セルのロックについて ichinose 05/5/14(土) 12:06 発言[未読]
【24975】Re:セルのロックについて つ〜じ〜 05/5/16(月) 15:36 質問[未読]
【24990】Re:セルのロックについて ichinose 05/5/16(月) 20:43 発言[未読]
【25321】Re:セルのロックについて つ〜じ〜 05/5/28(土) 14:48 お礼[未読]

【24896】セルのロックについて
質問  つ〜じ〜  - 05/5/12(木) 19:28 -

引用なし
パスワード
   宜しく御願い致します。

Office XP を使っております。

Worksheet_Changeイベントを使って、
シート内のあるセルに入力があったら、
他のセルをロックするというマクロを組みました。

ロックの仕方は以下のとおりです。

    'ロックする
    Cells(i, 8).Locked = flg

変数flgはboolean型で、
あるセルが空文字であればfalse、
空文字でなければTrueになります。

あるセルの文字を削除すればロックが解除されますし、
何か入力すればロックされる仕掛けです。

問題はここからなのですが、
あるセルを入力規則のリストのドロップダウンリストから入力した場合、
ロックされないのです。

マクロをステップインで確認すると、
flg = True となっているのに、
Cells(i, 8).LockedはFalseのままとなって次へ進みます。

理由がわからずとても困っております。
皆さんのレスをお待ちしております。
宜しく御願い致します。

【24899】Re:セルのロックについて
発言  ichinose  - 05/5/12(木) 22:43 -

引用なし
パスワード
   ▼つ〜じ〜 さん:
こんばんは。

>宜しく御願い致します。
>
>Office XP を使っております。
>
>Worksheet_Changeイベントを使って、
>シート内のあるセルに入力があったら、
>他のセルをロックするというマクロを組みました。
>
>ロックの仕方は以下のとおりです。
>
>    'ロックする
>    Cells(i, 8).Locked = flg
>
>変数flgはboolean型で、
>あるセルが空文字であればfalse、
>空文字でなければTrueになります。
>
>あるセルの文字を削除すればロックが解除されますし、
>何か入力すればロックされる仕掛けです。
>
>問題はここからなのですが、
>あるセルを入力規則のリストのドロップダウンリストから入力した場合、
>ロックされないのです。
>
>マクロをステップインで確認すると、
>flg = True となっているのに、
>Cells(i, 8).LockedはFalseのままとなって次へ進みます。
>
>理由がわからずとても困っております。
>皆さんのレスをお待ちしております。
>宜しく御願い致します。
Excel2002において新規ブックの標準モジュールに以下のコードを
実行しました。

'================================================
Sub test()
  Range("i1:i5").Value = Application.Transpose(Array("a", "b", "c", "d", "e"))
  With Range("a1").Validation
    .Delete
    .Add Type:=xlValidateList, _
      AlertStyle:=xlValidAlertStop, _
      Operator:=xlBetween, _
      Formula1:="=$I$1:$I$5"
    End With
End Sub

これでアクティブシートのセルA1に入力規則(リスト)が設定されます。
次にアクティブシートのシートモジュールに

'=========================================================
Private Sub Worksheet_Change(ByVal Target As Range)
  With Target
    If .Address = "$A$1" Then
     If .Value = "" Then
       .Locked = False
     Else
       .Locked = True
       End If
     End If
    End With
End Sub

というイベントプロシジャーを記述しました。

これで検証した結果、
リストから選択した場合でもLockedプロパティはTrueに設定されます。

こういう不具合の場合、コードと再現手順を記述してください。

【24919】Re:セルのロックについて
質問  つ〜じ〜  - 05/5/13(金) 19:37 -

引用なし
パスワード
   レスありがとうございます!

いろいろ触っていたらちゃんと動作しない(ロックしない)原因を突き止めました。
入力規則を設定しているセルはH列にあるのですが、
以下のような関数を使ってそのH列を参照していました。

参照セル内の関数は =STRCUT(H75)

'「:項目名」を省いた文字列を返す
Function STRCUT(str As String) As String

  'コロンが文字列内にある
  If InStr(1, str, ":") <> 0 Then

    '「項番:」を省いた文字列を返す
    STRCUT = Mid(str, 1, InStr(1, str, ":") - 1)

  Else
  
    '空文字を返す
    STRCUT = ""
  
  End If
 
End Function

参照セルの =STRCUT(H75) をクリアしたら、
ちゃんとロックされるようになりました。

ただ、参照するとロックされない理由がわかりません。
ご面倒だと思いますが、宜しくお願いいたします。

あと、質問の仕方がおかしければその点もご指摘ください。
レスをお待ちしております。

【24933】Re:セルのロックについて
発言  ichinose  - 05/5/14(土) 12:06 -

引用なし
パスワード
   ▼つ〜じ〜 さん:
こんにちは。

>
>いろいろ触っていたらちゃんと動作しない(ロックしない)原因を突き止めました。
>入力規則を設定しているセルはH列にあるのですが、
>以下のような関数を使ってそのH列を参照していました。
>
>参照セル内の関数は =STRCUT(H75)
>
>'「:項目名」を省いた文字列を返す
>Function STRCUT(str As String) As String
>
>  'コロンが文字列内にある
>  If InStr(1, str, ":") <> 0 Then
>
>    '「項番:」を省いた文字列を返す
>    STRCUT = Mid(str, 1, InStr(1, str, ":") - 1)
>
>  Else
>  
>    '空文字を返す
>    STRCUT = ""
>  
>  End If
> 
>End Function
>
>参照セルの =STRCUT(H75) をクリアしたら、
>ちゃんとロックされるようになりました。
>
>ただ、参照するとロックされない理由がわかりません。
数式による(ユーザー定義関数も含めて)値の変化で
Changeイベントは発生しないですよ!!
Calculateイベントは発生しますが・・・。

【24975】Re:セルのロックについて
質問  つ〜じ〜  - 05/5/16(月) 15:36 -

引用なし
パスワード
   ▼ichinose さん:
レスありがとうございます!

>数式による(ユーザー定義関数も含めて)値の変化で
>Changeイベントは発生しないですよ!!
>Calculateイベントは発生しますが・・・。

いえ、数式による値の変化でロックしたかったのではなく、
入力規則のドロップダウンリストから文字列を選択したらChangeイベントが発生し、
そこでロックがかかるように記述しておりました。

ステップインで確認したのですが、
【24919】のSTRCUT関数で参照されたセルのドロップダウンリストを変更(空文字以外)して、
Changeイベントを発生させてもロックがFalseになったままロックされないのです。

もしよろしければ、【24899】で作っていただいたマクロを実行して出来た入力規則のセルを、
【24919】のSTRCUT関数でどこかのセルから参照させ、Changeイベントを発生させてロックされるか確認していただけないでしょうか?

なぜロック出来ないのか気になって気になって。。。
お手数おかけいたします。
宜しく御願い致します。

【24990】Re:セルのロックについて
発言  ichinose  - 05/5/16(月) 20:43 -

引用なし
パスワード
   ▼つ〜じ〜 さん:
こんにちは。
ようやく現象を確認しました。

再現手順です。

・新規ブックのシート名Sheet1のセルA1に入力規則(リスト)を
 設定することを考えます。

・同じシートのセルG1〜G3にそれぞれ
 aa:bbbbb
 bbb:cccc
 ccc:dddd

とでも入力しておきます。

セルA1を選択し、入力規則のリストを選択します。

元の値として「$G$1:$G$3」を指定します。

とここまでは普通の入力規則の設定です。

・標準モジュールにユーザー定義関数STRCUTを記述します。

'======================================================
Public Function strcut(mystr) As String

  'コロンが文字列内にある
  If InStr(1, mystr, ":") <> 0 Then

    '「項番:」を省いた文字列を返す
    strcut = Mid(mystr, 1, InStr(1, mystr, ":") - 1)

  Else
 
    '空文字を返す
    strcut = ""
 
  End If
 
End Function


・Sheet1のモジュールに以下のコードを記述します。

'=================================
Private Sub Worksheet_Change(ByVal Target As Range)
  With Target
    If .Address = "$A$1" Then
     If .Value = "" Then
       .Locked = False
     Else
       .Locked = True
       End If
     End If
    End With
End Sub


・最後にSheet1のセルB1に
 「=STRCUT(A1)」と指定します。


これで設定完了です。
セルA1にリストを使用して値を設定してください。

Changeイベントは発生していますが、Lockedプロパティは変更されません。
(値のクリアとリストから選択したときのマクロの実行順序が違うみたい)

但し、この現象、Excel2002では確認しましたが、Excel2000では確認できません
(つまり、Excel2000では正常に作動しています。)。

ちなみにExcel2002でもセルB1に「=a1」なんていうユーザー定義以外の数式の場合、
正常に作動します。
Excel2002のバグのような気がしますが・・・。

どなたかExcel2003で確認してみてください。
(私は、持っていないので・・)

で対応策としては、
STRCUTの内容は、数式だけでも可能なので、

セルB1に

「=IF(ISERR(FIND(":",A1)),"",MID(A1,1,FIND(":",A1)-1))」

としてしまうか・・・・。


ユーザー定義関数をセルB1に指定しないで、
Sheet1のイベントモジュール(Changeイベント内で使用)を以下のように
変更するか・・・。
'==============================================================
Private Sub Worksheet_Change(ByVal Target As Range)
  Application.EnableEvents = False
  With Target
    If .Address = "$A$1" Then
     If .Value = "" Then
       .Locked = False
     Else
       .Locked = True
       End If
     Range("b1").Value = strcut(.Value)
     End If
    End With
  Application.EnableEvents = True
End Sub

セルB1のユーザー定義関数を残したままでも何とかなるかな?
と思いましたが(Calculateイベント等を使用して)、
イベントの順序が処理によって違うのであきらめました。

確認してください。

【25321】Re:セルのロックについて
お礼  つ〜じ〜  - 05/5/28(土) 14:48 -

引用なし
パスワード
   ▼ichinose さん:

返事が大変遅くなり申し訳ございません。

ありがとうございました!

おかげさまで何とかマクロを完成することが出来ました。

本当にありがとうございました。

9815 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free