|
▼ichinose さん:
>おはようございます。
>
>
>>>>>>>'==================================================
>>>>>>>Option Explicit
>>>>>>>Sub test()
>>>>>>> With Sheets("Sheet2")
>>>>>>> .Range("a1:b5").Value = [{"a","f";"b","g";"c","h";"d","i";"e","j"}]
>>>>>>> .Range("c1:c2").Value = [{"甲";"乙"}]
>>>>>>> With Range("a1").Validation
>>>>>>> .Delete
>>>>>>> .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
>>>>>>> xlBetween, Formula1:="=indirect(""sheet2!c1:c2"")"
>>>>>>> End With
>>>>>>> With Range("B1").Validation
>>>>>>> .Delete
>>>>>>> .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
>>>>>>> xlBetween, Formula1:= _
>>>>>>> "=if(a1=""甲"",indirect(""sheet2!a1:a5""),indirect(""sheet2!b1:b5""))"
>>>>>>> End With
>>>>>>> End With
>>>>>>>End Sub
>
>>気にはなっていましたが、
>> With Range("a1").Validation
>> With Range("B1").Validation
>>では コード上、sheet1 を指定してませんが
>
>私のミスです。
>
>>これで 何故 sheet1の
>>セルA1およびセルB1の入力規制の削除、設定が
>>できるのでしょうか。
>
>標準モジュールに上記コードがある場合、
>シート名を省略すると、アクティブシートのセルだと認識します。
>(Range("A1")と記述すると、Application.Range("A1")と同値)
>Sheet1をアクティブにして、実行されれば正常に作動しますが、
>他のシートをアクティブにすれば、別のシートに入力規則を設定してしまいます。
>
>シートモジュールにコードがある場合は、
>シート名を省略すると、コードを記述しているシートのセルだと認識します。
>よって、シートの記述を省略しても、正常に作動しますが、
>良い記述では、ないですね。
>
>
>このように訂正してください。
>
>Sub test()
> With Worksheets("Sheet2")
> .Range("a1:b5").Value = [{"a","f";"b","g";"c","h";"d","i";"e","j"}]
> .Range("c1:c2").Value = [{"甲";"乙"}]
> End With
> With Worksheets("sheet1")
> With .Range("a1").Validation
> .Delete
> .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
> xlBetween, Formula1:="=indirect(""sheet2!c1:c2"")"
> End With
> With .Range("B1").Validation
> .Delete
> .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
> xlBetween, Formula1:= _
> "=if(a1=""甲"",indirect(""sheet2!a1:a5""),indirect(""sheet2!b1:b5""))"
> End With
> End With
>End Sub
>
>
>上記の
>> With Worksheets("sheet1")
>を
>> With Worksheets("sheet3")
>にすれば、Sheet3に入力規則を設定します。
>
>
>よく調べていただいているのですね!!
>ミスを指摘して頂いて、感謝いたします。
ichinose 様
恐れ入ります。
おっしゃる通り、リスト自体はVBAに関係なく作成できるため、
今回は、下記のコード部分を省略し
With Worksheets("Sheet2")
.Range("a1:b5").Value = [{"a","f";"b","g";"c","h";"d","i";"e","j"}]
.Range("c1:c2").Value = [{"甲";"乙"}]
End With
かわりに sheet2の A1〜A5セルに a〜e、 B1〜B5セルに f〜j、 C1セルに
甲、 C2セルに 乙 を事前に入力して検討しました。
ところで、下記のコードで Delete は入力規制を削除することを示していますね。
With .Range("a1").Validation
.Delete
.AddType:=xlValidateList,AlertStyle:=xlValidAlertStop,Operator:= _
xlBetween, Formula1:="=indirect(""sheet2!c1:c2"")"
End With
ところが、初回の試行(真っ新のシート)の後で 試行を繰り返す場合、この Delete で一度 プルダウンリストが 削除される筈と思いますが、F8 のステップワイズでコードとセルの関係を追跡しても 削除されている様子が見えません。
何故でしょうか。
また、イベント駆動の方での1つのトラブル(B列へのドロップダウンリスト作成の暴走は sheet.change の コードがあるため、 Sub 〜 End Sub が
1件づつで終了せず、イベント発生が無限ループに落ちっていることが分かりました。
単純に sheet.change の コードを 削除することによって B列の該当行1行分にのみ 甲、乙のプルダウンリスト が 作成できました。
ただ、この段階ではC列にプルダウンリストが作成されません。
引き続き検討します。
|
|