連続の質問申し訳ありません。
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が残ってしまう
上記のソースでは、問題があるようでうまくいきません。
何かよい方法はないでしょうか?
そういう動作なら、通常Excelファイルを生成してから
OLEでExcelを起動するのではなく、ただのプロセスとし
て起動し、後始末をVB側でしないという方法になろうか
と思います。
要は生成保存したExcelファイルを開く動作でExcelを起
動させるだけ。
なので・・・
Process.Start("xxxxx.xls")
でよいのでは?
以上。参考まで
オショウ様
Excelにデータを書き込む作業は別の方法で行い、その後Processで起動するのでしょうか?
その場合書き込む方法としては、何か参考になるサイトなどないでしょうか?
ちなみにユーザー側のExcelは2000〜2010まで混在している状況です。
今までは以下のソースでエクセル出力していました。
問題なく動作していたのですが、開発環境の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 などが定義されませんというエラーが出る状態です。
現在、全く違う方法に変えるかどうか悩んでいます。
連続書き込みすみません。
プロジェクトの参照設定でInterop.Excel.dllを再設定したらエラーはなくなりました。
直前に書き込んだソースで問題ないでしょうか?
office関連のCOMアプリケーションは、GUIDが各々異なるので
参照設定を各々行うか、GUIDで起動できるように細工しない
といけません。
どのバージョンのExcelが導入されているにか解らない場合は
探し出す機能も必要になるでしょう。
まずは、参照設定ができたのでエラーが無くなった。と言う事
ですので、残るは要望される動作を行えるか。です。
ユーザーがExcelを閉じるならProcess起動でしょう。
ただし、閉じ忘れ・・・を監視したいなら、非同期実行で、
終了を捕捉する必要があるかもしれません。
http://dobon.net/vb/dotnet/process/index.html
この辺が参考になるかと。
以上。
ありがとうございます。
参考のページを見ていろいろ試してみます。
> 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 が変わってしまうと、バージョン間の互換性が失われてしまうため)
ツイート | ![]() |