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ユーザーフォームで動的(Me.Controls.Add)に作成したコントロールの削除

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

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

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

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

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

Aベストアンサー

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

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

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エクセルのシート上に、複数のグラフ表を作り、各グラフ表に対応したグラフ

エクセルのシート上に、複数のグラフ表を作り、各グラフ表に対応したグラフを表示するマクロを作成しました。
エクセル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[VB.NET]3つ以上のフォームを一つずつ表示し、最後のフォームを閉じた時に最初のフォーム以外のフォームを閉じる

VB.NETを学んでいるのですが、現在3つ以上のフォームを表示していくものを作ろうとして躓いたことがあったのでこちらに書き込みました。
内容としては、ボタンを押して次のフォームを表示していくものです。

動作の流れは以下のように考えています(フォームはA、B、Cの3つとする)
1.Aを表示
2.Aでボタンを押してBを表示し、Aは隠す
3.Bでボタンを押してCを表示し、Bは隠す
4.Cでボタンを押してBとCを閉じ、隠していたAを表示

隠すのはHideを用いてできたのですが、4.でCのボタンでBとCを一緒に閉じてAを表示させる方法がわかりませんでした。

1~4のように動作させるにはどうすればいいか教えてください

Aベストアンサー

まとめて考えるのではなく、分けて考えた方がコーディングもしやすくなります。

[ FormA の処理 ]
1. ボタンを押したら FormB を開き、自身を Hide する。
2. FormB が閉じられたら、自身を Show する。

[ FormB の処理 ]
3. ボタンを押したら FormC を開き、自身を Hide する。
4. FormC が閉じられたら、自身を Close する。

[ FormC の処理 ]
5. ボタンを押したら、自身を Close する。

ポイントは、親フォーム側で子フォームのFormCloseを捕らえるところです。FormBからFormAを、とか、FormCからFormAとFormBを・・・と考えるとややこしくなります。上記のように処理すれば、FormBはFormAの動作を気にする必要はありませんし、FormCもFormBやFormAの動作を気にする必要はありません。子フォームのFormCloseはWithEvents宣言すれば捕らえられます。

以下、簡単なコードを。ボタン配置が面倒だったので、フォームのクリックで動作します。


' [ FormA の処理 ]
Public Class FormA
Inherits Form

Public Sub New()
Me.Text = "FormA"
End Sub

Private WithEvents frmFormB As FormB

' 1. ボタンを押したら FormB を開き、自身を Hide する。
Private Sub FormA_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
frmFormB = New FormB
frmFormB.Text = "FormB"
frmFormB.Show()

Me.Hide()
End Sub

' 2. FormB が閉じられたら、自身を Show する。
Private Sub frmFormB_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles frmFormB.FormClosed
frmFormB = Nothing
Me.Show()
End Sub

End Class

' [ FormB の処理 ]
Public Class FormB
Inherits Form

Private WithEvents frmFormC As FormC

' 3. ボタンを押したら FormC を開き、自身を Hide する。
Private Sub FormB_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
frmFormC = New FormC
frmFormC.Text = "FormC"
frmFormC.Show()

Me.Hide()
End Sub

' 4. FormC が閉じられたら、自身を Close する。
Private Sub frmFormC_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles frmFormC.FormClosed
frmFormC = Nothing
Me.Close()
End Sub

End Class

' [ FormC の処理 ]
Public Class FormC
Inherits Form

' 5. ボタンを押したら、自身を Close する。
Private Sub FormC_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
Me.Close()
End Sub

End Class

※VB2005で書いたコードなので.NETでそのまま動くかは不明・・・。

なお、あくまで考え方のひとつなので、他にも方法はあります。

まとめて考えるのではなく、分けて考えた方がコーディングもしやすくなります。

[ FormA の処理 ]
1. ボタンを押したら FormB を開き、自身を Hide する。
2. FormB が閉じられたら、自身を Show する。

[ FormB の処理 ]
3. ボタンを押したら FormC を開き、自身を Hide する。
4. FormC が閉じられたら、自身を Close する。

[ FormC の処理 ]
5. ボタンを押したら、自身を Close する。

ポイントは、親フォーム側で子フォームのFormCloseを捕らえるところです。FormBからFormAを、とか、FormC...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報