• ベストアンサー

Cからエクセルを開く処理についてです。

 いつもお世話になっております。  Cからエクセルを起動してVBAで作成した処理を 走らせたいのです。  そこで質問なのですが、Cでエクセルを開くときの関数は 普通にfopen()を使用すれば良いのでしょうか?  他に特別な処理をしなければならないこと等あれば、 教えてください。よろしくお願いします。

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

  • ベストアンサー
  • 774
  • ベストアンサー率43% (19/44)
回答No.3

大前提をひとつ忘れておりました。 MS-DOS上では、UNIXと違って popen()がサポートされていません。代替策は、参考URLをご覧ください。 で、コマンドプロンプトへのアクセスのオープンは、 fp=popen("command","w"); でいいと思います。 fprintf(fp, "C:\\test.xls"); で、コマンドプロンプトに C:\\texst.xls が入力されます。 厳密には、EXCEL.EXE までパスを通した状態で EXCEL c:\\texst.xls だと思いますが、拡張子が関連付けされているのでそのままでもXCEL が起動してそのファイルが開かれるとは思います。しかし、コマンドの後にリターンを押さないとコマンドが実行されませんので fprintf(fp,"EXCEL パス付ファイル名 \n"); と \n を入れる必要があると思います。 それから、EXCELの作業終了後、 pclose(fp); でクローズした方がいいと思いますが、 クローズするタイミングが問題ですね。 EXCEL が 標準入出力を扱えればいいのですが 申し訳ないですが私はよくわかりません。

参考URL:
http://www.dmst.aueb.gr/dds/sw/ports/popen/
keyed
質問者

お礼

 早々のご回答、ありがとうございます。 MS-DOS上では、UNIXと違って popen()がサポートされていません。 >この大前提のため苦しみましたが、ANo.#2を参考に何とかなりました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • 774
  • ベストアンサー率43% (19/44)
回答No.2

#1 のものです。すいません。嘘を書いてしましまいた。 >popen()は、外部コマンドの標準出力結果が返される関数です。 これは、うそです。 ファイル番号変数=popen("外部コマンド","w"); の後 fprintf(ファイル番号変数,"パラメタ"); で パラメタ を外部コマンドの標準入力に渡します。 ですから、コマンドプロンプト(command.com)を popen() に指定して、fprintf()で EXCEL をファイル名指定のパラメタつきで起動すればいいと思います。

keyed
質問者

補足

 ご回答ありがとうございます。 初心者なので、よくわからないので教えてください。  FILE *fp; fp = popen(command.com, "w"); fprintf(fp, "C:\\test.xls"); を実行すると、test.xlsは オープンしてくれるのですか?  よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。
  • 774
  • ベストアンサー率43% (19/44)
回答No.1

fopen() では、EXCELのファイル自体をCから読み書きすることになり、keyed さんのされたいこととは異なると思います。 この場合、Cから外部コマンドを起動することになると思いますので、popen()を使うことになると思います。 popen()は、外部コマンドの標準出力結果が返される関数です。 外部コマンドとして、EXCEL.EXE をファイル名付きで起動することになると思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルVBAからCの関数を呼ぶ

    エクセルVBAから、VisualC++で書かれた関数を呼びたいのですが具体的な方法を教えてください。VBAでは書きにくい処理をCで書いて、それをエクセルから利用したいと考えてます。よろしくお願いします。

  • エクセル VBAで関数

    こんばんわ。いつもお世話になっております。 エクセルでデータを加工しているのですが、関数で加工するととても遅くなってしまうので なんとかVBAで作業できないかと模索中です。 Sheet1の、A列=取引先 B列=支店名 となっており、それが3,000行ほどあります。 Sheet2も、A列=取引先 B列=支店名 となっており、 Sheet1のC列に、Sheet1のA列のB列という支店が、Sheet2にあるか確認したいのです。 現在は、Sheet1のC列に、SUMPRODUCT関数でカウントさせているのですが、大変重いです。 ほかのSheetで、VBAを使って関数のような働きをさせている部分があります(前任者作成) そのように、なんとかVBAを使用したいのですが、なかなかうまく出来ません・・・。 どうか、お力を貸してください!! うまく説明できなくて、わかりづらかったらごめんなさい。 よろしくお願いいたします。

  • エクセルでの一意のリストの作成方法

    エクセルでオートフィルターの処理をすると 一意のリストがドロップダウンリストに表示されますが、 このリストと同じものを エクセルの関数、またはVBAで作成して シート上に表示することはできますか? できるとしたなら、どの関数、またはコードを使用すればいいのか お教えいただけないでしょうか よろしくお願いします。

  • Excelについて。

    Excel(2010)について質問させて頂きます。 例えばセルA1に、AVERAGE関数を担当させます。 しかし、とある実行ボタンを押せば、A1はVLOOKUP関数に変わって実行します。 そしてもう一度同じボタンを押せば、元のAVERAGE関数に戻るってその結果を表示する。 このような処理は可能でしょうか? もちろんVBAを使用しても構いません。

  • エクセル・ハイパーリンクの関数処理

    エクセル・ハイパーリンクの関数処理 Excel 2007を使っています。 セルC列にハイパーリンクを含むデータが並んでいます。 このURLをD列に取り出したいのですが、 関数処理で出来ますか。出来るのでしたら教えてください。 出来ない場合は、マクロでも結構です。お願いします。

  • エクセルの関数でのデータ処理が重い

    お願いします。 エクセルで2万件のデータを関数処理しています。時間がかかるのでVBAで処理できればと 考えています。 A列に当日の顧客コード B列に前日の顧客コード   以下の式によって、前日と当日を比較して増えた顧客と減った顧客を表示させています。 C列に=IF(COUNTIF(B$2:B$23000,A2)>=1,"","増")の関数が入っています。 計算させた後でC列をオートフィルタで増のみ表示し、確認。 D列に=IF(COUNTIF(A$2:A$23000,B2)>=1,"","減")の関数が入っています。 計算させた後でD列をオートフィルタで減のみ表示し、確認。 これをVBAで処理して時間の短縮をしたいのでお教え頂ければ幸いです。 宜しくお願いします。

  • Menuのショートカットの処理が起動しない

    いつもお世話になっております! VBを使ってツールをつくっているのですが フォームにメニューを作成してショートカットキー (CTRL+C)でその処理を起動しようとしたところ 処理が起動しません。 わかる方教えて下さい! 宜しくお願いします。

  • C言語からC++の関数をコールする方法について

    初めて質問させて頂きます。 質問は2つあります。 ●1つ目の質問です。 この度、C言語ベースのプログラムに、C++で作成した関数を使用することになりました。 方法としてextern等を駆使しつつ、ラッパー関数を使って対応しております。 そこで質問なのですが、この場合、ラッパー関数に使用するファイル形式はcppまたはcのどちらが正しいのでしょうか?(どちらでも動きました) ●2つ目の質問です。 Windows環境(vs2005)では無事、CからC++の関数を呼ぶことに成功はしました。 しかし、本当に動かしたいのはLinuxでの環境になります。 先程作成したラッパー関数のファイルとC++で作成した関数のファイルをライブラリ(soファイル)化したものを使用し、コンパイルとリンクは問題なく通すことに成功したのですが、 実行させてみると、Cの関数からラッパー関数をコールしているのは確実なのですが、ラッパー関数の処理を通らず、プログラムが止まってしまいます。 試しにラッパー関数の処理を「return 0;」だけにして実行させてみましたが現象は変わらずでした。 そのため、ラッパー関数を呼ぶための何かに問題があると思っています。 ここで質問なのですが、ビルドのときにライブラリをリンクさせるだけでは駄目なのでしょうか。また、他に思い当たることがありましたらご教示頂きたいです。 Windows環境(vs2005)では期待する動作をしているためプログラムは問題ないと思っています。

  • VBA 起動時にエクセルの画面が表示されてしまう

    VBA 起動時にエクセルの画面が表示されてしまう こんにちは、VBA初めて1週間ぐらいの初心者です よろしくお願いします 動作環境として、OS:XP excel:excel2007 を使用しています まずはじめに、エクセルを開いて内容変更セーブして終了するというマクロを組んだのですが 別のプログラムから、 そのエクセルファイルに起動をかけて マクロを実行し終了するよう作りました。  /*** コード ***/ ThisWorkbook 0  Private Sub Workbook_Open() 1   Application.Visible = False          //エクセル画面を消す 2    3   call 内容変更し保存する関数()        // 標準モジュール内 SUB 関数 4    5   ThisWorkbook.Saved = True           // セーブしたことにする 6   If Workbooks.Count <= 1 Then Application.Quit // 他のエクセルが開いてない場合のみ終了する 7   ThisWorkbook.Close False            // エクセル終了 8  End Sub  /*** コード ***/ 質問1 ・1行目にエクセルの画面を消す関数を、プログラムの先頭に来ると思われる部分に入れて実行してみたのですが、 どうしても、起動してから画面を消す処理が始まるまでに、一瞬だけexcelのファイルが表示されてしまうのですが これを回避する方法はありますでしょうか? VBAを使ってマクロの処理をするのですが、 使う方にエクセルを使っているという事を悟られたくないのです 質問2 ・6行目、開いてるエクセルが自分だけの場合のみエクセルを終了すると組んだつもりなのですが、 処理を流すとエクセルで開いているファイルがすべて閉じてしまいます。 記述を間違えていたりしますか? 以上 ご教授お願いいたします <<検索ワード>> VBA VBA 起動画面表示 起動画面非表示 起動画面を出さない 起動画面を消す

  • Excel印刷プレビューが遅い件

    お世話になります。 Excelで関数等多様しているファイルを印刷プレビューすると、 以上に遅くなります。 当たり前なのかも知れませんが、遅いのを解消する方法って ありますか。 関数部分をExcel開いたときにVBAで処理する様にしたら 印刷プレビューは早くなりますかね。 他に単純簡単に早くする方法等あれば、ご教示頂きたく 宜しくお願い致します。