Excel VBA質問箱 IV

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

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


2057 / 13645 ツリー ←次へ | 前へ→

【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 お礼[未読]

【70238】ドロップダウンリスト
質問  悩める老人  - 11/10/22(土) 22:56 -

引用なし
パスワード
   お世話になります。

下記のように先行するセルの入力内容に従って後続のセルのプルダウンリストが
変化するというDBシートを作ろうとしています。

EXCELシートで例えば 別途用意した ドロップダウンリストのもとになる
リストΑ リストΒ が用意されているとします。

いま
A1セルには   甲 か 乙   のいずれかが入力されるとします(固定のプルダウンリストにより入力)

この入力のイベントによりB1セルが選択される
さらに A1セルが 甲であれば B1セルに リストAに由来するプルダウンリスト、
また乙であれば B1セルに リストBに由来するプルダウンリストが作られる


この後半のプルダウンリストの使い分けをVBAコードでどう表現して良いのか苦慮しております。
宜しくお願いします。    

【70239】Re:ドロップダウンリスト
発言  ichinose  - 11/10/22(土) 23:21 -

引用なし
パスワード
   こんばんは。

入力規則のリスト内容の変更自体は、VBAはなくてもできます。


新規ブックにて(Sheet1、Sheet2というシートがある)、

Sheet2のセルA1からA5、b1からB5に

  A    B
1  a    f
2  b    g
3  c    h
4  d    i
5  e    j


このA1:A5のデータがリストA、b1:b5がリストBのデータだとします。

Sheet1にて、

セルA1の甲乙の設定は良いのですね!!

セルB1では、入力規則のリストで元の値に

「=IF($A$1="甲",INDIRECT("sheet2!a1:a5"),INDIRECT("sheet2!b1:b5"))」
(両端の「」は、除く)。

これで試してみてください。


>この入力のイベントによりB1セルが選択される
は、Changeイベントで可能ですね!!


>下記のように先行するセルの入力内容に従って後続のセルのプルダウンリストが
>変化するというDBシートを作ろうとしています。
>
>EXCELシートで例えば 別途用意した ドロップダウンリストのもとになる
>リストΑ リストΒ が用意されているとします。
>
>いま
>A1セルには   甲 か 乙   のいずれかが入力されるとします(固定のプルダウンリストにより入力)
>
>この入力のイベントによりB1セルが選択される
>さらに A1セルが 甲であれば B1セルに リストAに由来するプルダウンリスト、
>また乙であれば B1セルに リストBに由来するプルダウンリストが作られる
>
>
>この後半のプルダウンリストの使い分けをVBAコードでどう表現して良いのか苦慮しております。
>宜しくお願いします。

【70241】Re:ドロップダウンリスト
質問  悩める老人  - 11/10/23(日) 6:13 -

引用なし
パスワード
   ichinose さま

さっそくのアドバイスありがとうございます。

IF文は基本中の基本でありもちろん、理解できます。
Change駆動も基本中の基本であり理解できます。
INDIRECT関数は使ったことがありませんでした。

アドバイスに従い試してみました。
第1のセル(プルダウンリスト作成後)がブランクの時
 第2のセルは a
第1のセルで 甲 を 選択すると 第2のセルは A
第1のセルで 乙 を 選択すると 第2のセルは a
となります。
第2のセルには A か a のみが入力されることになります。

当方の理解がまだ十分でなくご迷惑をお掛けしますが、
結果的に 第2のセルにはプルダウンリストが形成されて
いません。

この第2のセルをプルダウンリストとし、このリストからの
選択が第3のセルの入力に影響を与えようとしているのですが。


▼ichinose さん:
>こんばんは。
>
>入力規則のリスト内容の変更自体は、VBAはなくてもできます。
>
>
>新規ブックにて(Sheet1、Sheet2というシートがある)、
>
>Sheet2のセルA1からA5、b1からB5に
>
>  A    B
>1  a    f
>2  b    g
>3  c    h
>4  d    i
>5  e    j
>
>
>このA1:A5のデータがリストA、b1:b5がリストBのデータだとします。
>
>Sheet1にて、
>
>セルA1の甲乙の設定は良いのですね!!
>
>セルB1では、入力規則のリストで元の値に
>
>「=IF($A$1="甲",INDIRECT("sheet2!a1:a5"),INDIRECT("sheet2!b1:b5"))」
>(両端の「」は、除く)。
>
>これで試してみてください。
>
>
>>この入力のイベントによりB1セルが選択される
>は、Changeイベントで可能ですね!!
>
>
>>下記のように先行するセルの入力内容に従って後続のセルのプルダウンリストが
>>変化するというDBシートを作ろうとしています。
>>
>>EXCELシートで例えば 別途用意した ドロップダウンリストのもとになる
>>リストΑ リストΒ が用意されているとします。
>>
>>いま
>>A1セルには   甲 か 乙   のいずれかが入力されるとします(固定のプルダウンリストにより入力)
>>
>>この入力のイベントによりB1セルが選択される
>>さらに A1セルが 甲であれば B1セルに リストAに由来するプルダウンリスト、
>>また乙であれば B1セルに リストBに由来するプルダウンリストが作られる
>>
>>
>>この後半のプルダウンリストの使い分けをVBAコードでどう表現して良いのか苦慮しております。
>>宜しくお願いします。

【70243】Re:ドロップダウンリスト
発言  ichinose  - 11/10/23(日) 10:14 -

引用なし
パスワード
   >アドバイスに従い試してみました。
>第1のセル(プルダウンリスト作成後)がブランクの時
> 第2のセルは a
>第1のセルで 甲 を 選択すると 第2のセルは A
>第1のセルで 乙 を 選択すると 第2のセルは a
>となります。
>第2のセルには A か a のみが入力されることになります。

では、新規ブックにて(Sheet1,Sheet2というシートは、最低存在するブック)、

標準モジュールに

'==================================================
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

上記のtestを実行してみてください。

正常に終了すれば(すぐに終わります)、

Sheet1の A1、B1にて試してみてください。

正常に作動するようでしたら、A1,B1の入力規則を確認して下さい。

【70248】Re:ドロップダウンリスト
質問  悩める老人  - 11/10/23(日) 19:48 -

引用なし
パスワード
   ▼ichinose さん:
>>アドバイスに従い試してみました。
>>第1のセル(プルダウンリスト作成後)がブランクの時
>> 第2のセルは a
>>第1のセルで 甲 を 選択すると 第2のセルは A
>>第1のセルで 乙 を 選択すると 第2のセルは a
>>となります。
>>第2のセルには A か a のみが入力されることになります。
>
>では、新規ブックにて(Sheet1,Sheet2というシートは、最低存在するブック)、
>
>標準モジュールに
>
>'==================================================
>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
>
>上記のtestを実行してみてください。
>
>正常に終了すれば(すぐに終わります)、
>
>Sheet1の A1、B1にて試してみてください。
>
>正常に作動するようでしたら、A1,B1の入力規則を確認して下さい。


ichinose 様:

さっそくのアドバイスありがとうございます。
module1に

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

を入力してこれを実行すると期待通りの挙動を示しました。

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

これを活かして
sheet1のA列に入力があるとB列にドロップダウンリスト生成
B列での選定が終わるとC列にドロップダウンが生成(B列の選定の種類に依存)
するようなコード作成のために

sheet1のworksheetに
下記のコード を入力し

Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  If Target.Column = 1 Then
    Cells(Target.Row, 1) = Date
  End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Column = 1 Then
    Cells(Target.Row, 2).Select
  ElseIf Target.Column = 2 Then
    Cells(Target.Row, 3).Select
  End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Column = 2 Then
    With Sheets("Sheet2")
      .Range("c1:c2").Value = [{"甲";"乙"}]
      With Cells(Target.Row, 2).Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                  xlBetween, Formula1:="=indirect(""sheet2!c1:c2"")"
      End With
    End With
  ElseIf Target.Column = 3 Then
    With Sheets("Sheet2")
      .Range("a1:b5").Value = [{"a","f";"b","g";"c","h";"d","i";"e","j"}]
      With Cells(Target.Row, 2).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 If

End Sub

sheet1のA列をダブルクリックしたところ、B列には 甲、乙のドロップダウンリストが生成
しかしながら このセル で 甲あるいは乙を選択しても C列にはドロップダウンリストが生成しませんでした。

【70249】Re:ドロップダウンリスト
質問  悩める老人  - 11/10/23(日) 19:57 -

引用なし
パスワード
   ▼悩める老人 さん:
>▼ichinose さん:
>>>アドバイスに従い試してみました。
>>>第1のセル(プルダウンリスト作成後)がブランクの時
>>> 第2のセルは a
>>>第1のセルで 甲 を 選択すると 第2のセルは A
>>>第1のセルで 乙 を 選択すると 第2のセルは a
>>>となります。
>>>第2のセルには A か a のみが入力されることになります。
>>
>>では、新規ブックにて(Sheet1,Sheet2というシートは、最低存在するブック)、
>>
>>標準モジュールに
>>
>>'==================================================
>>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
>>
>>上記のtestを実行してみてください。
>>
>>正常に終了すれば(すぐに終わります)、
>>
>>Sheet1の A1、B1にて試してみてください。
>>
>>正常に作動するようでしたら、A1,B1の入力規則を確認して下さい。
>
>
>ichinose 様:
>
>さっそくのアドバイスありがとうございます。
>module1に
>
>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
>
>を入力してこれを実行すると期待通りの挙動を示しました。
>
>ありがとうございました。
>
>これを活かして
>sheet1のA列に入力があるとB列にドロップダウンリスト生成
>B列での選定が終わるとC列にドロップダウンが生成(B列の選定の種類に依存)
>するようなコード作成のために
>
>sheet1のworksheetに
>下記のコード を入力し
>
>Option Explicit
>
>Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
>  If Target.Column = 1 Then
>    Cells(Target.Row, 1) = Date
>  End If
>End Sub
>
>Private Sub Worksheet_Change(ByVal Target As Range)
>  If Target.Column = 1 Then
>    Cells(Target.Row, 2).Select
>  ElseIf Target.Column = 2 Then
>    Cells(Target.Row, 3).Select
>  End If
>End Sub
>
>Private Sub Worksheet_SelectionChange(ByVal Target As Range)
>  If Target.Column = 2 Then
>    With Sheets("Sheet2")
>      .Range("c1:c2").Value = [{"甲";"乙"}]
>      With Cells(Target.Row, 2).Validation
>        .Delete
>        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
>                  xlBetween, Formula1:="=indirect(""sheet2!c1:c2"")"
>      End With
>    End With
>  ElseIf Target.Column = 3 Then
>    With Sheets("Sheet2")
>      .Range("a1:b5").Value = [{"a","f";"b","g";"c","h";"d","i";"e","j"}]
>      With Cells(Target.Row, 2).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 If
>
>End Sub
>
>sheet1のA列をダブルクリックしたところ、B列には 甲、乙のドロップダウンリストが生成
>しかしながら このセル で 甲あるいは乙を選択しても C列にはドロップダウンリストが生成しませんでした。


ichinose様:

申し訳ありません。
追記です。
先のイベント駆動させたコードを実行すると
B列全体に 甲、乙 を選択するドロップダウンリストができました。
本来は該当行(列Aでダブルクリックした行)だけにドロップダウンリストを作成したいと思っています。

【70251】Re:ドロップダウンリスト
発言  ichinose  - 11/10/23(日) 23:45 -

引用なし
パスワード
   まず、最初に投稿した下記のコードの意味を理解してください。
イベントモジュールに入れ込むのは、その後です。
本来は、最初の投稿の
>入力規則のリスト内容の変更自体は、VBAはなくてもできます。
を実現できなかった見たいだったので、入力規則だけで
別のセルの甲 乙の選択によって、当該セルのリスト内容を変えることができることを
VBAで実演したコードです。

20行程度のコードですから、1行1行何をしているのか理解してください。
そうすれば、
例えば、Sheet2に設定しているデータは、どこかのタイミングで
1度実行するか、予めVBAではなく、事前に設定するだけでよい事が
理解していただけるはずです。
>sheet1のA列をダブルクリックしたところ、B列には 甲、乙のドロップダウンリストが生成
>しかしながら このセル で 甲あるいは乙を選択しても C列にはドロップダウンリス
>トが生成しませんでした。
これも下記コードの入力規則を設定しているコードを良く調べてください。

特にどのセルの入力規則に元の値としてどんな数式を設定しているのか
その関係を良く見てください。

>本来は該当行(列Aでダブルクリックした行)だけにドロップダウンリストを作成したいと思っています。

でしたら、

>Private Sub Worksheet_SelectionChange(ByVal Target As Range)

このイベント内で入力規則の設定をする仕様を改めることです。
上記のイベントは、どんなときに発生するのですか?
そのことを考えてみてください。
他のイベントもどのタイミングで発生するのか再度調べてください。


申し訳ありませんが、私は、そのまま使えるコードの提示は、
極力しない投稿をここのところ心がけていますので、
ご理解ください


>>>'==================================================
>>>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

【70252】Re:ドロップダウンリスト
発言  悩める老人  - 11/10/24(月) 4:50 -

引用なし
パスワード
   ▼ichinose さん:
>まず、最初に投稿した下記のコードの意味を理解してください。
>イベントモジュールに入れ込むのは、その後です。
>本来は、最初の投稿の
>>入力規則のリスト内容の変更自体は、VBAはなくてもできます。
>を実現できなかった見たいだったので、入力規則だけで
>別のセルの甲 乙の選択によって、当該セルのリスト内容を変えることができることを
>VBAで実演したコードです。
>
>20行程度のコードですから、1行1行何をしているのか理解してください。
>そうすれば、
>例えば、Sheet2に設定しているデータは、どこかのタイミングで
>1度実行するか、予めVBAではなく、事前に設定するだけでよい事が
>理解していただけるはずです。
>>sheet1のA列をダブルクリックしたところ、B列には 甲、乙のドロップダウンリストが生成
>>しかしながら このセル で 甲あるいは乙を選択しても C列にはドロップダウンリス
>>トが生成しませんでした。
>これも下記コードの入力規則を設定しているコードを良く調べてください。
>
>特にどのセルの入力規則に元の値としてどんな数式を設定しているのか
>その関係を良く見てください。
>
>>本来は該当行(列Aでダブルクリックした行)だけにドロップダウンリストを作成したいと思っています。
>
>でしたら、
>
>>Private Sub Worksheet_SelectionChange(ByVal Target As Range)
>
>このイベント内で入力規則の設定をする仕様を改めることです。
>上記のイベントは、どんなときに発生するのですか?
>そのことを考えてみてください。
>他のイベントもどのタイミングで発生するのか再度調べてください。
>
>
>申し訳ありませんが、私は、そのまま使えるコードの提示は、
>極力しない投稿をここのところ心がけていますので、
>ご理解ください
>
>
>>>>'==================================================
>>>>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

ichinose 様

アドバイスありがとうございました。
じっくり検討させていただきます。
時間が多少掛かるかもしれませんが
宜しくお願いします。

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

引用なし
パスワード
   ▼悩める老人 さん:
>▼ichinose さん:
>>まず、最初に投稿した下記のコードの意味を理解してください。
>>イベントモジュールに入れ込むのは、その後です。
>>本来は、最初の投稿の
>>>入力規則のリスト内容の変更自体は、VBAはなくてもできます。
>>を実現できなかった見たいだったので、入力規則だけで
>>別のセルの甲 乙の選択によって、当該セルのリスト内容を変えることができることを
>>VBAで実演したコードです。
>>
>>20行程度のコードですから、1行1行何をしているのか理解してください。
>>そうすれば、
>>例えば、Sheet2に設定しているデータは、どこかのタイミングで
>>1度実行するか、予めVBAではなく、事前に設定するだけでよい事が
>>理解していただけるはずです。
>>>sheet1のA列をダブルクリックしたところ、B列には 甲、乙のドロップダウンリストが生成
>>>しかしながら このセル で 甲あるいは乙を選択しても C列にはドロップダウンリス
>>>トが生成しませんでした。
>>これも下記コードの入力規則を設定しているコードを良く調べてください。
>>
>>特にどのセルの入力規則に元の値としてどんな数式を設定しているのか
>>その関係を良く見てください。
>>
>>>本来は該当行(列Aでダブルクリックした行)だけにドロップダウンリストを作成したいと思っています。
>>
>>でしたら、
>>
>>>Private Sub Worksheet_SelectionChange(ByVal Target As Range)
>>
>>このイベント内で入力規則の設定をする仕様を改めることです。
>>上記のイベントは、どんなときに発生するのですか?
>>そのことを考えてみてください。
>>他のイベントもどのタイミングで発生するのか再度調べてください。
>>
>>
>>申し訳ありませんが、私は、そのまま使えるコードの提示は、
>>極力しない投稿をここのところ心がけていますので、
>>ご理解ください
>>
>>
>>>>>'==================================================
>>>>>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
>
>ichinose 様
>
>アドバイスありがとうございました。
>じっくり検討させていただきます。
>時間が多少掛かるかもしれませんが
>宜しくお願いします。

ichinose様

申し訳ありません。
追加です。
気にはなっていましたが、
 With Range("a1").Validation
 With Range("B1").Validation
では コード上、sheet1 を指定してませんが
これで 何故 sheet1の
セルA1およびセルB1の入力規制の削除、設定が
できるのでしょうか。
この設定するシートがもしsheet3だった場合、
どうなるのでしょうか。

【70254】Re:ドロップダウンリスト
発言  ichinose  - 11/10/24(月) 7:28 -

引用なし
パスワード
   おはようございます。


>>>>>>'==================================================
>>>>>>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に入力規則を設定します。


よく調べていただいているのですね!!
ミスを指摘して頂いて、感謝いたします。

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

【70267】Re:ドロップダウンリスト
発言  ichinose  - 11/10/25(火) 6:38 -

引用なし
パスワード
   おはようございます。


>ところが、初回の試行(真っ新のシート)の後で 試行を繰り返す場合、この Delete で一度 プルダウンリストが 削除される筈と思いますが、F8 のステップワイズでコードとセルの関係を追跡しても 削除されている様子が見えません。
>何故でしょうか。
新規ブックにて(Sheet1、Sheet2というシート名が存在する)、

標準モジュールに

'=======================================================
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
'==========================================================
Sub test2()
  With Worksheets("sheet1")
    .Range("a1").Select
    With .Range("a1").Validation
     .Delete
    End With
    With .Range("B1").Validation
     .Delete
    End With
  End With
  
End Sub


testを実行すれば、A1,B1に入力規則が設定されます。
test2では、入力規則の削除を行っていますが、A1のドロップダウンが残っています。
選択も出来てしまいます。

私は、非表示し忘れだと思います!!
まっ、A2を選択して、再度、A1を選択すれば、今度は、表示されないので
仕様だと言い張るのかなあ・・・、MS社は。


Sub test2()
  With Worksheets("sheet1")
    .Range("a1").Select
    With .Range("a1").Validation
     .InCellDropdown = False
     .Delete
    End With
    With .Range("B1").Validation
     .InCellDropdown = False
     .Delete
    End With
  End With
End Sub

このようにすれば、大きい問題はなさそうなので、良しとしますか?


>
>また、イベント駆動の方での1つのトラブル(B列へのドロップダウンリスト作成の暴走は sheet.change の コードがあるため、 Sub 〜 End Sub が
>1件づつで終了せず、イベント発生が無限ループに落ちっていることが分かりました。
解決したのなら、良いですが・・・、

  Application.EnableEvents というプロパティを調べてください。


  Application.EnableEvents = False


  とすれば、


  Application.EnableEvents = True

  にするまで、Excelイベントが発生しません。


>ただ、この段階ではC列にプルダウンリストが作成されません。
>引き続き検討します。 
ですね。
よく入力規則の設定セルとそこで設定している数式を良く調べて見てください。

【70269】Re:ドロップダウンリスト
お礼  悩める老人  - 11/10/26(水) 12:45 -

引用なし
パスワード
   ▼ichinose さん:
>おはようございます。
>
>
>>ところが、初回の試行(真っ新のシート)の後で 試行を繰り返す場合、この Delete で一度 プルダウンリストが 削除される筈と思いますが、F8 のステップワイズでコードとセルの関係を追跡しても 削除されている様子が見えません。
>>何故でしょうか。
>新規ブックにて(Sheet1、Sheet2というシート名が存在する)、
>
>標準モジュールに
>
>'=======================================================
>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
>'==========================================================
>Sub test2()
>  With Worksheets("sheet1")
>    .Range("a1").Select
>    With .Range("a1").Validation
>     .Delete
>    End With
>    With .Range("B1").Validation
>     .Delete
>    End With
>  End With
>  
>End Sub
>
>
>testを実行すれば、A1,B1に入力規則が設定されます。
>test2では、入力規則の削除を行っていますが、A1のドロップダウンが残っています。
>選択も出来てしまいます。
>
>私は、非表示し忘れだと思います!!
>まっ、A2を選択して、再度、A1を選択すれば、今度は、表示されないので
>仕様だと言い張るのかなあ・・・、MS社は。
>
>
>Sub test2()
>  With Worksheets("sheet1")
>    .Range("a1").Select
>    With .Range("a1").Validation
>     .InCellDropdown = False
>     .Delete
>    End With
>    With .Range("B1").Validation
>     .InCellDropdown = False
>     .Delete
>    End With
>  End With
>End Sub
>
>このようにすれば、大きい問題はなさそうなので、良しとしますか?
>
>
>>
>>また、イベント駆動の方での1つのトラブル(B列へのドロップダウンリスト作成の暴走は sheet.change の コードがあるため、 Sub 〜 End Sub が
>>1件づつで終了せず、イベント発生が無限ループに落ちっていることが分かりました。
>解決したのなら、良いですが・・・、
>
>  Application.EnableEvents というプロパティを調べてください。
>
>
>  Application.EnableEvents = False
>
>
>  とすれば、
>
>
>  Application.EnableEvents = True
>
>  にするまで、Excelイベントが発生しません。
>
>
>>ただ、この段階ではC列にプルダウンリストが作成されません。
>>引き続き検討します。 
>ですね。
>よく入力規則の設定セルとそこで設定している数式を良く調べて見てください。


ichinose 様

いろいろご丁寧にアドバイスをいただき、ありがとうございました。

イベント駆動でも期待した通りの動きを確認できました。


入力規則の削除の件についてはまだ検討中ですが、3台のPC中、2台では
削除できるを確認しましたので何か設定が違うのではないかと思っています。


確かに
Application.EnableEvents = False
(私自身、これと Application.ScreenUpdating = False とを多用しております)を使えば、イベントのバッティングが防げます。

また、同じcolumnに change駆動とsheet_change駆動を併用するとオカシナことが生じます。

最終的には、このどちらかのみを使うことで上手くいきました。
本当にありがとうございました。

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