• ベストアンサー

またまたグラフ、、

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

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

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.6

解決したのでしょうか?

HUKAHIRE
質問者

お礼

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

その他の回答 (5)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.5

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 としてあげると、早くなるかもしれません。 最後の一文は「たぶん」ですので、何にもならなかったら無視してください。

HUKAHIRE
質問者

お礼

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

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.4

>回答を何度も頂いて失礼極まりないですね、、。気を付けます。 (・_・三・_・) ウウン そんなことはありません。 チャットではないので、タイミングが合わなければよくあることです。 がんばってくださいな。

HUKAHIRE
質問者

お礼

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

HUKAHIRE
質問者

補足

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

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

まず最初に 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

参考URL:
http://www.microsoft.com/JAPAN/developer/library/Vb98/vbmthclearx.htm
HUKAHIRE
質問者

お礼

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

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

以前はエクセルからフォームにグラフを取り込んだんですよね? どうやって取り込んだのですか? もしかして流用してその部分が使えるかもしれないので、できたらその部分を見せてもらえるとうれしいです。

HUKAHIRE
質問者

お礼

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

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

どうも、TAGOSAKU7です。 ピクチャボックスも通してはダメなのですか? 出題者は『コピー&ペーストで取り込んだ画像はダメ』と言ったわけではないのですか? それとも、『メモリ上に存在する「絵」をビットマップとして作成』という限定仕様なのですか? 情報をください 1.エクセルのバージョン 2.グラフはワークシートに、グラフオブジェクトとして存在?それとも、ひとつのグラフシートとして存在? 3.グラフを作成するときデータをエクセルに書き出しますよね?そのときは非表示?もし非表示なら、表示しても可ですか? 現在長期出張中で、VB環境が無いためにほとんどレスが書けない状況です。 調べてみないとすぐには僕もできません。それに今はC言語環境しかないのです。2日後以降であればVB環境を入手できます。期限に間に合いますか?

HUKAHIRE
質問者

お礼

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

HUKAHIRE
質問者

補足

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

関連するQ&A

  • エクセル&パワーポイントのグラフを画像で保存したいのに

    エクセルで作成したグラフを画像(bmp形式)に変換したいのです。グラフは白黒で 棒グラフと文字・線だけのいたってシンプルなものです。 1つのグラフはエクセルからそのままペイントへコピーし、bmp形式で保存したところ問題なくきれいでした。 が、もう1つのグラフはパワーポイントへ一旦移して加工しており、これをペイントへコピーし、bmpで保存すると、フォントが失われ、輪郭がギザギザの表示になってしまいました。(せっかく苦労してきれいに書いたのに!)パワーポイントを介すると情報が失われるのでしょうか?OSはWin98、ExcelとPowerpointは97、IE4.0を使用しています。 この画像をあるサイトに送信すると、PDFに変換され、そのまま写真原稿になり製本されてしまうので、できるだけ画像の劣化は避けたいのです。送信作業は一度だけなので、ファイルサイズを小さくすることは考えていません。このサイトで推奨されている形式はTIFかEPSですが、使用中のパソコンにはphotoshop等は入っていません。GIFとJPEGで試してみましたが、線がぼやけたり、白いはずの背景が汚く汚れてしまってダメでした。 このグラフをTIFかEPSに変換するフリーソフトなどご存知でしょうか?なにか良い方法をご存知の方、ご教授いただければ有り難いです。宜しくお願いいたします。

  • エクセルのグラフのコピー(書式も)

    エクセルで、2つのファイルを使って作業します。 片方(A)のファイルで作製したグラフを、他方のファイル(B)に「コピー→貼り付け」すると、Aでデータ値を修正すると、Bにもグラフ上の値は反映されます。 しかし、Aでグラフの色やプロットエリアの色など書式を変えたのは、Bには反映されません。 書式も反映させるコピーの方法はないのでしょうか? 当方まだ初心者ですので、申し訳ございませんがそういう方法があればご教示下さい。

  • エクセル2003のグラフギャラリーファイル

    こんばんは。お世話になります。 エクセル2003で、ユーザー設定グラフを登録すると、下記のようなメッセージが出ました。 ”グラフギャラリーファイルは現在使用中か、または存在しません。そのためユーザー定義のグラフを指定したフォルダに保存できません。[ok]をクリックし、ギャラリーファイルの場所または場所を変更してから保存して下さい” というもので、場所を変更して保存する操作をしたところ、それまで作成していたエクセルファイルは直近の保存した時刻のまま状態に、そして、新しくエクセルファイルができました。 初めてみたメッセージでどう対処してよいのかわかりません。 そのまま新しくできたエクセルファイルで作成し続けたものかどうか、わからず困っております。 エクセル2003で、売り上げ実績の資料を作っており、同じ種類のグラフを多数作るため、ユーザー設定グラフをつくろうとしたのですが、このメッセージの意味がわからないし、新しくできたエクセルファイルで作業を続けようにも、なんか気味悪いし・・・という感じです。 不勉強で説明不足で申し訳ありませんが、どうかご回答よろしくお願いします。

  • エクセルでグラフのコピー(書式も反映)

    エクセルで、2つのファイルを使って作業します。 片方(A)のファイルで作製したグラフを、他方のファイル(B)に「コピー→貼り付け」すると、Aでデータ値を修正すると、Bにもグラフ上の値は反映されます。 しかし、Aでグラフの色やプロットエリアの色など書式を変えたのは、Bには反映されません。 書式も反映させるコピーの方法はないのでしょうか? 当方まだ初心者ですので、申し訳ございませんがそういう方法があればご教示下さい。

  • excel2007のグラフのコピー

    Windows7でexcel2007使用です。 excel2007で表を作りそれで、縦に数値、横に年月で要所に吹き出しの説明を入れた、折線グラフを作っています。 そのグラフをホームページビルダー14に載せるべく、コピーするのですが、何故か2個の吹き出しが表示されません。保存しなおしても上手く行きません。 グラフをペイントやホームページビルダー14に直接コピーしてもダメでした。 確か以前はWebページとして保存から楽に取れたのですが、2007ではそれも出来なくて困っています。 よろしくお願いします。

  • パワーポイント2010でグラフを作って、パワーポイント2007に送って

    パワーポイント2010でグラフを作って、パワーポイント2007に送って加工できる方法を知りたいです。 2010でグラフを作るときに、エクセルのファイルとリンクさせて、グラフを作って、データを更新できるようにしたいのですが、2010で作って2007以前のパワポを持つ人にエクセルのファイルとともに送ると、グラフがただの画像のように見えて、エクセルのファイルが開けられないとのことです。97-03の形式で保存していますが、保存の時に2007以前では正しく見られないような警告が出てしまいます。 どうしたら2007の人に送って、あちらでデータを修正して加工できるよう保存できるのでしょうか。 エクセルにリンクするのではなく、パワーポイントに張り付いてるワークシートは、開けられるようです。 互換性について、いまいち理解できていません。よろしくお願いします。

  • エクセルのグラフ

    エクセルでレポートを提出するんですが、2003のファイルで提出しなければいけないんです。私は2007を使っていて、グラフを作成すると互換性がなくなってしまいます。どうすれば2003のグラフを作れるでしょうか?

  • excel2013のグラフで・・

    excel2013でグラフを作り、説明ヶ所に図形での吹き出しに説明文字を入れ、それをインターネットに掲載しました。 所がそのグラフに追加で幾つか吹き出しを作りました。excel2013ではきれいに保存されています。 しかし、そのグラフを以前と同じようにコピーし、ペイントでjpgに変換すると、追加した吹き出しが全く入っていません。何度試しても同じです。 追加分の吹き出しの入ったコピーはどうすれば出来るのでしょうか? またペイント使用の他に、グラフをjpg等に簡単に出来る方法があれば、教えて下さい。 よろしくお願いします。

  • Excel2007のグラフ作成,Word2007への貼り付け方について

    Excel2007を用いてグラフを作成し,Word2007へ張り付ける作業をおこなっているのですが,作成したグラフのサイズや,貼り付け後のWordファイルのサイズが大きくなってしまい,頭を悩ませています… Excelで作成したグラフは,行(縦)が2000~4000程度のデータを3列(横)程度使用しています.色は白と黒のみです. グラフを作成したExcelファイルは,200~300KB程度です. このグラフをWordへ「(図)拡張メタファイル」として,10枚程度張り付けています. Wordファイルは10ページ以下です. このとき,Wordファイルのサイズが3Mを超えてしまい,出来れば1M~2M程度に抑えたいのですが,何かファイルサイズを小さくする方法はありませんでしょうか… 言い換えますと,Excelファイルを小さくする方法,もしくはWordファイルへ張り付け方などをご教授いただければ幸いです. よろしくお願い致します.

  • Excel、Wordでの画像の保存について

    bmp画像が複数枚貼ってあるHPがあり、その画像全てをファイルに保存したいと思っています。 この、”サイトに接続し、そこにある画像全てを一枚ずつ順番に保存する”という一連の作業をExcelマクロまたはWordで自動的に行うようにすることはできるのでしょうか。 bmpファイルが貼ってあるページはExcelやWordではありません。 当方Excel2000、Word2000を使っています。 方法をご存知の方いらっしゃいましたらぜひともよろしくお願いします。