VBからExcelの起動

解決


ちゃまき  2012-11-13 05:37:34  No: 147970

連続の質問申し訳ありません。
http://hanatyan.sakura.ne.jp/dotnet/Excelflm.htm
を参考にVB.NETから事前に作成しておいたエクセルの所定のセルにデータ
を記入し、表示させようとしております。

このページでは、Excelを開いて5秒後に閉じる仕組みになっておりますが、
私がやりたいのは、Excelを開いた状態で、ユーザーが印刷や編集を行う
ようにし、閉じるのはユーザー自身でするようにと思っています。
(プロセスも残らないように)

最大5000行、14列のExcelに対し以下のようなソースを書いています。

(一部省略)
 Call ExcelOpen(System.IO.Path.GetFullPath(Excelファイル名, "Sheet1")

 Dim strDat(5000, 14) As Object
 xlRange = xlSheet.Range("A1:N5000")

 strDat(0, 0) = "列名1"  〜  strDat(0, 13) = "列名14"
 For i = 0 to  5000
  strDat(i , 3) = N1(変数)
 Next

xlRange.Value = strDat   
'使い終わった時点で、xlRange オブジェクトを解放  
MRComObject(xlRange)

問題点
これでは
①1行目の行の高さが勝手に変わってしまう。
②自動Closeをしないと、Processが残ってしまう
上記のソースでは、問題があるようでうまくいきません。
何かよい方法はないでしょうか?


オショウ  2012-11-13 11:38:34  No: 147971

そういう動作なら、通常Excelファイルを生成してから
OLEでExcelを起動するのではなく、ただのプロセスとし
て起動し、後始末をVB側でしないという方法になろうか
と思います。

要は生成保存したExcelファイルを開く動作でExcelを起
動させるだけ。

なので・・・
Process.Start("xxxxx.xls")
でよいのでは?

以上。参考まで


ちゃまき  2012-11-13 16:34:24  No: 147972

オショウ様
Excelにデータを書き込む作業は別の方法で行い、その後Processで起動するのでしょうか?
その場合書き込む方法としては、何か参考になるサイトなどないでしょうか?
ちなみにユーザー側のExcelは2000〜2010まで混在している状況です。


ちゃまき  2012-11-13 16:48:08  No: 147973

今までは以下のソースでエクセル出力していました。
問題なく動作していたのですが、開発環境のPCをwindows7 のOffice2010に移行したところ、プロジェクトを立ち上げたらエラーが出るようになりました。
'エクセルを開く 
 Dim Xls1 As New Excel.Application()
 Dim xlBooks As Excel.Workbooks = Xls1.Workbooks
 Dim xlBook As Excel.Workbook = xlBooks.Open(ExFile)
 Dim xlSheets As Excel.Sheets = xlBook.Worksheets
 Dim xlSheet As Excel.Worksheet = xlSheets.Item(1)
 Dim xlCells As Excel.Range = xlSheet.Cells
 Dim xlRange As Excel.Range

 For i = 0 To AZcnt - 1
   xlRange = Xls1.Range("A" & CStr(i + 2))
   xlRange.Value = H1(i)
   System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
     途中省略      
Next

 '印刷範囲の指定
 xlSheet.PageSetup.PrintArea = "A1:C" & CStr(AZcnt + 1)
 ' Excel を表示する
 Xls1.Visible = True

 System.Runtime.InteropServices.Marshal.ReleaseComObject(Xls1)
 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets)
 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)
 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCells)

このソースで、Excel.Application、As Excel.Workbooks などが定義されませんというエラーが出る状態です。
現在、全く違う方法に変えるかどうか悩んでいます。


ちゃまき  2012-11-13 16:53:56  No: 147974

連続書き込みすみません。
プロジェクトの参照設定でInterop.Excel.dllを再設定したらエラーはなくなりました。
直前に書き込んだソースで問題ないでしょうか?


オショウ  2012-11-13 19:29:03  No: 147975

office関連のCOMアプリケーションは、GUIDが各々異なるので
参照設定を各々行うか、GUIDで起動できるように細工しない
といけません。

どのバージョンのExcelが導入されているにか解らない場合は
探し出す機能も必要になるでしょう。

まずは、参照設定ができたのでエラーが無くなった。と言う事
ですので、残るは要望される動作を行えるか。です。

ユーザーがExcelを閉じるならProcess起動でしょう。
ただし、閉じ忘れ・・・を監視したいなら、非同期実行で、
終了を捕捉する必要があるかもしれません。

http://dobon.net/vb/dotnet/process/index.html

この辺が参考になるかと。

以上。


ちゃまき  2012-11-14 16:46:43  No: 147976

ありがとうございます。
参考のページを見ていろいろ試してみます。


魔界の仮面弁士  2012-11-15 02:04:04  No: 147977

> office関連のCOMアプリケーションは、GUIDが各々異なるので

上記について教えてください。
この GUID というのは、何の事を指していますか?

文意からして、「office関連のCOMアプリケーション」というのは、
「Word と Excel で GUID が異なる」のような意味では無く、
「Excel のライブラリの中でも、バージョンによって GUID が異なる」
といった意味に読み取れたのですが、何の GUID か読み取れませんでした。

Excel タイプライブラリの LIBID は
  {00020813-0000-0000-C000-000000000046}
Workbook コクラスの CLSID は
  {00020819-0000-0000-C000-000000000046}
IWorkbookEvents インターフェイスの IID は
  {00024412-0001-0000-C000-000000000046}
IWorksheets インターフェイスの IID は
  {000208B1-0001-0000-C000-000000000046}

……のように、Excel 97 だろうと Excel 2010 だろうと、
そのタイプライブラリには、同じ GUID(uuid) が使われているものと
認識していたのですが、そういう話では無いのでしょうか。
(GUID が変わってしまうと、バージョン間の互換性が失われてしまうため)


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加