• ベストアンサー

ExcelのVBAで

Excel2007のVBAで以下のことは可能でしょうか? Sheet1の上にコンボボックス(アイテムリスト)とコマンドボタン(配置用ボタン)を設置しています。 コンボボックスよりユーザーがアイテムを選択してコマンドボタンを押すことで対応するアイテムの画像をシートに挿入します。 シートに挿入する画像は、最大100アイテムを予定しています。 困っている部分が、挿入したアイテムをユーザーがマウスでクリックしたときに VBAでどの画像が選択されたかを判断することは可能でしょうか? アイテムがクリックされると同時にクリックされたアイテムのコードや名称等の諸元データを特定のセルに表示をしたいという事が行いたいのです。 以上、何かヒントや解決方法があればご教授願います。 図の挿入に関しては下記のロジックで挿入しています。 Private Sub CommandButton1_Click() dim pc(100) as shape dim flname as string '画像のファイル名は、"pic" + コード + ".jpg" 'A1にはコンボボックスで選択されたコードが設定されています。 flname = "pic" & Worksheets("sheet1").Range("a1").Value & ".jpg" 'idxはGlobal変数です。 idx = idx + 1 Set pc(idx) = ActiveSheet.Shapes.AddPicture(Filename:=flname, LinkToFile:=True, savewithdocument:=False, Left:=Selection.Left, Top:=Selection.Top, Width:=100#, Height:=100#) end sub

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

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

>Set pc(idx) = ActiveSheet. ・・・・・ '取込写真に代替テキスト設定 With pc(idx)   '取込写真に代替テキスト設定   .AlternativeText = アイテムのコードや名称等の諸元データ   '写真をクリックしたときにShapeClick プロシージャを   '実行するようにします。   .OnAction = "ShapeClick" End With Sub ShapeClick()   特定セル.Value = ActiveSheet.Shapes(Application.Caller).AlternativeText End Sub

zauber99
質問者

お礼

上記補足での問題、自己解決しました。 ShapeClick()のサブルーチンの最後に ActiveSheet.Shapes(Application.Caller).Select とすると、画像が選択した状態(移動やリサイズ可能)になりました。 ただし、新たな問題が発生しました。 同じ画像を挿入した場合、画像を選択すると一番最初に挿入した画像が選ばれてしまい、2番目以降の画像が選択できなくなりました。 原因は、画像挿入時に同じファイル名を使用している為、Excel上の画像の名前が同じ名前になっている為だとまでは検討がつきました。 が、どうやって解決出来るのか悩んでいます。 何か良い解決策があればご教授下さい。 画像の挿入時に下記の命令で行っていますが、この場合、同じ画像を挿入した場合、ファイル名が同じとなり区別がつかなくなっていると思われます。 ActiveSheet.Shapes.AddPicture(Filename:=flname, LinkToFile:=True, savewithdocument:=False, Left:=Selection.Left, Top:=Selection.Top, Width:=100#, Height:=100#)

zauber99
質問者

補足

watabe007様 回答ありがとうございます。 回答して頂いた内容で試したところ、無事解決しました。(画像をクリックした際に特定セルに思惑通り諸元が表示出来ました。) ただしこの方式の場合、新たな問題が発生しました。(Excelの仕様で仕方が無いのかもしれませんが) というのも画像をクリックした時に今までだと画像が変更できる状態(移動やリサイズ)だったものがクリックイベントが優先されるためか 画像が移動もリサイズも出来ない状態になりました。 マウスの右ボタンを押せば、今まで通り移動やサイズ変更が可能になることは確認できたのですが、使う人の都合で出来れば右ボタンは 使いたく無いというのが希望です。 何か他に解決方法はありませんでしょうか?

その他の回答 (2)

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

コンボボックス関係ないのね……。 先に良い回答が出て居ますが、私も各シェイプのAlternativeText に情報を持たせた方が良いと思います。 AlternativeText は、本来はブラウザが画像を読み込んでいる間に代わりに表示する文字列ですが、ここに諸元データを入れてしまっても問題ないでしょう。

zauber99
質問者

お礼

自己解決しました。 諸元データを書き込む際に.nameにユニークな名前を与えて 識別出来ました。 アドバイス頂いた方々ありがとうございました。

zauber99
質問者

補足

mt2008様 当方の拙い質問で申し訳ありませんでした。 ただ、watabe007様の回答の補足に追記させて頂きましたがAlternativeTextの方式の場合、新たな問題が発生しました。 他に何か解決策があればご教授願います。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

シートとコンボボックスの連係が良く判らないと言うことでしょうか? VBAじゃないですが、ご参考までに……。 アイテム名とコードが並んだリストはシート上に有りますよね。 例えば、A10:B15にそのリストがあるとします(A列がアイテム名、B列がコード)。 コンボボックスのプロパティにListFillRangeと言う項目がありますので、ここに「Sheet1!A10:A15」と入力します。 次にLinkedCellに、「Sheet1!A2」と入力します。 これで、コンボボックスのリストにはA10:A15の項目が表示され、選択されたアイテムはA2に表示されます コードを表示したいなら、A2の値を使って、次のセル式を表示したいセル(A1?)に =VLOOKUP(A2,A10:B15,2,FALSE) これ以外の諸元データは何を指しているのか不明なので省略します。 まったく的外れの回答でしたらごめんなさい。

zauber99
質問者

補足

mt2008様 回答ありがとうございました。 ご回答頂いた内容は、今回の問題箇所と違う部分がありますので質問を補足させて頂きます。 コンボボックスより選択したアイテムの画像をコマンドボタンCLICK時にシート上に挿入します。 挿入されるアイテム数は100アイテムとします。 ユーザーが挿入されたアイテムをマウスでクリックした時にシートの左側に諸元を表示したいのが要件です。 問題点としては、挿入した画像のイベントをどうやって拾うのか?(イベントが発生するのか?) イベントが発生し、クリックした画像が特定できればご回答頂いた内容の様にvlookup関数やVBAでシートに諸元を表示する事は可能だと思っています。 画面のサンプルで説明すると、ユーザーはコンボボックスより赤色と青色の画像を選択し配置しました。 配置した青色の画像をクリックする事によりシート左側に諸元を表示したいと言う事です。(赤い画像を選べば赤の画像の諸元を表示) まだ説明不足な点があると思いますが宜しくお願い致します。

関連するQ&A

  • Excel VBA

    Excelのコンボボックスについての質問です。 sheet(1)のA2~A20までコンボボックスに入る選択肢が入っています。 フォーム1のコンボボックス1にその選択肢を入れたいのですが、なるべく短いコードを教えていただきたいのですが…。 ちなみに私の知っているコードは コンボボックス1.Additem Range("シート1!A2") コンボボックス1.Additem Range("シート1!A3")      ・      ・      ・ という感じです。 どうかよろしくお願いいたします。

  • エクセルのVBAについて教えてください。

    以前に下記のような内容のプログラムを作成したいと投稿致しましたら dim row as Integer for row = 1 to 65535 if (selectSheet.Cells(1, row) = "") then selectSheet.Cells(1, row) = "#####" EndIf をアレンジしたいのです。 上記のプログラムが構築されているコマンドボタンと同じuserformにオプションボタンを5個、コンボボックスを一つ作りました。 オプションボタン1を選択するとコンボボックスにはあ行が。 オプションボタン2を選択するとコンボボックスにはか行が。 オプションボタン3を選択するとコンボボックスにはさ行が。 オプションボタン4を選択するとコンボボックスにはた行が。 オプションボタン5を選択するとコンボボックスにはな行が。 選択できるようにしたいのです。 次に選んだオプションボタンと同名前のシートに上記の#####が入力されるようにしたいのですが、どのようにすればいいのですか? このように教えて頂きました。 Public myop As Integer 'オプション選択保持用 Private Sub CommandButton1_Click() Dim row As Integer Dim mykey As String '比較キー '選択したオプションボタンにより '比較キーと選択保持用変数に各値を代入 Select Case True Case OptionButton1: mykey = "[あ-お]*": myop = 1 Case OptionButton2: mykey = "[か-こ]*": myop = 2 Case OptionButton3: mykey = "[さ-そ]*": myop = 3 Case OptionButton4: mykey = "[た-と]*": myop = 4 Case OptionButton5: mykey = "[な-ほ]*": myop = 5 Case Else: myop = 0 End Select If myop = 0 Then Exit Sub For row = 1 To 65535 If ActiveSheet.Cells(1, row).Value Like mykey Then ActiveSheet.Cells(1, row) = "#####" End If Next row End Sub これを流用して自分でいじりたいのですが、私が未熟ですので、コードの意味、役割がさっぱりわかりません。 わがままな質問ではございますが、どなたか上記のコードの意味を教えて頂けませんか? よろしくお願い致します。

  • Excel VBA 図をクリップボード介さずコピー

    Excelシートのアイコンの画像をクリップボードを使わずにコピーするVBAコードを教えてください。 (Windows10,Excel2016) 具体的には、 1) Sheet1を選択する。 2) 挿入タブのアイコンをクリックする。 3) しばらくするとアイコンの挿入のウインドウが表示される。 4) アクセシビリティに9つのアイコンが表示されているので   一番左のアイコンをクリックしてチェックマークを付けて   右下の挿入ボタンをクリックする 5) Sheet1に車椅子のアイコンが挿入される(左側の図参照)。 6) このアイコンを選択すると左上のボックスにグラフィックス 1と表示される。 VBAで、Sheet1のシートの車椅子のアイコンをコピーして、 Sheet2のシートの同じ位置に貼り付ける場合、 以下のようなコードでは、 四角形全体が塗りつぶされたアイコンになってしまいます(右側の図参照) 車椅子のアイコンにするにはどのように記述すればよいでしょうか。 ------------------------------------- Sub test()  Dim myType As MsoAutoShapeType  Dim myLeft As Integer  Dim myTop As Integer  Dim myWidth As Integer  Dim myHeight As Integer  Sheets("sheet1").Select  Sheets("sheet1").Shapes("グラフィックス 1").Select    myType = Selection.ShapeRange.AutoShapeType  myLeft = Selection.ShapeRange.Left  myTop = Selection.ShapeRange.top  myWidth = Selection.ShapeRange.Width  myHeight = Selection.ShapeRange.Height  Sheets("sheet2").Select  ActiveSheet.Shapes.AddShape(myType, myLeft, myTop, myWidth, myHeight).Select End Sub -------------------------------------

  • エクセルVBA

    初心者です エクセル2003 ユーザーフォームのコンボボックスの連携について教えてください   Seet1       A     B     C     D      E     F           1   種類1   商品1  商品A  商品あ        コンボ1  2   種類2   商品2  商品B  商品い 3   種類3   商品3  商品C  商品う                4   種類4   商品4  商品D  商品え        コンボ2 5   種類5   商品5  商品E  商品お (1)コンボボックス1と2を別々のユーザーフォームで配置(ダブルクリックにて表示 F1とF4) (2)コンボボックス1でA列の種類を選択によりコンボボックス2のリストが変わる (3)コンボボックス1で選んだ種類をF1のセルに挿入 (4)コンボボックス2は種類1の場合はB列             種類2の場合はC列             種類3の場合はD列のリストとします (5)コンボボックス2で選択した商品をF4に挿入といった具合です 何度か挑戦しましたが、同一ユーザーフォームにコンボボックス2つは成功するのですが うまくいきません コード及びコード記入場所を教えていただけませんか よろしくお願いいたします

  • エクセル2007のVBAの困りごと

    教えてください。 画像挿入時にエクセルのセルの大きさに合わせるマクロを使っているのですが、エクセル2000、2003では問題なく動くのですが、2007だと、うまくVBAが動かず、画像が縮小・拡大されません。 わかるかた教えてください。 コード  Dim c As Range, cm As Range Application.ScreenUpdating = False For Each c In Selection Set cm = c.MergeArea If c.Address = cm.Item(1).Address Then If Application.Dialogs(xlDialogInsertPicture).Show = False    Then Exit Sub  With Selection .Left = cm.Left .Top = cm.Top .Height = cm.Height .Width = cm.Width End With End If Next Set cm = Nothing

  • VBAのデータ抽出について

     列  A   B   C 行1 番号  色   形  2  1   白   丸  3  2   赤   三角  4  1   赤   丸  5  3   黄   四角 (1)Excel Sheet1にコマンドボタン1があり、それをクリックするとUserForm1が表示されます。 (2)UserForm1には「番号」「色」「形」の各コンボボックス1,2,3が配置されています。 (3)各コンボボックス1,2,3に表示されるのは、Sheet1の各列のデータです。 (4)コンボボックス1,2,3のうち1つ選択→その条件に合うデータを抽出。  コンボボックス1,2,3のうち2つ選択→その2つの条件に合うデータを抽出。  コンボボックス1,2,3のうち3つ選択→その3つの条件にあるデータを抽出。 (5)Sheet1のコマンドボタン2をクリックすると、Sheet1は元のデータ一覧に戻る。 というようなプログラムを組みたいと思っています。 (4)のデータ抽出、(5)の戻し方がよくわかりません。 どなたかご教授下さい。

  • エクセルVBAについて教えてください

    エクセル2003です。 Sheet1     A    B    C     D 1 種類1 商品1 商品A  商品あ 2 種類2 商品2 商品B  商品い 3 種類3 商品3 商品C  商品う  4      商品4 商品D  商品え 5  商品5 商品E  商品お Sheet2   AB CDF     G    H     I 1         種類表示     商品表示  2         種類表示     商品表示  3         種類表示     商品表示  4         種類表示     商品表示  5         種類表示     商品表示  *Sheet2のG1をダブルクリックでSheet1のA列をユーザーフォームのコンボボックス1にてセルに表示  の上挿入 *コンボ1の選択によりコンボ2(Sheet2のI1をダブルクリック)の表示を変更する *コンボ1 種類1 → コンボ2 Sheet1のB列を表示の上セルに挿入 *コンボ1 種類2 → コンボ2 Sheet1のC列を表示の上セルに挿入 *コンボ1 種類3 → コンボ2 Sheet1のD列を表示の上セルに挿入 までは、出来きたのですが、Sheet2の2行目以降も同作業をしたいのですが、、、 Offset等を使用するのでしょうか? あまりわかっていないので詳しく教えて頂ければ幸いです コード Sheet2のコード Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True With Target If .Address = "$F$1" Then UserForm1.Show ElseIf .Address = "$H$1" Then Dim k As Long, myFlg As Boolean, myArray myArray = Array("種類1", "種類2", "種類3") myFlg = False For k = 0 To UBound(myArray) If Range("F1") = myArray(k) Then myFlg = True End If Next k If myFlg = False Or Range("F1") = "" Then MsgBox "種類を選択して", vbOKOnly Range("F1").Select Exit Sub End If UserForm2.Show End If End With End Sub ユーザーフォーム1のコード Private Sub UserForm_Initialize() ComboBox1.RowSource = "sHEET1!A1:A3" End Sub コンボ1のコード Private Sub ComboBox1_Change() Worksheets("Sheet2").Range("F1") = UserForm1.ComboBox1.Text Worksheets("Sheet2").Range("H1") = "" Unload Me End Sub ユーザーフォーム2のコード Private Sub UserForm_Initialize() With UserForm2.ComboBox1 Select Case Worksheets("Sheet2").Range("F1") Case "種類1" .RowSource = "Sheet1!B1:B5" Case "種類2" .RowSource = "Sheet1!C1:C5" Case "種類3" .RowSource = "Sheet1!D2:D5" End Select End With End Sub コンボ2のコード Private Sub ComboBox1_Change() Worksheets("Sheet2").Range("H1") = UserForm2.ComboBox1.Text Unload Me End Sub このコードをいじくってSheet2以降も同作業できるようにお願いします

  • エクセルVBA コンボBOXの相互連動

    皆さんこんにちは。 エクセル2013を使用しています。 ネットや本では 地方名>都道府県名>市町村名のような 順にコンボボックスで行う絞り込み検索の方法が たくさん載っています。 コンボボックス1を選択しないとコンボボックス2・3の 選択肢は表示されないようなものです。 ですが、私がやりたいのは どのコンボボックスから選択しても 残りのコンボボックスが連動するものを作りたいのです。 おそらくやりたい事はオートフィルターだ!と思ったので 今、私の知りうる数少ない知識を駆使した結果がこれです。 (1)原本Sheetをコピー→コンボ用Sheetを作成 (2)コンボ用SheetのA~C列を列ごとに重複除去をし  除去した内容をE~F列に記載 (3)E~Fの内容をコンボボックス1~3のコントロールにする (4)コンボボックスのどれかを選択すると  そのコンボボックスのTEXTでオートフィルターがかかる、  原本Sheet対応列を絞り込み (5)コンボ用Sheetを削除 (1)~(5)エンドレス・・・みたいなコードでやりたい事に対応出来ましたが 何しろシートのコピー・削除が何回もあるので 重くて重くてとても使い物にはなりません。 どうにか重くならずに同じような作動をするコードはないでしょうか。 このような感じで原本Sheetは作成されております。 [原本Sheet]     A    B    C 1   駅名  顧客名  店舗名 2   ○    △    □ 3   ○    ▲    ■ 4   ◎    △    □ 5   ◎    ▽    ◇ 6   ●     ▽    ◆

  • vbaについて教えてください

    エクセルでワークシートに貼ったコマンドボタンをクリックするとユーザーフォームを呼び出してかつ、ユーザーフォーム上のコンボボックスに指定フォルダ下のフォルダを表示するものを作りました。 ユーザーフォーム上のコンボボックスに表示されたフォルダを切替選択するとリストボックスにそのフォルダ下のファイルを表示させたいのですがやり方がわかりませんので教えてください。

  • エクセルVBAでコンボボックス(2)

    少し前に次の質問をしました。 http://okwave.jp/qa/q6703161.html 前回の質問は、エクセルシート上に置いたコンボボックスに初期値として リストを表示させたいという内容です。(セル上の値を持ってくるのではなくて) この質問は以下のコードで解決したとお礼欄に書きました。 Private Sub ComboBox1_DropButtonClick() ComboBox1.Style = fmStyleDropDownList ComboBox1.Clear ComboBox1.AddItem "りんご" ComboBox1.AddItem "ばなな" ComboBox1.AddItem "みかん" End Sub ユーザーは、リストから選ぶときに、DropButtonをクリックします。そのときに コードに記述したリストがリストに入力されるという仕組みです。 さて、これを実際に動かしてみると、リストが表示されるのはいいのですが、 目的のものをクリックしても、選ばれた状態になりません。 動作詳細説明: ドロップボタンをクリックすると、コンボボックスからべローンとリストが表示されます。 たとえば、ばななを選択しようとしてばななをクリックします。その瞬間表示された リストは消えますが、コンボボックスには何も選択されていない状態になってしまいます(空欄)。 本来ならば、ばななが表示されなければなりません。 ただし、ドロップボタンでリストを表示させずに、キーボード矢印キーでリストを順番に 表示させると、選択状態にすることはできるようです。 コード中の ComboBox1.Clear を書かないと、上記のような現象は起きませんが、ドロップボタンを押すたび、設定したリストが 無駄に追記されていってしまいます。 どのようにしたら良いのでしょうか

専門家に質問してみよう