• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルでフォームのDropDownとオートフィルタのDropDown)

エクセルでフォームのDropDownとオートフィルタのDropDown

このQ&Aのポイント
  • エクセルでフォームのDropDownとオートフィルタのDropDownについて
  • VBAの書き方だとフォームのDropDownとオートフィルター、そして入力規則のリストの識別が難しい
  • Shapesコレクションを使用せず、古いDrawingObjectsコレクションを使って識別する方法を求めている

質問者が選んだベストアンサー

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

意図が理解できません。 『DrawingObjectsコレクションは古い書き方だから使いたくないのでShapesで回したい』 という事ではなかったのですか? OLEObjectsは別に古くないからそのまま使えば良いだけでは? どうしてもShapesで回したいなら Dim s As Shape For Each s In ActiveSheet.Shapes   If s.Type = msoOLEControlObject Then     Debug.Print s.Name, s.OLEFormat.ProgId   End If Next とでも? #以下個人的意見。 [ActiveXコントロール]をシート上に多数配置して使うのは個人的にはあまり好きではありません。 >素直にDrawingObjectsを使う事をおすすめします。 って書いたように、[フォーム]コントロールは元々Excelライブラリのものですから、 シート上に配置したとしても親和性が高く、『古い』というより『枯れて安定している』ように思います。 安定した[フォーム]コントロールを使うのであればそれに適したDrawingObjectsコレクションを使うのが良いでしょう。 何に拘りがあるのかわかりませんが、扱うObjectによってよりベターな手法を選択するのが普通だとおもいますけど?

merlionXX
質問者

お礼

何度もありがとうございます。 shapeでまわした場合は.OLEFormat.ProgId で取得できるんですね、初めて知りました。 別にたいしてこだわりがあるわけではないんです。 先ほども書いたようにOLEオブジェクトはなじみがないので書き方自体を知らず、今回は実験的なコードで試していて湧いた疑問だったのです。 end-uさまにはご丁寧にご回答いただきましてほんとうにありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

>あくまでShapeとしてとらえて、そのなかでのDropDownの識別方法を... 言い切ってしまっていいものかどうか一抹の不安はありますが、 他には無いようです。 FormControlTypeまで一緒ですから、 ご提示コードのように、アクセスしたらエラーが出るプロパティがある事を利用するしかないと思います。 Sub test()   Dim s As Shape   Dim n As Long   With ActiveSheet     For Each s In .Shapes       If s.Type = msoFormControl Then         If s.FormControlType = xlDropDown Then           If ddChk(s) Then             n = n + 1           End If         End If       End If     Next     MsgBox "DropDowns " & n & "/Shapes " & .Shapes.Count   End With End Sub Function ddChk(ByRef dd As Object) As Boolean   On Error Resume Next   ddChk = (VarType(dd.Locked) = vbBoolean)   On Error GoTo 0 End Function >Shapesコレクションを使用せず、古いDrawingObjectsコレクションを持ち出せば >オートフィルターや入力規則は最初から対象外となるのは存じております... 素直にDrawingObjectsを使う事をおすすめします。 『古い』やり方をしたくないならば『古い』オブジェクトを使わない事です。 [フォーム]コントロールのコンボボックスはExcel.DropDownです。 (ExcelライブラリのDropDownクラス。オブジェクトブラウザで[非表示のメンバを表示]して確認できます) Excelライブラリのものを扱う時に、 同じExcelライブラリで用意されてるDrawingObjectsコレクションを使う事を 私は古いとは思えないんですけどね。

merlionXX
質問者

お礼

ご回答ありがとうございます。 >『古い』やり方をしたくないならば『古い』オブジェクトを使わない事です。 なるほどそのとおりですね。 実は新しいOLEオブジェクトはこれまで使ったことがなく、なじみがないのです。 フォームコントロールをやめて全部OLEオブジェクトに変えれば問題はなくなりますね。 試行錯誤の結果、 Sub test1()   With ActiveSheet     For Each s In .OLEObjects       i = i + 1       .Cells(i, 1) = s.Name       .Cells(i, 2) = s.progID     Next s   End With End Sub でなんとか、名前と種類が特定できるようになりましたが、これも For Each s In .OLEObjects をFor Each s In .Shapes にすると、progIDがエラーになり、種類を判別できません。 古いフォームコントロールは使わないとすると、どうやってOLEObjectの種類を区別したらよいのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • kybo
  • ベストアンサー率53% (349/647)
回答No.1

フォームのコンボボックスだけの数が数えればいいのでしょうか? Sub macro() Dim i As Integer, Obj As DropDown For Each Obj In ActiveSheet.DropDowns i = i + 1 Next MsgBox i & "個、フォームのコンボボックスがあります。" End Sub

merlionXX
質問者

お礼

すみません。わたしの質問が手を抜き過ぎてました。 もちろんDropDownsコレクションで行けるのは、DrawingObjects同様存じております。 ただ、DropDownsコレクションも、DrawingObjectsコレクションとおなじく古いやりかたですよね。それに手を抜いてコンボボックスのことしか書きませんでしたが、実際にはワークシート上の他のmsoFormControlも対象とするのです。 ですからあくまでShapeとしてとらえて、そのなかでのDropDownの識別方法を探していたのです。ごめんなさい。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • オートフィルターのような機能をフォーム上で VBA

    いつも大変お世話になっております。 Excel2003を使用しております。 フォーム上で、オートフィルターのような機能を作りたいと思っています。 http://okwave.jp/qa/q8423348.html 過去の質問のプログラムを何度も使わせて頂いております。 フィルターをかけたら、可視セルを抽出し、コンボボックスに登録…ということを しています。 フォーム上のコンボボックスが変更されたら フィルターをかけ、コンボボックスのリストを更新するようにしていますが、 更新したときに、またフィルターをかけてコンボボックスを更新してしまい どうしたら上手く処理がいくのか分からなくなってしまいました。 現状、 Combobox1_Changeのとき、  If Combobox1<>"" Then   フィルターをかける   コンボボックスのリストを抽出する   コンボボックスを更新する  Else   フィルターを全開にする   コンボボックスのリストを抽出する   コンボボックスを更新する  End if こういった手段をとっています。 しかし、このままですとコンボボックスを更新するときに 毎回フィルターが全開?になってしまいます。 何か良い方法があれば、教えて下さい。 よろしくお願い致します。

  • エクセルのオートシェープ削除について

    セルE9:J9までに斜めの斜線を引いて、削除するマクロを 初心者なりに作成しました。 斜線作成は以下のような感じです。 Set myRng = Range("E9:J9") For Each sp In ActiveSheet.Shapes If Not Intersect(Range(sp.TopLeftCell,sp.BottomRightCell), myRng) Is Nothing Then sp.Delete End If Next Set myRng = Nothing で、フォームのボタンに登録させて罫線作ります。 ついでにリドゥボタン(戻る)も作成してやってみたのですが 以下のような感じで Set myRng = Range("E9:J9") For Each sp In ActiveSheet.Shapes If Not Intersect(Range(sp.TopLeftCell, sp.BottomRightCell), myRng) Is Nothing Then sp.Delete End If Next Set myRng = Nothing ですが、L9にリスト表示(入力規則のリストを設定)させたら If Not Intersect(Range(sp.TopLeftCell, sp.BottomRightCell), myRng) Is Nothing Then のところで1004エラーがでます。 リストはどうしても使用しなければならないので、どうしたらよいか? どなたか詳しい方おられましたら、ご指導おねがいします。

  • オートフィルタがかかっていて、なおかつ抽出中なら

    オートフィルタがかかっていて、なおかつ抽出中なら、 という状態をvbaで取得する方法はありますか? Sub Sample() If ActiveSheet.AutoFilterMode = True Then End If End Sub これだと、 オートフィルタがかかっているだけでも、反応してしまいます。 「行番号が青色になってるのなら」 と同じ状態にしたいのですが、 どういうコードになりますか?

  • EXCELでオートフィルタに失敗

    表題の件、初心者なので、どなたか教えて頂けると 有難いです。。。 現状は下記の通りです。 住所名前等のリストを作成し、ある列を 入力規則で「リストから選択」にしています (空白セルもあります) その列にオートフィルタをかけて、ある条件の ものだけを抽出していたのですが、リストが664を 超えたところから、それ以降の行はオートフィルタ に反映されません。 何か、オートフィルタの限界のようなものがあって、 一定の行までしか反映されないのでしょうか。 要領を得ない質問で申し訳ないのですが、 宜しくお願いいたします。

  • Excelで作成した住所録にオートフィルタをかけ、ユーザーフォームで1件ずつ表示

    エクセル2007を使用して住所録を作成しています。 一行に1名ずつの情報(各列に氏名など)が入るようになっています。 A列にリスト番号・B列に氏名、といった感じで作成しています。 一覧表示だと列の数が多く個別の内容が分かりにくいため、 ユーザーフォームを使って1件ずつ詳細を見られるようにしました。 ユーザーフォームに付けたコマンドボタン「次」を押すと 順番(住所録リストの上から順)に個別の内容が表示されるように したのですが、オートフィルタをかけてしまうと 非表示のリストもユーザーフォームに表示されてしまいます。 そこで、いくつかの参考書などを使って組んでみたのですが、 私の作ったものではコマンドボタン「次」を押すと オートフィルタで表示されている一番下の リストにユーザーフォームの内容が飛んでしまいます。 どのようにすれば、オートフィルタで表示されているリストのみを 順番にユーザーフォームに表示ができるのでしょうか? 私が作ったものです。↓ Private Sub cmd次_Click() Dim r As Range, rr As Range, rs As Range If Not Worksheets("名簿").AutoFilterMode Then  データ行 = データ行 + 1 Else Set r = Worksheets("名簿").Range("A3", Range("A" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible) For Each rr In r For Each rs In rr.Areas データ行 = rs.Row Next rs Next  End If 表示データ変更 End Sub このような質問で分かりにくいようでしたらすみません。 どなたかご教授いただければ幸いです。

  • エクセルのオートフィルターがかかっていたら消すVBA

    いつもお世話になっております。 作業が終了して全てのシートを初期化する場合に、オートフィルターで抽出した状態でデータを消すと、隠れていた部分が残ってしまいます。 もし、そのシートのA1~D1までにフィルターがかかっていたら、フィルターを消す、かかっていなければ、そのままシート全体のデータを消すというマクロはどう書けばよろしいのでしょうか? -例- Sheets("ABC").Select If Range(Cells(1,1),Cells(1,4))にフィルターがかかっていたらThen  フィルターを消す  Cells.ClearContents Else Cells.ClearContents End If こんなことをしたいのですが、伝わりましたでしょうか? よろしくご指南くださいませ。

  • オートフィルタをフォーム上(VBA)で実現 2回目

    http://okwave.jp/qa/q8423348.html 前回も、オートフィルタをフォーム上で実現させる方法について 質問させていただきました。 Excel2003を仕様しております。 一通り、オートフィルタをフォーム上で再現することは出来たのですが、 使い方が悪いのか、上手く表示できないことがあります。 例) ユーザーフォーム上にCombobox1~Combobox3まであります。 Comboboxどれかが変更されたら、空のコンボボックスのリストを再取得します。 ----------------------------------------------- Sub Combobox_Renew_ChangeJob(ByVal ComboboxName As Object, ByVal ColumnNumber As Long) Application.ScreenUpdating = False '画面更新しない(ちらつき防ぐ) With ThisWorkbook.Worksheets("データ") If ComboboxName = "" Then 'コンボボックスが空だった場合 .Select .Range("A1").AutoFilter Field:=ColumnNumber 'フィルター解除! ElseIf ComboboxName <> "" Then 'コンボボックスが空じゃない場合 .Select .Range("A1").AutoFilter Field:=ColumnNumber, Criteria1:=ComboboxName.Text End If Result = WorksheetFunction.Subtotal(3, Range("B:B")) 'B列の可視セルがいくつあるか If Result = 1 Then MsgBox "一致するデータはありませんでした。" & vbCrLf & " 再度絞り込みなおしてください。" .Select .Range("A1").AutoFilter Field:=ColumnNumber 'フィルター解除! ComboboxName = "" End If End With Call ComboBox_Renewal 'コンボボックス更新 End Sub ------------------------------------------------------------ Sub ComboBox_Renewal() Application.ScreenUpdating = False '画面更新しない(ちらつき防ぐ) Dim LastData As Long With ThisWorkbook.Worksheets("データ") .Select LastData = Cells(Rows.Count, 2).End(xlUp).Row 'B列最終行を取得 If (Me.ComboBox1 = "") Then Me.ComboBox1.Clear Me.ComboBox1.List = Module1.Get_Unique_and_Visible_List(.Range("E2:E" & LastData)) '[E] Me.ComboBox1.AddItem "" Else Result = Combo1.ListIndex Me.ComboBox1.Clear Me.ComboBox1.SetFocus End If If (Me.ComboBox2 = "") Then Me.ComboBox2.Clear Me.ComboBox2.List = Module1.Get_Unique_and_Visible_List(.Range("C2:C" & LastData)) '[C] Me.ComboBox2.AddItem "" End If If (Me.ComboBox3 = "") Then Me.ComboBox3.Clear Me.ComboBox3.List = Module1.Get_Unique_and_Visible_List(.Range("D2:D" & LastData)) '[D] Me.ComboBox3.AddItem "" End If End With End sub ------------------------------------ Private Sub ComboBox1_AfterUpdate() Application.ScreenUpdating = False '画面更新しない(ちらつき防ぐ) With ThisWorkbook.Worksheets("データ") Call Combobox_Renew_ChangeJob(ComboBox1, .Range("E1").Column) End With End Sub Private Sub ComboBox2_AfterUpdate() Application.ScreenUpdating = False '画面更新しない(ちらつき防ぐ) With ThisWorkbook.Worksheets("データ") Call Combobox_Renew_ChangeJob(ComboBox2, .Range("C1").Column) End With End Sub Private Sub ComboBox3_AfterUpdate() Application.ScreenUpdating = False '画面更新しない(ちらつき防ぐ) With ThisWorkbook.Worksheets("データ") Call Combobox_Renew_ChangeJob(ComboBox3, .Range("D1").Column) End With End Sub ----------------------------------------- 上記の方法を使っていますが、 Comboboxに値を全て入れたあと、 絞り込みされていると考え、リストを更新しておりません。 そのため、最初のほうにコンボボックスにデータを入力したものは 選択できてしまいます。 一番最初に選んだComboboxは、 リストが全て残っている状態です。 そのため、他のComboboxで絞り込んだ後、 一番最初に選んだComboboxでは他の値が選択できてしまいます。 説明が下手で分かりにくいかもしれませんが… 何か良い改善方法があれば、教えて頂きたいです! よろしくお願い致します!!

  • エクセルVBA Web上のフォームのIDを知る方法

     今晩は,質問させていただきます.どうぞよろしくお願いいたします.  エクセルVBAでWeb上のテキストボックスに文字を入力→ボタンを押す といった作業をいたしたく検索をしておりますと、以下のようなコードを書いてくださってておりました。 (http://billboardtop100.net/2011/03/dim-objie-as-object-dim-obj-as-object.htmlからの転載になります)   If Obj.ID = "searchText" Then     Obj.Value = "任天堂"   Else     If Obj.ID = "searchButton" Then       Obj.Click       Exit For     End If   End If  全てうまくうごき、非常に理解しやすいコードなのでございますが、これらフォームの「ID」を予めどのようにして調べらるのでございましょうか??  もしお詳しい方がいらっしゃいましたら,アドバイスいただきたくどうぞお願いいたします。

  • エクセルのオートフィルタ

    エクセルシートにデータが3000個近くあるんですけどオートフィルタで「すべて」を選んでもリストの中には3000個全部が表示されません。 どうしたらよいでしょうか? 番号    x 4562    1 25466   1 23694   1 21456   1 58498   1 4588     1 5787    1 8946    1 14586    1 85446    1  ・     ・  ・     ・ このように数値がバラバラに並んでいて見たい数値(例えば8946)がエクセルシートの表の中にはあるのにオートフィルタのリストをクリックして、見るとそこには8946がないんです。「すべて」を選んでるのにリストをクリックしてもないのはどうしてでしょうか?オプションの設定で範囲もきちんとしたんですが。数に制限でもあるんでしょうか?お願いします。

  • エクセルでオートフィルタをかけて並び替え

    エクセルでオートフィルタをかけて並び替え並べをした時、 ふりがなを使わない並べ替えを行を行いたいのですが・・・ 住所録のリストがあり、住所の入力の手間を軽減させるために、よく使う住所は単語登録してあります。ex.【き】→大阪市北区とか 通常手入力したリストや他のデータから持ってきたリストも混ざっているので、オートフィルタをかけて昇降順(住所順)に並びかえたいのですがふりがな順になりうまくいきません。ふりがなを直せばいいのでしょうが大量にあり困難です。 よろしくお願いします。

このQ&Aのポイント
  • Windows7のパソコンでマウスのペアリングができない問題についてお困りですか?接続が表示されず、マウスが使えない状態では困りますよね。そこで、アダプタの取り付けや接続方法について詳しく説明します。
  • Windows7のパソコンでマウスのペアリングができない問題に遭遇したことはありませんか?アダプタを取り付けたのに接続が表示されず、マウスが使えない状態に困ってしまいますよね。ここでは、接続ができるようにするための方法を解説します。
  • Windows7のパソコンでマウスのペアリングができない問題に悩んでいませんか?アダプタを取り付けても接続が表示されず、マウスが使用できない状況では作業に支障が出ますよね。そこで、接続の方法や注意点について詳しく説明します。
回答を見る

専門家に質問してみよう