[[20140926115512]] 『ツリー形式のプルダウン作成について』(たんぐる) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ツリー形式のプルダウン作成について』(たんぐる)

初めて投稿させていただきます。

Excelのドロップダウンリストの中にドロップダウンリストを作りたいのですが
どなたかご存知の方がいらっしゃいましたらご教示ください。
例でたとえるとExcel等のメニューでツリー上に選択することを1つのプルダウンで行いたいです。

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 検索しただけですけれど、このあたりの適用でしょうか。

 TreeViewコントロールの使い方
http://officetanaka.net/Excel/vba/treeview/index.htm
(Mook) 2014/09/26(金) 12:51

 衝突!
 勘違いだったみたいだけど、標準機能のご紹介ということで・・・

 ┌─────────┐
 │新規作成     │
 │開く       │
 │上書き保存    │┌────────┐
 │名前をつけて保存▼││エクセルブック │
 │○○○○     ││マクロ有効ブック│
 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
 こういうメニューを作りたい、ということですか?

 標準機能(入力規則やフォームコントロール)では出来なかったと思いますが
 ユーザーフォームのマウスオーバーイベントなどを拾って似たようなものは作ることが出来ると
 思います。

 実装は結構知識が必要になると思いますので、
 おすすめはセルを二つ使って、「入力規則 リスト 連動」のやり方を推します。
http://www.excelist.net/faq/10.html
 参考

(稲葉) 2014/09/26(金) 12:58


すみません、イメージとしましては

プルダウンで下記のようにしたいと思っております。

 ┌─────────┐
 │新規作成     │
 │開く       │
 │上書き保存    │┌────────┐
 │名前をつけて保存▼││エクセルブック │
 │○○○○     ││マクロ有効ブック│
 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

色々しわべてみたのですが2階層(2つのセルのプルダウン)では可能なのですが
これを1つのセル(プルダウン)で選択したいと思っております。
(たんぐる) 2014/09/26(金) 14:59


 私には出来ませんので、他の方の返信をお待ちください。
(稲葉) 2014/09/26(金) 15:16

ドロップダウンリストでは不可能なので、ポップアップメニューを自作しましょう。
APIを多用するので、お薦めはしませんが…。

[シートモジュール]

 Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    ActiveCell.Value = fPop(Application.hwnd)
    Cancel = True
 End Sub

[標準モジュール]

 Public Const MF_STRING = &H0&
 Public Const MF_POPUP = &H10&
 Public Const TPM_LEFTALIGN = &H0&
 Public Const TPM_RETURNCMD = &H100&

 Public Type POINTAPI
   x As Long
   y As Long
 End Type

 Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As Long) As Long
 Private Declare Function CreatePopupMenu& Lib "user32" ()
 Private Declare Function AppendMenu& Lib "user32" Alias "AppendMenuA" (ByVal hMenu&, ByVal wFlags&, ByVal wIDNewItem&, ByVal lpNewItem As Any)
 Private Declare Function TrackPopupMenu& Lib "user32" (ByVal hMenu&, ByVal wFlags&, ByVal x&, ByVal y&, ByVal nReserved&, ByVal hwnd&, lpReserved As Any)
 Private Declare Function DestroyMenu& Lib "user32" (ByVal hMenu&)
 Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

 Public Function fPop(hwnd As Long) As Long
    Dim hMenu As Long
    Dim hMenu2 As Long
    Dim PT As POINTAPI

    hMenu = CreatePopupMenu()
    AppendMenu hMenu, MF_STRING, 1&, "test1"
    AppendMenu hMenu, MF_STRING, 2&, "test2"

    hMenu2 = CreatePopupMenu()
    AppendMenu hMenu2, MF_STRING, 3&, "test3"
    AppendMenu hMenu2, MF_STRING, 4&, "test4"
    AppendMenu hMenu, MF_POPUP, hMenu2, "test"

    GetCursorPos PT
    fPop = TrackPopupMenu(hMenu, TPM_LEFTALIGN Or TPM_RETURNCMD, PT.x - 8, PT.y - 8, 0, hwnd, ByVal 0&)

    DestroyMenu hMenu2
    DestroyMenu hMenu
 End Function
(???) 2014/09/26(金) 15:46

 #回答、思いっきりかぶりましたけれど、せっかく書いたので。

 マクロの CommandBars でのおあそび例です。

 標準モジュールに
 Sub popupMenu()
    With CommandBars.Add(Position:=msoBarPopup)
        With .Controls.Add
             .Caption = "選択A"
             .OnAction = "'SetSelectValue ""A""'"
             .FaceId = 481
        End With
        With .Controls.Add
             .Caption = "選択B"
             .OnAction = "'SetSelectValue ""B""'"
             .FaceId = 482
        End With
        With .Controls.Add(Type:=msoControlPopup)
            .Caption = "選択C"
            With .Controls.Add
                 .Caption = "選択C-1"
                 .OnAction = "'SetSelectValue ""C-1""'"
                 .FaceId = 483
            End With
            With .Controls.Add
                 .Caption = "選択C-1"
                 .OnAction = "'SetSelectValue ""C-2""'"
                 .FaceId = 484
            End With
        End With
        .ShowPopup
        .Delete
    End With
 End Sub

 Sub SetSelectValue(result)
    ActiveCell.value = result
 End Sub

 シートモジュールに
 Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    If Target.CountLarge <> 1 Then Exit Sub
    popupMenu
    Cancel = True
 End Sub

(Mook) 2014/09/26(金) 16:14


 Mookさんの面白いですね!
 activecell(s)のTypoも!

 勉強になりました。
(稲葉) 2014/09/26(金) 16:42

 ありゃ ><
 指摘ありがとうございます。

 修正しました。
(Mook) 2014/09/26(金) 16:45

やはり標準機能ではなくAPIを使用しないといけないのですね?
勉強になりました、ありがとうございました。
(たんぐる) 2014/09/26(金) 17:44

 私の例では、API 使っていないけれど・・・。

 瑣末なことですけれど、
    マクロ ≠ API
 です。

(Mook) 2014/09/26(金) 17:50


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.