Excel VBA質問箱 IV

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

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


11996 / 76734 ←次へ | 前へ→

【70266】Re:ドロップダウンリスト
質問  悩める老人  - 11/10/24(月) 23:59 -

引用なし
パスワード
   ▼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列にプルダウンリストが作成されません。
引き続き検討します。 

4 hits

【70238】ドロップダウンリスト 悩める老人 11/10/22(土) 22:56 質問
【70239】Re:ドロップダウンリスト ichinose 11/10/22(土) 23:21 発言
【70241】Re:ドロップダウンリスト 悩める老人 11/10/23(日) 6:13 質問
【70243】Re:ドロップダウンリスト ichinose 11/10/23(日) 10:14 発言
【70248】Re:ドロップダウンリスト 悩める老人 11/10/23(日) 19:48 質問
【70249】Re:ドロップダウンリスト 悩める老人 11/10/23(日) 19:57 質問
【70251】Re:ドロップダウンリスト ichinose 11/10/23(日) 23:45 発言
【70252】Re:ドロップダウンリスト 悩める老人 11/10/24(月) 4:50 発言
【70253】Re:ドロップダウンリスト 悩める老人 11/10/24(月) 5:20 質問
【70254】Re:ドロップダウンリスト ichinose 11/10/24(月) 7:28 発言
【70266】Re:ドロップダウンリスト 悩める老人 11/10/24(月) 23:59 質問
【70267】Re:ドロップダウンリスト ichinose 11/10/25(火) 6:38 発言
【70269】Re:ドロップダウンリスト 悩める老人 11/10/26(水) 12:45 お礼

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