プロが教えるわが家の防犯対策術!

 前回大変お世話になった(特にTAGOSAKU7さん)HUKAHIREです。提出期限にはギリギリ間に合ったのですが、修正がかかってしまいました。ExcelからグラフをコピーしてFormに貼り付けてソレをbmpファイルに保存するという作業でしたが、Formなどを通せないそうなんです。なのでExcelからコピーをして直接(他の何かを通して?)ソレをなんとかbmpファイルなどに保存できないでしょうか?もう調べられる手が尽きました、、、(早すぎ??)どうか今回もどうぞ宜しくお願いします。

A 回答 (6件)

どうも、TAGOSAKU7です。



ピクチャボックスも通してはダメなのですか?

出題者は『コピー&ペーストで取り込んだ画像はダメ』と言ったわけではないのですか?

それとも、『メモリ上に存在する「絵」をビットマップとして作成』という限定仕様なのですか?


情報をください
1.エクセルのバージョン
2.グラフはワークシートに、グラフオブジェクトとして存在?それとも、ひとつのグラフシートとして存在?
3.グラフを作成するときデータをエクセルに書き出しますよね?そのときは非表示?もし非表示なら、表示しても可ですか?


現在長期出張中で、VB環境が無いためにほとんどレスが書けない状況です。
調べてみないとすぐには僕もできません。それに今はC言語環境しかないのです。2日後以降であればVB環境を入手できます。期限に間に合いますか?

この回答への補足

 まずExcelは2000です。で、グラフはグラフオブジェクトとして存在(んー、理解の不一致がなければいいんけど、、。)グラフ1とかいう感じでデータを書き込んだシートと同じところに存在しています。でもシート(?シートの下についているタグのように)として存在するぶんには構いません。あくまでExcelシートは影の存在なので、どんな状態でも可です。でも表示するのは不可なんです。裏で全てを処理して保存したいのです。出張中というのに回答していただいてありがたい限りです。どこに出張してるんですか?

補足日時:2001/12/04 17:50
    • good
    • 0
この回答へのお礼

ご反応に大変、感謝感激です。

お礼日時:2001/12/04 17:50

以前はエクセルからフォームにグラフを取り込んだんですよね?



どうやって取り込んだのですか?

もしかして流用してその部分が使えるかもしれないので、できたらその部分を見せてもらえるとうれしいです。
    • good
    • 0
この回答へのお礼

 私が確認する前に回答を何度も頂いて失礼極まりないですね、、。気を付けます。今から試してみます。

お礼日時:2001/12/05 16:11

まず最初に


http://oshiete1.goo.ne.jp/kotaeru.php3?q=154890
で発言したARCさんに感謝です。VB環境を臨時で入手できました。

#2の発言はまだ見てないようですが・・・

とりあえず処理が見えなければOKかな?っと勝手に思って、クリップボードを使用してます。(クリップボード使用は不本意)


処理の流れの詳細としては、まず・・・

エクセルにデータを出力(勝手にグラフに反映)
エクセルの保存
・・・で次のような処理を行ってください。
ActiveSheet.ChartObjects("グラフ 1").Activate
ActiveChart.ChartArea.Select
ActiveChart.ChartArea.Copy
要するに、グラフオブジェクトをクリップボードにコピーする処理です。
そして、エクセルを閉じてください。(閉じるときの保存不要)

ここからが本題で、
ダミーのピクチャボックスに画像を読み込む
保存する
以上です。


もしこれ以外の方法であれば、かなり実験/検証が必要です。
CreateFile関数でBitMapファイルそのものを作成していかなければなりません。かなりのチカラ作業となります。BITMAPのヘッダやパレットを直接指定して、幅*高の分だけの各ドットを、手作業でセットする処理になると思います。
もし締め切りが近いのであれば、とりあえず下記のコードを参考に作成して、それでもダメならば先生からヒントを得てください。大学のVBの課題で、そこまでの要求をする先生はあまりいないと思います。Cでグラフィック大好き先生ならわかりませんが・・・

ピクチャボックスもダメなときのために、一応参考URLを載せておきます。
http://www.alpha-net.ne.jp/users2/ei9711/oldkouz …



Option Explicit

Private Declare Function IsClipboardFormatAvailable Lib "user32.dll" (ByVal wFormat As Long) As Long
Private Const CF_METAFILEPICT = 3


Private Sub Command1_Click()
  'ファイルパスを指定して保存する
  Call SavePic_FROM_Clipbord("c:\test.bmp")
End Sub

Private Sub Form_Load()
  'ダミーピクチャボックスの書式設定
  With Me.Picture1
    .Appearance = 0
    .AutoRedraw = True
    .AutoSize = True
    .BorderStyle = 0
    .Visible = False
  End With
End Sub

'クリップボードからの画像の取り込み&保存
Private Sub SavePic_FROM_Clipbord(inPictureFilePath As String)
  '画像形式であることをチェック
  If IsClipboardFormatAvailable(CF_METAFILEPICT) = 0 Then
    MsgBox "画像を取り込めません"
    GoTo PGMEND
  End If
  
  With Me.Picture1
    '画像の取り込み
    Set .Picture = Clipboard.GetData()
    
    '画像の保存
    Call SavePicture(.Image, inPictureFilePath)
  End With
PGMEND:
End Sub

参考URL:http://www.microsoft.com/JAPAN/developer/library …
    • good
    • 0
この回答へのお礼

私が確認する前に回答を何度も頂いて失礼極まりないですね、、。気を付けます。今から試してみます。

お礼日時:2001/12/05 16:14

>回答を何度も頂いて失礼極まりないですね、、。

気を付けます。
(・_・三・_・) ウウン
そんなことはありません。
チャットではないので、タイミングが合わなければよくあることです。

がんばってくださいな。

この回答への補足

 完成品を見せたら「もうチョット早いといいなッ」って返されました。もう、どこまで私に求めるのって感じなんです。しかも期限は明日までなんて、、。私もまた求めてしまいますけど、高速化という点について分かりますか?DBに接続しているんでADOを使っています。そこがやっぱりタイムログ(使い方は合ってる?)なんだと思うんですよね、、。

補足日時:2001/12/06 15:22
    • good
    • 0
この回答へのお礼

 ありがとうございます。実現できました!でも、、、

お礼日時:2001/12/06 15:22

ADOの部分で時間がかかるということですか?



コードを見てみないと、どこが無駄かがわかりませんが、、、

想像の中を逸しませんが、一番負荷がかかる部分はエクセルの起動と、データの出力部分ではないでしょうか?

1.エクセルの起動に関して
#3の発言において、
>そして、エクセルを閉じてください。(閉じるときの保存不要)
とありますが、閉じなくてもOKです。あらかじめプログラム起動時にエクセルを裏で起動しておき、プログラム終了時に閉じると、実行中の負荷を多少おさえることができると思います。[グラフを描画]のタイミングでエクセル起動/終了を繰り返すと、その分だけ遅くなります。



2.データの出力部分
データを
Cells(1,1).Value=1
Cells(1,2).Value=2
とエクセルに各値セットしているのであれば、改善しましょう。

まず宣言
Dim 配列変数() as String
Dim lngDataCnt as Long

データ件数を取得
lngDataCnt = データのカウント
配列の大きさをセットして再宣言
Redim 配列変数(lngDataCnt,データのフィールド数) as String

ループでまわすなどして、配列変数にデータをセット
配列変数(i,j)="各データ値"

セルに出力範囲を指定して出力
Range(Cells(1,1),Cells(1,2)).Value=配列変数

といったように、出力は一度で済ませましょう。



あとまったく未検証なのですが・・・
Dim exlApp as Excel.Application
と言う感じで、エクセルアプリケーションを操作するために宣言を行っているとは思いますが、エクセルは常に非表示ですよね?
それでも、もしかしてデータの出力中は
exlApp.Screen.Updating = False
として、グラフをコピーするタイミングで
exlApp.Screen.Updating = True
としてあげると、早くなるかもしれません。

最後の一文は「たぶん」ですので、何にもならなかったら無視してください。
    • good
    • 0
この回答へのお礼

すばやい対応いつも、ありがとうございます。早速試してみます。今週で解放されるのかなー?

お礼日時:2001/12/06 16:19

解決したのでしょうか?

    • good
    • 0
この回答へのお礼

かなり返事が遅れてスミマセン。実はネコが病気にかかってしまい、ほっぽり出してしまってました。でもでも私なりに処理が早くなったなー、と感じたのでそれを提出しました。確認して返却される予定の日から私は家を離れなくなったので回答はまだもらってないんですが、多分大丈夫だと思います。TAGOSAKU7さんも忙しそうなので、体にだけは気を付けて下さいね。ありがとうございました。でもチョット回答が不安なんので質問はもう少し継続させておいて下さい。

お礼日時:2001/12/14 10:13

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