Excel VBAでフォームにイメージコントロールを配置して、そこにエクセルで作成したグラフ(グラフシート)を表示するようなプログラムは作成可能でしょうか?

例えば、
まずワークシートのデータを元にグラフ(グラフシート)を作成し、作成したグラフをフォーム上のイメージコントロールに表示させる一連の作業をVBAでプログラミングできるかどうかということです。
Userform1.MultiPage1.Image1.Picture = .........といった感じです。

もしくは、作成したグラフをgif形式の画像として特定のディレクトリなりフォルダに保存して、その画像ファイルを読み込むことで対応はできるでしょうか?

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

というわけで、途中まで作りかけたのですが、芳坂和行さんのホームページで、非常に出来のいいクラスを見つけてしまいましたので、芳坂和行さんのものを紹介しておきます。



■芳坂和行さんのホームページ
 http://ww1.cnet-na.ne.jp/h/housaka/

上記のホームページの
http://ww1.cnet-na.ne.jp/h/housaka/excel/persona …

に「クリップボードから Picture オブジェクトを作成するクラス CClipPicture (Excel97)」というのがあります。(Excel2000でも動作します。)

使い方が書いてありませんので、説明すると

1.上記のページの「クリップボードから Picture オブジェクトを作成するクラス CClipPicture (Excel97)」を右クリックして、「対象をファイルに保存...」でCClipPicture.clsというファイル名で保存します。

2.上記で保存したCClipPicture.clsをExcelのVisual Basic のエディタの、ファイルのインポートで、読み込みます。

3.CClipPicture.clsの最初の方に、コメントになったサンプルがありますので、これを利用します。まず、ユーザーフォームを追加して、ユーザーフォームにボタンを2つと、イメージコントロールを1つ配置します。
4.作成したユーザーフォームのソースに、CClipPicture.clsの先頭のほうにある「UserFormでの使用例」以降の連続したコメントの部分を貼り付け、コメントを除きます。
5.シート名がSheet1であるワークシートにグラフを1つ配置します。

あとは、作成したユーザーフォームを動かして、ボタンのいずれかをクリックすると、イメージにグラフがはりつけられます。

という訳で、うまくいったら芳坂和行さんにお礼のメールでもよろしくおねがいします。
    • good
    • 0
この回答へのお礼

具体的かつ詳細な回答ありがとうございます。さっそく試してみます。上手くいったら、うまくいかなくてもポイントを差し上げます。有り難うございました。

お礼日時:2001/05/29 09:48

すいません。

Visual Basicのカテゴリだったので、VBでやるのだと勘違いしました。Excelのイメージボックスだとクリップボードからの貼り付けは、Windows APIを使用する必要があると思います。

というわけで、ちょっと調べないと回答でませんが、待てるのであれば、(約束はできませんが)調べてみます。
    • good
    • 0

クリップボード経由で貼り付けるというのはどうでしょう。



Private Sub Command1_Click()
'参照設定で、Excelのオブジェクトを参照設定してください。
'参照設定しない場合は、下記の変数定義のExcel.ApplicationをObjectにしてください。
Dim objExcel As Excel.Application
'エクセルを起動
Set objExcel = CreateObject("Excel.Application")
'グラフのあるブックを開く
objExcel.Workbooks.Open "C:\Text.xls"
'グラフをコピー(適当に書き変えてください)
objExcel.Worksheets(1).ChartObjects("グラフ 1").Copy
'クリップボードから貼り付け
Image1.Picture = Clipboard.GetData
'クリップボードをクリア
Clipboard.Clear
'ワークブックを閉じる
objExcel.Workbooks(1).Close False
'エクセルを終了
objExcel.Quit
'オブジェクトを開放
Set objExcel = Nothing
End Sub
    • good
    • 0
この回答へのお礼

有り難うございます。
ExcelのVBAで試してみましたが、
Image1.Picture = Clipboard.GetDataの
Clipboardのところでエラーが発生し、
「コンパイル エラー」
「変数が定義されていません」とメッセージが表示されます。

どのように変数を定義したら良いでしょうか
ちなみに、clipbordをvariant形で変数宣言しても駄目でした。
よろしくお願いします。

お礼日時:2001/05/28 09:53

もし、イメージコントロールを使うなら、クリップボードを経由してコピー&ペーストするようなコードが要るでしょう。

(クリップボード関係のAPIを使う)


でも、イメージコントロールにはとらわれない方がいいですね。
それよりも、VBのフォームに「Microsoft Excel グラフ」オブジェクトを貼り付ける方が作りやすいと思います。
このオブジェクトの扱いについては、ExcelのヘルプのChartObjectの項目あたりに書いてあると思います。
(このオブジェクトを操作すれば、グラフ作成のすべての工程をVBAで記述できると思います。(実際に試したわけではないです。)
    • good
    • 0
この回答へのお礼

ありがとうございます。
できればVBAのみでやりたいのです。clipbord, APIに関しては参考にさせていただきます。

お礼日時:2001/05/28 09:45

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qダイヤモンドの硬さがなぜできる?

 ダイヤモンドは硬度10で、地球上で一番硬いということですが、それについて質問です。
 ダイヤモンド以外はダイヤモンドよりも硬くないわけですが、ダイヤモンドよりも硬度の低い物(やわらかい物)でいくら圧力を加えても、炭素が硬度10にはならないと思うのです。
 なぜ硬度10の硬さができるのでしょうか?

Aベストアンサー

ダイヤモンドは高圧で固められているから硬いというわけではなく、高圧によって、化学構造が変化して、硬い物質(ダイヤモンド)に変化したと考えるべきです。
たとえばグラファイトを高圧にしても、化学構造が変化しなければ、ダイヤモンドのように硬くはなりません。

ダイヤモンドが硬い理由は結晶全体が強固な共有結合で、三次元的につながっているためであると説明されます。

このような構造はダイヤモンドを構成している炭素原子の特性とも関係してきます。
炭素以外の原子でこのような構造を作ることができるものは限られているために、ダイヤモンドよりも硬い物質が(あるのかもしれませんが)知られていないということだと思います。

参考URL:http://www2.yamamura.ac.jp/chemistry//chapter4/lecture5/lect4052.html

Qユーザーフォームで動的(Me.Controls.Add)に作成したコントロールの削除

Excelのvbaでユーザーフォームを作成しました。

UserForm_initialize()内でコントロールを以下のように動的に作成・配置しました。
Me.Controls.Add("Forms.ComboBox.1", "ComboBox" & i, True)

別のコマンドを用意して、そこから表示するコントロール数を変更させたいので、パブリック変数を使用してループ回数を指定したうえでフォームを再表示させました。

しかし、ループ回数を増やした場合は良いのですが、減らした場合でも一度表示されたコントロールが消えません。

良い方法を教えて下さい。
よろしくお願いします。

Aベストアンサー

Me.Controls.Remove("ComboBox" & i)
では、駄目でしょうか

Qグラフのプロパティ(名前?)について

エクセルで作成されたグラフには[Book1]Sheet1グラフ1・グラフ2・グラフ3・・・と名前が作成した順についていきますが、この名前を任意に変更することは出来ないのでしょうか。
例えば、1番目に作ったグラフをグラフ3に、2番目に作ったグラフをグラフ1に・・・といったようにグラフを作ってしまった後から変更したいのですが可能でしょうか?
どなたかご存じの方がいらっしゃいましたら、ぜひ、ご教授ください。

Aベストアンサー

Sub グラフ名取得マクロ()
Dim cn As String
Dim i, k As Integer

i = 1
k = 1

cn = ActiveChart.Name
ActiveWorkbook.ActiveSheet.Cells(i,k).Activate
Cells(i, k).Value = cn
End Sub

簡単にですが・・・。
iとkには任意の数字(i=行数、k=列数)を入れて、グラフを選択している状態で実行してください。
グラフを選択していないとエラーですよ。簡単に、なのですみません・・・。

Qカスタムコントロール作ってます(VB.NET)。VB.Net にVB.6のActiveX作成時にあったプロパティページ作成ができないようですが

タイトルどうりです。VBNETのカスタムコントロールでデザインモードにおけるフォームつまりプロパティページやビジュアルにプロパティボックスから設定できるようにしたいのですが、どうしたらできるでしょうか?VB6ではできたのですが、(Activexコントロール)。

よろしくお願いします。

Aベストアンサー

通常のプロパティと同じように、プロパティ ウィンドウに項目を表示して設定できるようにする必要があります。
具体的には、
1. カスタム コントロールのクラスに外部公開する Property プロシージャを作成して、内部で値を保存できるようにする。
2. そのプロパティの宣言部分で、プロパティ ウィンドウに表示するように指示する属性値を設定する。

こんな感じです。

参考URL:http://www.atmarkit.co.jp/fdotnet/winexp/winexp02/winexp02_01.html

Qエクセルのグラフ作成時に、複合グラフになり困っています。

エクセルのグラフ作成時、データの範囲選択後、グラフウィザードの1/4で、標準グラフ(棒グラフ)などが作成できません。「現在のグラフは、複合グラフであり、利用できるグラフの種類と一致しません」と右下にでます。前回エクセルで複合グラフを作ったときに、何か設定を変えてしまったのでしょうか?  どなたか、教えてください。

Aベストアンサー

> 現在のグラフは、複合グラフであり、利用できるグラフの種類と一致しません

「標準のグラフ」に設定したのではないでしょうか?
このメッセージが出たとしてもグラフの種類で好きなグラフをクリックすれば選べると思いますが、、、、

標準のグラフをデフォルトにしたいなら下記で。
(Excel2000でのやり方なので他のバージョンだと多少違うかも)

1)一度、複合グラフを作ってから、グラフを選択して右クリック-「グラフの種類」
2)「ユーザー設定」タブで「選択元」を「ユーザー定義」
3)グラフの種類から「標準」を選択し下にある削除ボタンを押下

QVBAでワークシートとグラフシートの判別

VBAでワークシートがactiveになっている時だけ実行プログラムを書きたいのですが
ワークシートとグラフシートの判別する分岐をif文で作成するには
どのように書けば良いですか?

検索してみても見つかりませんでした。

どなたかよろしくお願いいたします。

Aベストアンサー

これをグラフシートと、ワークシートで実行してみると
Sub test()
Debug.Print ActiveSheet.Type,
Debug.Print TypeName(ActiveSheet),
Debug.Print TypeOf ActiveSheet Is Chart
End Sub

'Graphsheet
'4, Chart, True

'Worksheet
'-4167, Worksheet, False

Typeが戻す値が、グラフシートの時、下記の記述や、手持ちのポケットリファレンスの記述と違っているのですが、理由はわかりません。addメソッドの場合とは異なるのでしょうか?
http://www.moug.net/tech/exvba/0040048.html

いずれにせよこれらで判別できると思います。

Qウェブサイトにグラフの比較表を作りたい。

自分のウェブサイトに折れ線グラフを比較する表を作りたいと思っております。

イメージとしては左側にグラフA、グラフB、グラフC・・・とたくさんのボタンが縦にあって
その右側にその折れ線グラフを表示するウィンドウがあります。
グラフのボタンを押すとそのグラフが表示されたり非表示になったりして複数のグラフを比較することができる。
そういったグラフ比較表を作りたいのですが、どのように作ればよいのかが分かりません。

HTMLの本を読んでみましたが、どうやらそれでは作れなそうだと判りました。
Flashというものを勉強すれば作れるようになるでしょうか?

是非アドバイスをいただけたらありがたいです。

Aベストアンサー

>グラフのボタンを押すとそのグラフが表示されたり非表示になったりして複数のグラフを比較することができる。
 単純に、表示されるグラフが変わるだけですよね。複数のグラフを並べるので゛はなく!!

 なら普通に目次と内容を書けばよいだけですが?
<section>
 <h2>グラフ色々</h2>
 <section id="g1">
  <h2>グラフ1</h2>
  <p><img src="" width="" height="" alt=""></p>
 </section>
 <section id="g2">
  <h2>グラフ2</h2>
  <p><img src="" width="" height="" alt=""></p>
 </section>
 <section id="g3">
  <h2>グラフ3</h2>
  <p><img src="" width="" height="" alt=""></p>
 </section>
・・・【中略】・・・
 <div id="menue">
  <ol>
   <li><a href="#g1">グラフ1</a></li>
   <li><a href="#g1">グラフ1</a></li>
   <li><a href="#g1">グラフ1</a></li>
・・・【中略】・・・
  </ol>
 </div>
</section>
として、スタイルシートで
#idを左にfixedで固定してしまう。
複数を並べるとなるとjavascriptで内容を書き換えなければならないでしょう。

>グラフのボタンを押すとそのグラフが表示されたり非表示になったりして複数のグラフを比較することができる。
 単純に、表示されるグラフが変わるだけですよね。複数のグラフを並べるので゛はなく!!

 なら普通に目次と内容を書けばよいだけですが?
<section>
 <h2>グラフ色々</h2>
 <section id="g1">
  <h2>グラフ1</h2>
  <p><img src="" width="" height="" alt=""></p>
 </section>
 <section id="g2">
  <h2>グラフ2</h2>
  <p><img src="" width="" height="" alt=""></p>
 </section>
...続きを読む

Qvbaで、フォームコントロールを挿入する方法

vbaで、フォームコントロールを挿入する方法

エクセル2007を使っています。
最近、vbaを始めたのですがわからない事があります。

開発→挿入→挿入→フォームコントロールで、
オプションボタンやチェックボックスを、
vbaで挿入したいのですが可能でしょうか?

例えば、フォームコントロールのボタンを押しただけで
オプションボタンを6つ挿入するなどです。

ActiveXコントロールでは、可能とどこかのサイトで見たのですが、
どうしてもフォームコントロールの方を使いたいの…。

よろしくお願いします。

Aベストアンサー

シートに追加する場合で作成してみました。
※文字やコントロール名も自由に設定できます。

Sub optボタン追加()
 For I = 1 To 6
   ActiveSheet.OptionButtons.Add(100, 10 + I * 20, 100, 15).Select
   Selection.Characters.Text = "選択" & I
   Selection.Name = "optボタン" & I
 Next I
End Sub

Qダイヤモンドに関する映画

こんにちは。ダイヤモンドに関する映画を探しています。
今のところ、ブラッドダイヤモンド、ブレイクアウトと、世界中にI Love You(Harry Winstonでの購入シーンがあった)を見ましたが、他にありますか?ダイヤモンド、ダイヤモンド商人、高級ジェリーショップ(Tiffany以外)で、他に映画がありましたら、教えてください!

Aベストアンサー

こんにちは!
「ブラッドダイヤモンド」のようにダイヤを主題にではなく、「世界中がアイ・ラヴ・ユー」のように小道具として出てくる…というだけでもいいのですか??
またダイヤ単体ではなくて、「ダイヤと他の宝石を使ったジュエリー」でもかまいませんでしょうか?

まずは
「マリー・アントワネットの首飾り」(2001)
「ルパン」(2005)
です。
史実でも有名な首飾り事件をモチーフにしており、大小合わせてとはいえ500個以上ものダイヤがふんだんにあしらわれ、「現代の感覚でもおおよそ30億円(Wikipedia調べ)」という首飾りが登場します。
「ルパン」ではこれのレプリカを作ったのはカルティエです。首飾りのみならず、王妃のジュエリー類や冠などもカルティエ・コレクションからの貸し出しだったそうです。宝石以外の室内装飾や調度類も見物です。

「メイド・イン・マンハッタン」(2002)
作中二人が恋に落ちるのがありえない、ファンタジーでも度が過ぎると叩かれまくったファンタジー恋愛映画ですが、二人のダンスシーンでジェニファー・ロペスが身につけている豪華なジュエリーはハリー・ウィンストンのネックレスとイヤリングなんだそうです。
「プリティ・ウーマン」でもオペラを見に行くときにドレスに合わせたネックレスをプレゼントされますが、あれもルビーとダイヤだそうです。

「10日間で男を上手にフル方法」(2003)
10日間で男にフラれるハウツー記事を書けと言われた雑誌記者と、10日間で女をオトせたら大手ダイヤモンド会社の担当にしてやる、と言われた広告代理店の男の駆け引きの話で、タイトルほどヒドくはなかった。
NYの華やかスポットがしょっちゅう出てくるのですが、頂点は主人公がパーティのシーンで身につけるハリー・ウィンストンのジュエリー。総90カラット弱だそうで、とても素敵です。

「ラスト、コーション」(2007)
冒頭にも大きなダイヤとおぼしき指輪をつけた女性たちが出てきますが、物語を大きく動かすのがカルティエ制作の6カラットのピンクダイヤの指輪。
公開当時、「激しいセックスシーンが見どころ」と言われたそうですが、露出が激しいというより暴力的なセックスを含むのでご注意。

「シャネル&ストラヴィンスキー」(2009)
作中のココ・シャネルが身につけているものが全て本物のシャネル。当時のものではなくて、シャネルとカール・ラガーフェルドの全面協力による再現だそうです。
特にクライマックスである再演シーンにてココ・シャネルが身につけているダイヤをふんだんにちりばめたネックレスがはっきり見て取れます。
同じ全面協力でも「ココ・アヴァン・シャネル」でダイヤが出てきたかどうか、ちょっとリストにありません。
同じくシャネル制作のダイヤモンド・ネックレスは「ゴスフォード・パーク」(2001)でも登場します。イギリス貴族のマナーハウスが舞台で、凝り性の監督によってしつらえられているので豪華です。でも貴族本人たちが主役というわけでもないので、ダイヤはちらりです。

「ナイン」(2009)
ニコール・キッドマン演じる女優が、総カラットで数十以上と言われるゴージャスなブレスレットとイヤリングをじゃらじゃら言わせています。ショパールだそうです。
主人公であるダメグズ男の周りにはなぜかきらきらしい女性がいっぱいいて、彼女らが身につけているジュエリーもかなりのものです。

「白雪姫と鏡の女王」(2012)
映画体の出来よりも、后に食われ気味の白雪姫の眉毛ばっかり気になる映画ですが、この作中でジュリア・ロバーツと白雪姫が身につけているティアラ、グレース・ケリーが公妃になったあとで実際に身につけたものを撮影に借りたんですって!ご利益ありそう。ヴァン・クリーフ&アーペルだそうです。
グレース・ケリーが主演の映画でも「上流社会」で大きなダイヤの婚約指輪が出てくるそうです。私はまだ未見ですが、実際にレーニエ公から贈られたカルティエの婚約指輪を作中でも婚約指輪として扱ったという…計10カラット以上だそうで、見ているこちらもため息ものの豪華なダイヤです。
来年公開予定の映画の中にグレース・ケリーを主題にしたものがあって、この婚約指輪ほか、グレース・ケリーが身につけたダイヤのジュエリーがカルティエによる再現で登場するそうです。

他にも未見のものでは。
イングリッド・バーグマンの「汚名」で身につけているネックレスがハリー・ウィンストンのものだそう。
オードリー・ヘップバーンの「おしゃれ泥棒」でもダイヤのジュエリーが出てきます。
#3もふれていらっしゃいますが、「紳士は金髪がお好き」。
ダイヤモンド会社社長からマリリン・モンローが贈られたダイヤのネックレスが出てくるはずです。このカナリアイエロー・ダイヤ、数百年インドの王家所有のあとオーストリアのマリア・テレジアが所有していたという世界でも有名なダイヤのひとつなのです。マハラジャの領地名にちなみ「The Moon of Baroda(バローダの月)」と呼ばれ、24カラットもあります。
実生活でも宝石コレクターだったエリザベス・テイラーの「別離」。ダイヤモンドではなかったかもしれませんが、実際に夫のどなたかから贈られた見事なジュエリーが出てくるそう。
エリザベス・テイラーは死後、遺品となった宝石コレクションがクリスティーズのオークションにかけられています。その中でももっとも注目を集めたのが大粒のダイヤモンドの指輪です。
オークションに際し「The Elizabeth Taylor Diamond」と名付けられた指輪は33カラットを超え、その品質もDカラーのフローレスという破格のもの。
http://www.christies.com/elizabethtaylor/saleroom_legendary_jewels.aspx
それともう一つ、2度結婚したバートンがテイラーに贈ったことから「Taylor-Burton Diamond」と呼ばれるようになった69カラット超のダイヤモンドも、もしダイヤモンドにご興味があればご覧ください。

こんにちは!
「ブラッドダイヤモンド」のようにダイヤを主題にではなく、「世界中がアイ・ラヴ・ユー」のように小道具として出てくる…というだけでもいいのですか??
またダイヤ単体ではなくて、「ダイヤと他の宝石を使ったジュエリー」でもかまいませんでしょうか?

まずは
「マリー・アントワネットの首飾り」(2001)
「ルパン」(2005)
です。
史実でも有名な首飾り事件をモチーフにしており、大小合わせてとはいえ500個以上ものダイヤがふんだんにあしらわれ、「現代の感覚でもおおよそ30億円(Wikipedia...続きを読む

Qエクセルのシート上に、複数のグラフ表を作り、各グラフ表に対応したグラフ

エクセルのシート上に、複数のグラフ表を作り、各グラフ表に対応したグラフを表示するマクロを作成しました。
エクセル2003のPCで作成したのですが、作成したPCでは良かったのですが、同じファイルをエクセル2010の端末に持ってきて表示したら問題が発生しました。対応方法を教えて下さい。

グラフの項目フィールドをP5:S5に置きます。
この下にグラフデータだけが追加されています。(1番目グラフデータP6:S12、2番目P13:S19、、、)
1番目のグラフはセルI6、2番目はI13に「グラフ表示」と記載し、それぞれのセルをクリックするとその都度マクロが起動してグラフが表示されます。クリックしたセルの右隣のセルがグラフの左上になる設定です。
ところが、エクセル2010では、最初に表示するグラフは意図した位置に表示されるのですが、次のグラフを表示すると、最初のグラフが次のグラフを表示すべき位置に移動し、次からのグラフはM16辺りを左上にして次々に重なってしまします。
対処策をご教示下さい。

Aベストアンサー

2010では、Charts.Add からLocationメソッドでシート上にグラフを移動した場合、
Shape名称が全て『グラフ 1』になってしまうようです。
なので最低限の修正なら
>With ActiveSheet.Shapes(GName)
ここの、名前で指定しているところをインデックス指定に変えれば良いです。
With ActiveSheet.Shapes(ActiveSheet.Shapes.Count)



以下は、参考までに回答#1と同じ書き方で書いた場合。
'SheetModule
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If ActiveCell.Value = "グラフ表示" Then
    Call グラフ(ActiveCell)
  End If
End Sub

Private Sub グラフ(ByVal Target As Range)
  Dim c   As ChartObject
  Dim r   As Range
  Dim source As Range

  Set r = Target.Offset(, 1).Resize(7, 6)
  Set source = Union(Me.Range("P5:S5"), _
            Target.Offset(, 7).Resize(7, 4))
  For Each c In Me.ChartObjects
    If Not Intersect(r, c.TopLeftCell) Is Nothing Then
      Exit For
    End If
  Next
  If c Is Nothing Then
    Set c = Me.ChartObjects.Add(r.Left, r.Top, _
                  r.Width, r.Height)
  End If
  With c.Chart
    .ChartType = xlColumnClustered
    .SetSourceData source, xlRows
    With .SeriesCollection(7)
      .ChartType = xlLineMarkers
      .AxisGroup = 2
    End With
    With .SeriesCollection(6)
      .ChartType = xlLineMarkers
      .AxisGroup = 2
    End With
    .Axes(xlValue, xlSecondary).DisplayUnit = xlMillions
    .PlotArea.Interior.ColorIndex = xlNone
  End With

  Set c = Nothing
  Set r = Nothing
  Set source = Nothing
End Sub
こんな感じになります。

#ちなみに回答#1は該当セルをダブルクリックすると実行されるイベントです。

2010では、Charts.Add からLocationメソッドでシート上にグラフを移動した場合、
Shape名称が全て『グラフ 1』になってしまうようです。
なので最低限の修正なら
>With ActiveSheet.Shapes(GName)
ここの、名前で指定しているところをインデックス指定に変えれば良いです。
With ActiveSheet.Shapes(ActiveSheet.Shapes.Count)



以下は、参考までに回答#1と同じ書き方で書いた場合。
'SheetModule
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If ActiveCell.Value = "グ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング