- ベストアンサー
またまたグラフ、、
前回大変お世話になった(特にTAGOSAKU7さん)HUKAHIREです。提出期限にはギリギリ間に合ったのですが、修正がかかってしまいました。ExcelからグラフをコピーしてFormに貼り付けてソレをbmpファイルに保存するという作業でしたが、Formなどを通せないそうなんです。なのでExcelからコピーをして直接(他の何かを通して?)ソレをなんとかbmpファイルなどに保存できないでしょうか?もう調べられる手が尽きました、、、(早すぎ??)どうか今回もどうぞ宜しくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
解決したのでしょうか?
その他の回答 (5)
- TAGOSAKU7
- ベストアンサー率65% (276/422)
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 としてあげると、早くなるかもしれません。 最後の一文は「たぶん」ですので、何にもならなかったら無視してください。
お礼
すばやい対応いつも、ありがとうございます。早速試してみます。今週で解放されるのかなー?
- TAGOSAKU7
- ベストアンサー率65% (276/422)
>回答を何度も頂いて失礼極まりないですね、、。気を付けます。 (・_・三・_・) ウウン そんなことはありません。 チャットではないので、タイミングが合わなければよくあることです。 がんばってくださいな。
お礼
ありがとうございます。実現できました!でも、、、
補足
完成品を見せたら「もうチョット早いといいなッ」って返されました。もう、どこまで私に求めるのって感じなんです。しかも期限は明日までなんて、、。私もまた求めてしまいますけど、高速化という点について分かりますか?DBに接続しているんでADOを使っています。そこがやっぱりタイムログ(使い方は合ってる?)なんだと思うんですよね、、。
- TAGOSAKU7
- ベストアンサー率65% (276/422)
まず最初に 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/oldkouza/vbkouza.html 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
お礼
私が確認する前に回答を何度も頂いて失礼極まりないですね、、。気を付けます。今から試してみます。
- TAGOSAKU7
- ベストアンサー率65% (276/422)
以前はエクセルからフォームにグラフを取り込んだんですよね? どうやって取り込んだのですか? もしかして流用してその部分が使えるかもしれないので、できたらその部分を見せてもらえるとうれしいです。
お礼
私が確認する前に回答を何度も頂いて失礼極まりないですね、、。気を付けます。今から試してみます。
- TAGOSAKU7
- ベストアンサー率65% (276/422)
どうも、TAGOSAKU7です。 ピクチャボックスも通してはダメなのですか? 出題者は『コピー&ペーストで取り込んだ画像はダメ』と言ったわけではないのですか? それとも、『メモリ上に存在する「絵」をビットマップとして作成』という限定仕様なのですか? 情報をください 1.エクセルのバージョン 2.グラフはワークシートに、グラフオブジェクトとして存在?それとも、ひとつのグラフシートとして存在? 3.グラフを作成するときデータをエクセルに書き出しますよね?そのときは非表示?もし非表示なら、表示しても可ですか? 現在長期出張中で、VB環境が無いためにほとんどレスが書けない状況です。 調べてみないとすぐには僕もできません。それに今はC言語環境しかないのです。2日後以降であればVB環境を入手できます。期限に間に合いますか?
お礼
ご反応に大変、感謝感激です。
補足
まずExcelは2000です。で、グラフはグラフオブジェクトとして存在(んー、理解の不一致がなければいいんけど、、。)グラフ1とかいう感じでデータを書き込んだシートと同じところに存在しています。でもシート(?シートの下についているタグのように)として存在するぶんには構いません。あくまでExcelシートは影の存在なので、どんな状態でも可です。でも表示するのは不可なんです。裏で全てを処理して保存したいのです。出張中というのに回答していただいてありがたい限りです。どこに出張してるんですか?
お礼
かなり返事が遅れてスミマセン。実はネコが病気にかかってしまい、ほっぽり出してしまってました。でもでも私なりに処理が早くなったなー、と感じたのでそれを提出しました。確認して返却される予定の日から私は家を離れなくなったので回答はまだもらってないんですが、多分大丈夫だと思います。TAGOSAKU7さんも忙しそうなので、体にだけは気を付けて下さいね。ありがとうございました。でもチョット回答が不安なんので質問はもう少し継続させておいて下さい。