|
▼つ〜じ〜 さん:
こんにちは。
ようやく現象を確認しました。
再現手順です。
・新規ブックのシート名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イベント等を使用して)、
イベントの順序が処理によって違うのであきらめました。
確認してください。
|
|