Excel VBA質問箱 IV

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

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


1478 / 13646 ツリー ←次へ | 前へ→

【74162】ドロップボックスリストの自動表示についてい ぶんぶん 13/4/22(月) 18:04 質問[未読]
【74163】Re:ドロップボックスリストの自動表示につ... UO3 13/4/23(火) 7:05 発言[未読]
【74164】Re:ドロップボックスリストの自動表示につ... UO3 13/4/23(火) 9:31 発言[未読]
【74168】Re:ドロップボックスリストの自動表示につ... ぶんぶん 13/4/23(火) 13:40 発言[未読]
【74169】Re:ドロップボックスリストの自動表示につ... UO3 13/4/23(火) 14:31 発言[未読]
【74173】Re:ドロップボックスリストの自動表示につ... ぶんぶん 13/4/26(金) 9:23 発言[未読]
【74174】Re:ドロップボックスリストの自動表示につ... UO3 13/4/26(金) 11:41 発言[未読]
【74176】Re:ドロップボックスリストの自動表示につ... ぶんぶん 13/4/26(金) 13:14 発言[未読]
【74177】Re:ドロップボックスリストの自動表示につ... UO3 13/4/26(金) 13:42 発言[未読]
【74179】Re:ドロップボックスリストの自動表示につ... ぶんぶん 13/4/26(金) 18:42 発言[未読]
【74180】Re:ドロップボックスリストの自動表示につ... UO3 13/4/26(金) 20:19 発言[未読]
【74181】Re:ドロップボックスリストの自動表示につ... UO3 13/4/26(金) 20:25 発言[未読]
【74182】Re:ドロップボックスリストの自動表示につ... ぶんぶん 13/4/26(金) 20:51 お礼[未読]

【74162】ドロップボックスリストの自動表示につい...
質問  ぶんぶん  - 13/4/22(月) 18:04 -

引用なし
パスワード
   Windows7
Excel2010を使用しています。

シートにドロップボックスリストがいくつかあります。入力を簡易にするために自動でリストを開き、選択したら次のリストが開く、すべてが選択し終わったら閉じるというようなマクロを作成したいのですが、上手くいきません。

以下のようなものを作ったのですが、まずシートがアクティブになった時(最初はすべてのセルが空欄になるようにしてあります)
「選択その1」のセルのリストが開きません。
「選択その1」を選択後は次々と開いていくのですが、最後の「選択その4」を選択し終わった後もリストが閉じません。
さらにそのあと別のシートを開いた後もその新たに開いたシートのドロップダウンリストが開いてしまいます。

問題点、解決法を教えていただければありがたいです。よろしくお願いします。


Private Sub Worksheet_Change(ByVal Target As Range)

  SendKeys "%{Down}"

  If Range("選択その1").Value <> "" Then

    Range("選択その2").Activate
  
    If Range("選択その2").Value <> "" Then
  
      Range("選択その3").Activate
    
      If Range("選択その3").Value <> "" Then
  
        Range("選択その4").Activate
        
        If Range("選択その4").Value <> "" Then
        
          Range("選択その1").Activate
          
          SendKeys "%{Up}"
        End If

      End If
    End If
  Else
    
    Range("選択その1").Activate
  End If

SendKeys "%{Up}"

End Sub

【74163】Re:ドロップボックスリストの自動表示に...
発言  UO3  - 13/4/23(火) 7:05 -

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

おはようございます
時間がないので一般的なことのみ。

シートがアクティブになった時のイベントは
Worksheet_Activate で捕捉します。
シートがアクティブではなくなったときのイベントは
Worksheet_Deactivate で捕捉します。

Worksheet_Change この名称からは、シートがかわったときという印象を持ちますが
このイベントは、「シート上のセルの値に変更があったとき」に発生します。

Worksheet_Activate には、1つだけ留意点があります。
ブックが開かれたときに、アクティブになっているシートに対しては
その時点で、Activate イベントが発生しません。
ですので、ThisWorkbookモジュールの Workbook_Open あたりでアクティブシートが
当該のシートであれば強制的に、処理してやることが必要です。

【74164】Re:ドロップボックスリストの自動表示に...
発言  UO3  - 13/4/23(火) 9:31 -

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

おはようございます

先ほどは説明をよく読まないままレスした部分がありました。

>シートがアクティブになった時(最初はすべてのセルが空欄になるようにしてあります)

とありますので、別途、Sheet_Activate が書かれていて、そこでセルを空白にしておられるのでしょうね。
でなので、その空白にする行為から発生する Sheet_Changeイベント処理ということだったんですね。

いずれにせよ、申し上げた通り、最初はActivateが発生しませんので、そのあたりを考慮されたら
よろしいのかなと。

If 文のネスト制御にかんしては、この制御でいいのかなぁと思うところもありますが。
選択その1から選び、選択その2から選ぶと、選択その3ではなく、選択その1にフォーカスがいきませんか?

それと、ALt/↓ でリストが開くわけですが、、Alt/↑ は、どんな操作を意図しておられるのですか?

【74168】Re:ドロップボックスリストの自動表示に...
発言  ぶんぶん  - 13/4/23(火) 13:40 -

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

なるほど、最初はSheet_Activateで処理したほうがいいのですね、道理です。

Ifのネストについては説明不足でした。最終的には「その1」をアクティブにしてリストを閉じた状態にしたいということです。

Alt/↑ は、これでリストが閉じるはず、だと思ったんですが閉じません。一応自分の思考過程を理解してもらうためにそのまま削除しないで残しました。

【74169】Re:ドロップボックスリストの自動表示に...
発言  UO3  - 13/4/23(火) 14:31 -

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

>Alt/↑ は、これでリストが閉じるはず、だと思ったんですが閉じません。

開かれたリストは以下で閉じることができますね。

・リストから選択(あたりまえですが)
・別のセルを選択
・Escキーをおしても閉じますね。

【74173】Re:ドロップボックスリストの自動表示に...
発言  ぶんぶん  - 13/4/26(金) 9:23 -

引用なし
パスワード
   すいません、いろいろ試してみたのですがまだわからないのでよろしくお願いします。
たとえば下のようなマクロでリストから選択しても一度開いたリストは、値を選択しても閉じませんよね。
もちろんほかのセルを選択したりEscキーでは閉じることができますが、マクロで閉じることはできないのでしょうか?

Private Sub Worksheet_change(ByVal Target As Range)

  SendKeys "%{Down}"

End Sub

【74174】Re:ドロップボックスリストの自動表示に...
発言  UO3  - 13/4/26(金) 11:41 -

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

>たとえば下のようなマクロでリストから選択しても一度開いたリストは、値を選択しても閉じませんよね。
>もちろんほかのセルを選択したりEscキーでは閉じることができますが、マクロで閉じることはできないのでしょうか?
>
>Private Sub Worksheet_change(ByVal Target As Range)
>
>  SendKeys "%{Down}"
>
>End Sub

よく理解できないのですが Changeイベントということは、どうリストが開かれたかどうか別にして
リストから選んだ、その時のイベントですよね?
で、その時にこのコードを走らせると
・もともとリストが開かれていた
・で、リストから選んでセルに書き込まれた
・そのままにしておけば、リストは自動的に閉じる。
・なのに、セルに書き込まれたのでChangeイベントが発生して
 SendKeys "%{Down}" が実行される。
・なので【当然】また、リストが開いてしまう。
こうなるのが自然では?

このChangeイベントが存在する意味は何でしょうか?
これをやめてしまうえば リストから選んだあとは閉じますよ?

【74176】Re:ドロップボックスリストの自動表示に...
発言  ぶんぶん  - 13/4/26(金) 13:14 -

引用なし
パスワード
   リストが複数あるので、入力を簡易にするために
リストその一を選択する

リストその二が自動で開く

リストその二を選択する

リストその三が・・・・

というものをつくりたいのです。

【74177】Re:ドロップボックスリストの自動表示に...
発言  UO3  - 13/4/26(金) 13:42 -

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

要件がよく呑み込めていません。
ところで、もしかして大きな勘違いをしていたかもしれません。
ドロップボックスというのは入力規則のリスト型だと思っていたのですが
そうではなく、フォームツール等のコンボボックスのことでしたか?

もし、入力規則のことでしたら、たたき台として新規ブックのSheet1に
選択その1 〜 選択その4 まで定義し、それぞれに入力規則のリストを設定したうえで
ThisWorkbookモジュールに以下を貼り付け、いったん保存して閉じてから
もう一度、開いてみてください。

こんな動きなんでしょうか?

Option Explicit

Const shn As String = "Sheet1" '対象シート名

Private Sub Workbook_Open()
  If ActiveSheet Is Sheets(shn) Then ListShow ActiveSheet.Range("選択その1")
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
  If Sh Is Sheets(shn) Then ListShow Sh.Range("選択その1")
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  If Not Sh Is Sheets(shn) Then Exit Sub
  
  Select Case Target.Address
    Case Sh.Range("選択その1").Address
      ListShow Sh.Range("選択その2")
    Case Sh.Range("選択その2").Address
      ListShow Sh.Range("選択その3")
    Case Sh.Range("選択その3").Address
      ListShow Sh.Range("選択その4")
    Case Sh.Range("選択その4").Address
      ListShow Sh.Range("選択その1")
  End Select
End Sub

Private Sub ListShow(r As Range)
  SendKeys "%{Down}"
  r.Activate
End Sub

【74179】Re:ドロップボックスリストの自動表示に...
発言  ぶんぶん  - 13/4/26(金) 18:42 -

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

完成に近いのです。ただ、「その4」を選択した後(1〜4のセルが空欄で無くなった場合)に「その1」が選択された状態で、且つリストが閉じてほしいのですが・・・・。

【74180】Re:ドロップボックスリストの自動表示に...
発言  UO3  - 13/4/26(金) 20:19 -

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

Workbook_SheetChange のみ以下と入れ替えて試してみてください。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  Dim myR As Range
  
  If Not Sh Is Sheets(shn) Then Exit Sub
  Set myR = Union(Sh.Range("選択その1"), Sh.Range("選択その2"), Sh.Range("選択その3"), Sh.Range("選択その4"))
  If Intersect(Target, myR) Is Nothing Then Exit Sub
  If WorksheetFunction.CountA(myR) = 4 Then
    Sh.Range("選択その1").Activate
    Exit Sub
  End If
  Select Case Target.Address
    Case Sh.Range("選択その1").Address
      ListShow Sh.Range("選択その2")
    Case Sh.Range("選択その2").Address
      ListShow Sh.Range("選択その3")
    Case Sh.Range("選択その3").Address
      ListShow Sh.Range("選択その4")
    Case Sh.Range("選択その4").Address
      ListShow Sh.Range("選択その1")
  End Select
End Sub

【74181】Re:ドロップボックスリストの自動表示に...
発言  UO3  - 13/4/26(金) 20:25 -

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

もしかして「その4」が選択された時のみ、1〜4が空欄かどうかを判定したかったのでしょうか。
それなら以下です。

両方試して、イメージに合うのがどちらか(あるいは、どちらでもないか)確認願います。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  Dim myR As Range
  
  If Not Sh Is Sheets(shn) Then Exit Sub
  
  Select Case Target.Address
    Case Sh.Range("選択その1").Address
      ListShow Sh.Range("選択その2")
    Case Sh.Range("選択その2").Address
      ListShow Sh.Range("選択その3")
    Case Sh.Range("選択その3").Address
      ListShow Sh.Range("選択その4")
    Case Sh.Range("選択その4").Address
      If WorksheetFunction.CountA(Union(Sh.Range("選択その1"), Sh.Range("選択その2"), _
                  Sh.Range("選択その3"), Sh.Range("選択その4"))) = 4 Then
        Sh.Range("選択その1").Activate
      Else
        ListShow Sh.Range("選択その1")
      End If
  End Select
End Sub

【74182】Re:ドロップボックスリストの自動表示に...
お礼  ぶんぶん  - 13/4/26(金) 20:51 -

引用なし
パスワード
   74180のほうで完璧です。
ちょっと内容がすぐに理解できないので、これから勉強させていただきます。

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

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