Excel11を参照してエクセルを開くには?

解決


tsuk@sa  2006-02-27 21:57:53  No: 130448

現在、VBを勉強するためにアプリを作っておりまして…
詳しく知りたいので、詳しく書きたいのですが、
試行錯誤した所から書くと膨大な量になりますので、要点(と思われるところ)だけで失礼します。

環境は、WinXP、Excel2003、VB.NET2003です。
最初、訳も分からず「Excel5.0 ObjectLibrary」を参照していましたが、うまく行かないので、
参照の「*excel」だけを削除して「11.0」を参照させました。

「5.0」では、うまく行ってたのですが、
Dim xlApp As New Excel.Application
Dim xlBook As WorkBook
では、「Excel.Application」「WorkBook」で波線が出ます。

http://support.microsoft.com/kb/306022/
http://support.microsoft.com/kb/302094/ja
http://www.microsoft.com/japan/msdn/vbasic/migration/tips/office.aspx
他、色々のサイトのサンプルを試しましたが、どれもデバッグ時点でエラーが出ます。
「5.0」「11.0」の順で参照させたところ、「Excel.Application」「WorkBook」では波線は出ませんでしたが、「xlapp.Workbooks.Open(filePath)」が実行のところでエラーが出て止まりました。

参照の仕方が何か悪いのでしょうか?
それとも、コードの書き方が悪いのでしょうか?
もう何をすれば良いのか、わかりません。
どうすれば、いいのでしょうか?

どなたかご教示の程、宜しく御願いいたします。


魔界の仮面弁士  2006-02-28 01:30:16  No: 130449

> 「5.0」「11.0」の順で参照させたところ
これらを同時に参照させないでください。

あと、Office 関連のコンポーネントを扱う際には、参照設定画面の
「COM タブ」の方ではなく、「.NET タブ」の方にある物を使ってください。

Office 2003 の PIA (プライマリ相互運用機能アセンブリ)というヤツです。
http://www.microsoft.com/japan/msdn/office/office2003/OfficePrimaryInteropAssembliesFAQ.asp
http://support.microsoft.com/kb/328912/
http://support.microsoft.com/kb/823986/

> では、「Excel.Application」「WorkBook」で波線が出ます。
波線がでる時は、エラーの理由も別画面に表示されますよね。
そうしたメッセージも記載してください。

で、エラーメッセージが書かれていないので、何とも判断しにくいのですが、
おそらくは、名前空間の指定に問題があるのだと思いますので、その
波線さえ解消すれば、正常に動くようになるでしょう。

まずは オブジェクトブラウザ を使って、Workbook という型名が、
どの名前空間にあるのかを確認してみてください。
名前空間さえわかれば、それを Imports で指定すれば解決できるかと。

# Imports する名前空間は、参照設定しているのが Interop.Excel.dll なのか
# Microsoft.Office.Interop.Excel.dll なのかによって異なります。

> Dim xlApp As New Excel.Application
New の際には、Excel.○○Class の方を使った方が良いと思います。

http://support.microsoft.com/kb/306022/
http://support.microsoft.com/kb/302094/ja
http://www.microsoft.com/japan/msdn/vbasic/migration/tips/office.aspx
これらのサンプルでは、オブジェクトの解放処理が正しく行われていませんね。
(最後の 1 つはまだマシですが…それでも完全ではなさそうです)

Excel のインスタンスが解放されずに残ってしまう可能性があるため、
あまり鵜呑みにしない方が良いかと思いますよ。

Excel を確実に解放するために、以下をご覧下さい。
http://support.microsoft.com/kb/317109/
http://www.bcap.co.jp/hanafusa/dotnet/Excel08.htm
http://jeanne.wankuma.com/tips/programing/releasecom.html


tsuk@sa  2006-02-28 07:32:40  No: 130450

早々の御返事、誠にありがとうございます。(涙

>そうしたメッセージも記載してください。
申し訳ございません。
「型'○○○'が定義されておりません」と出ておりました。

それで、御指導の通り、
「.netからの参照」の後、Excel内を調べましたら「WorkBook」等がありました。
そこで「Imports Microsoft.Office.Interop.Excel」を付け加えましたが、
「Excel.Application」だけに波線が残りましたので、

        Dim xlApp As New Application
                    ・
                    ・
                    ・
        xlApp = System.Reflection.Missing.Value
        xlApp = CreateObject("new Excel.Application")

としてデバッグしましたが、下のxlAppで停止しましたので、
下のxlApp2行を取り払い、デバッグしたところExcelが起動しました!!

ありがとうございますっ!

とは言え、こんな素人考えな事をして、何か不具合はないのでしょうか…?


魔界の仮面弁士  2006-02-28 11:43:35  No: 130451

> とは言え、こんな素人考えな事をして、何か不具合はないのでしょうか…?
かなりマズイでしょう。

それぞれの処理を、ほとんど理解しないまま書いていませんか? (^^;
偶然動いただけという、いきあたりばったりのコーディングだと、
どこに問題があるのかを把握できなくなるので、後々、困りますよ。

>  Dim xlApp As New Application
それでも間違いでは無いのですが、この表記だと、その名前空間が
    System.Windows.Forms.Application
の事を指しているのか、それとも
    Microsoft.Office.Interop.Excel.Application
の事を指しているのかが曖昧になるため、名前空間の宣言は
  Imports Microsoft.Office.Interop
までにしておいて、
  Dim xlApp As New Excel.Application
のように記述するのが一般的です。

> xlApp = System.Reflection.Missing.Value
えぇと、なぜこの時点で、Missing.Value の表記がでてきたのでしょうか?(^^;

VB.NET では、Missing.Value を使う事は、ほとんどありません。
C# であれば使いますが…それにしても、この状況では使われません。

> xlApp = CreateObject("new Excel.Application")
CreateObject構文を使うのであれば、
   xlApp = CreateObject("Excel.Application")
ですし、New 構文を使うのであれば、
   xlApp = New Excel.ApplicationClass
です。どっちつかずのコードになっていますよ。

そもそも、最初の変数宣言時に
  Dim xlApp As New Excel.Application
と書いているわけですが、これは、
  Dim xlApp As Excel.Application = New Excel.ApplicationClass
の省略表記です。

変数宣言の時点で、変数 xlApp に、Applicationオブジェクトを
既に代入しているのですから、その後で、xlApp に新たな
オブジェクトを再代入する必要はありませんし、再代入してもいけません。

# 前のオブジェクトを解放せずに、その変数に別のオブジェクトを代入すると、
# 前のオブジェクトが正しく解放されず、Excelが終了せずに残ってしまいます。


tsuk@sa  2006-02-28 13:46:12  No: 130452

丁寧な解説、誠にありがとうございます。
結局、よくよく考えてみれば、Excelの既存シートのセルへデータを代入し、名前を変えて.xlsファイルで保存ができればいいのですが、
それ以前に、あの後、いくらやってもエクセルの表示以外できません。
何というか、「エクセル一閃っ!」って感じで、何も出来ません。orz

> xlApp = System.Reflection.Missing.Value
> xlApp = CreateObject("new Excel.Application")
は、MSのソースのコピペでした。

Imports Microsoft.Office.Interop.Excel
Imports Microsoft.Office.Core
Imports System.Runtime.InteropServices
としてやりましたが、相変わらず「Excel.Application」での波線は消えません。他は消えました。
どこ探しても、「excel()」っていうのがないんです。
> 「5.0」「11.0」の順で
の時は、出てきたのですが。

土曜日からずっとこの調子で、今回、よろこんだ分、凹んでますので、
もう少し、状況などをきっちり整理した上で、カキコさせて戴きます。

orz・・・


tsuk@sa  2006-03-01 01:53:59  No: 130453

起動しました!

「Imports Microsoft.Office.Interop」として「.Excel」を除いたところ、
「Dim xlApp As」のところから、「Excel」「Application」ともに表示が出ました。
結局、こんな感じのソースになりました。
Imports Microsoft.Office.Interop
Imports Microsoft.Office.Core
Imports System.Runtime.InteropServices
--------------------------------------------------
        Dim xlApp As New Excel.ApplicationClass
        Dim xlBook As Object
        Dim xlBooks As Object
        Dim xlSheet As Excel.Worksheet
        Dim xlSheets As Excel.Worksheets

        With xlApp
            .Visible = True
            xlBooks = .Workbooks
            xlBook = xlBooks.Add
            xlSheet = xlBook.ActiveSheet

            xlBooks.Open("C:\Templete.xls")
            xlBooks = xlApp.Workbooks
            xlSheets = xlApp.Worksheets("1st")
        End With

ありがとうございました。
下から2行目("1st")で止まりますが、後はこれと名前を変えて保存だけです。
頑張ります。丁寧なレスを戴き、ホントにありがとうございました。


魔界の仮面弁士  2006-03-01 02:56:54  No: 130454

解決チェック済みのようですが、幾つか危なそうな点があるので、
それぞれ、情報(○)、警告(△)、要修正(×)を付けて回答しておきます。

>  With xlApp
>     .Visible = True
>     xlBooks = .Workbooks
(○) まず、ここまでは良いと思います。

>     xlBook = xlBooks.Add
(○) この場合、空のワークブックが生成されますね。
(○) 元となるテンプレート(*.xlt, *.xls)がある場合には、上記を
      xlBook = xlBooks.Add("C:\Templete.xls")
    のように記述する事もできます。このようにすると、Templete.xls を
    基にした、新規のワークブックが表示されますよ。

>     xlSheet = xlBook.ActiveSheet
(△) 処理が曖昧になりますので、Active系プロパティは、できる限り
    使わないようなコーディングを心掛けた方が良いでしょう。
(×) しかし、ここで ActiveSheet を受け取った所で、その後それを
    全く使っていないのですから、意味がありません。
    この行は削除してしまいましょう。

>     xlBooks.Open("C:\Templete.xls")
(×) xlBook.Open は、ActiveXオブジェクトを返しますので、使用後に
    解放の義務があります。Addと同様、戻り値を変数に受けて下さい。
(○) .Add の場合、新規のブックを作成しますが、.Open を使った場合は、
    ファイルそのものが開かれます。もし、元のファイルを残しておきたい
    のであれば、.Open よりも、.Add で開いた方が都合が良いでしょう。

>     xlBooks = xlApp.Workbooks
(×) 無意味です。この行も削除してください。
    すでに xlBooks 変数には、xlApp.Workbooks を格納してあるので、
    ここで再度取得しなおした所で、意味が無いからです。

>     xlSheets = xlApp.Worksheets("1st")
> 下から2行目("1st")で止まりますが、後はこれと
(×) xlApp.Worksheets でも操作できますが、それだと、複数のブックが
    開かれていたような場合に、処理が曖昧になってしまいます。
    1stシートは、「Templete.xls」のワークブック上のシートなのですから、
    この場合は、xlApp.Worksheets ではなく、xlBook.Worksheets を使うように
    修正した方が良いでしょう。ちなみに、xlBook.Sheets でも OK です。
(×) 1stシートのデータ型は「Worksheets型」ではなく「Worksheet型」です。
    つまり最終的に受け取る変数も、xlSheets ではなく xlSheet の方となります。
(×) ただし、.Worksheets("1st") のような書き方はしてはいけません。
    理由は、先述の URL を参照してもらうとして、具体的な修正案としては、
    以下のようなコードとなります。
      Dim xlSheets As Excel.Sheets
      Dim xlSheet  As Excel.WorkSheet
            :
      xlSheets = xlApp.Worksheets    'まず、.Worksheets までを変数に受け取ってから
      xlSheet = xlSheets("1st")      '個々の Worksheet を取り出すようにする。
    ただし、VB.NET の設定を厳密な型指定モード(Option Strict On)に
    している場合には、上記ではエラーとなります。その場合は、
      xlSheets = xlApp.Worksheets
      xlSheet = DirectCast(xlSheets("1st"), Excel.Worksheet)
    のように、「DirectCast」を使った明示的な型変換が必要となるでしょう。

> 名前を変えて保存だけです。
(○) Workbookオブジェクトには、Saveメソッドや SaveAs メソッドがありますので、
    これを利用して保存ができます。詳しくは、Excel 側のヘルプを見てください。
(△) ただし、保存しただけで安心してはいけません。プログラム中で使用した
    ActiveXオブジェクト全てを、解放してあげないと、Excel が終了せず、
    非表示にて残ってしまう原因となるからです。先の URL を参考にして、
    Marshal.ReleaseComObject メソッドで、ひとつひとつ解放してあげましょう。


tsuk@sa  2006-03-02 07:45:15  No: 130455

ご丁寧な回答ありがとうございます。
結局、このようにしました。

Dim xlApp As New Excel.ApplicationClass
Dim xlBooks As Excel.Workbooks
Dim xlBook As Excel.Workbook
Dim xlSheets As Excel.Worksheets
Dim xlSheet As Excel.Worksheet

With xlApp
    xlBooks = .Workbooks
    xlBook = xlBooks.Add("C:\Program Files\JKS\dat\StdTemplete.xls")
    xlSheet = xlBook.Worksheets("1st")
End With

With xlSheet
    .Range("e4").Cells.Value = TextBox1.Text '日付
    .cell("t4").value = TextBox2.Text 'ひらがな
    .Cells("ae3").value = TextBox3.Text '半角数字
End With

'Com解放
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets)
xlBook.Close()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
xlApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)

ですが、
「'System.NullReferenceException' のハンドルされていない例外がmicrosoft.visualbasic.dll で発生しました。

追加情報 : オブジェクト変数または With ブロック変数が設定されていません。」
と'Com解放の前に出て中断してしまいます。
Excel自身は起動しますが、デバッグ毎に手作業で終了させています。


魔界の仮面弁士  2006-03-02 09:37:10  No: 130456

> With xlApp
>     xlBooks = .Workbooks
今回の場合、With の影響範囲が、この1行だけですよね。
分かりにくくなるだけなので、この場合は With を取って、
   xlBooks = xlApp.Workbooks
のようにした方が良いと思いますよ。

>     xlBook = xlBooks.Add("C:\Program Files\JKS\dat\StdTemplete.xls")
これは良いとして……

>     xlSheet = xlBook.Worksheets("1st")
> End With
これが NG 。正しくは、
  xlSheets = xlBook.Worksheets
  xlSheet = xlSheets("1st")
です。

で、エラーの原因もここにあります。要するに、元のコードだと、
変数 xlSheets が一度も使われていなかったわけですよ。

一度も xlSheets にオブジェクトを代入していないわけですから、
中身は当然 空っぽ (つまり、Nothing) な状態です。それなのに、
何もない物を解放しようとしたために、

> 「'System.NullReferenceException' のハンドルされていない例外が
>   microsoft.visualbasic.dll で発生しました。
>   追加情報 : オブジェクト変数または With ブロック変数が
>   設定されていません。」

というエラーが発生していたわけです。

> With xlSheet
>    .Range("e4").Cells.Value = TextBox1.Text '日付
これも NG です。

.Range("e4") が返す物は COM のオブジェクト。(Excel.Range型)
.Cells が返すものも、COM のオブジェクト。(Excel.Range型)

これらの 2 つの解放処理が抜け落ちています。修正するとすれば、
   Dim aaa, bbb As Excel.Range
   aaa = xlSheet.Range("E4")
   bbb = aaa.Cells
   bbb.Value = TextBox1.Text
      :
      :
   System.Runtime.InteropServices.Marshal.ReleaseComObject(bbb)
   System.Runtime.InteropServices.Marshal.ReleaseComObject(aaa)
のようなイメージとなりますね。


魔界の仮面弁士  2006-03-02 10:01:01  No: 130457

>     .cell("t4").value = TextBox2.Text 'ひらがな
これは、掲示板に投稿する際に編集したものですよね?
.cell というプロパティは無いので、エラーになるはずです。

実際のコードは、.Cells(〜) か .Range(〜) ですよね?
# "T4"という文字列で指定しているので、多分 Range の方だと思いますが…。

>     .Cells("ae3").value = TextBox3.Text '半角数字
> End With
これも NG です。先ほどと同様、解放処理が抜けています。
(その前の行の "T4" セルの操作も同様かな)

オブジェクトブラウザで確認していただくと分かるのですが、
  Worksheet の Range プロパティ : 引数が 1個〜2個 : Range型を返す
  Worksheet の Cells プロパティ : 引数は取らない : Range型を返す
のような定義になっていますよね。

それなのに、.Cells(…) と引数があるかのように記述できるのは、実は
  .Cells(1)
というコードでは、既定のプロパティが省略されており、実際は
  .Cells._Default(1)
のように処理されるからです。

この場合の修正案は……もしも Cells プロパティを使って処理するなら、

  ccc = xlSheet.Cells
  ddd = ccc(4, 20)   '第4行20列 = T4 セル
  ddd.Value = TextBox2.Text  'ひらがな
  System.Runtime.InteropServices.Marshal.ReleaseComObject(ddd)
  ddd = ccc(3, 31)   '第3行31列 = AE3 セル
  ddd.Value = TextBox3.Text  '半角数字
  System.Runtime.InteropServices.Marshal.ReleaseComObject(ddd)
  System.Runtime.InteropServices.Marshal.ReleaseComObject(ccc)

という感じになり、Range プロパティを使って処理するなら、

  ccc = xlSheet.Range("T4")
  ccc.Value = TextBox2.Text   'ひらがな
  System.Runtime.InteropServices.Marshal.ReleaseComObject(ccc)
  ccc = xlSheet.Range("AE3")
  ccc.Value = TextBox3.Text   '半角数字
  System.Runtime.InteropServices.Marshal.ReleaseComObject(ccc)

という感じになるでしょうね。

# なお、上記で ccc とか ddd とか書かれいる部分は、
# Excel.Range 型の変数だと思ってください。


tsuk@sa  2006-03-02 10:11:32  No: 130458

いつも詳細に御返事戴いて、ホントに申し訳ありません。

xlSheet = xlSheets("1st")で必ず上記と同様のエラーが出ます。
その後のE4のデータの入力も、開いたシートに反映されてないし…
何故でしょう?
また訳がわかんなくなってきました。

それと、あの・・・申し訳ありません。
追加の質問なんですが、
VBのフォーム上のデータをExcelのセルへ入力したいのですが、
必ず、Range("E4")のように範囲指定するか、配列を作って、
その上でのデータ入力になるのでしょうか?

また、そのデータも解放せねばならないのでしょうか?


tsuk@sa  2006-03-02 10:21:23  No: 130459

あら?行き違いになっちゃいましたね。
いつも、ありがとうございます。

何故か、cellでエラーが出ていません。
それと当初は、
.Range("E4").Cells.Value = TextBox1.Text

にしていました。
しかし、開いたシートに全然、反映されないので、色々と実験していたのですが、
今回、その最中のコードを消し忘れていました。

実際に作りたいのは400くらいのデータをExcelに入力させるようなものを作るつもりなので、
その一つ一つを解放するとなると、大変な作業になりますね。orz


特攻隊長まるるう  2006-03-02 18:31:17  No: 130460

>実際に作りたいのは400くらいのデータをExcelに入力させるようなものを作るつもりなので、
>その一つ一つを解放するとなると、大変な作業になりますね。orz
データを入力しないセルも含めて、矩形の範囲に配列で処理すれば
1回で済むのでは?データを入力しないセルに何か入ってるなら
最初に読み込めばいいし、別シートとか配列で対応できない形式で
あっても、プログラムから書き込む範囲を別に用意して、エクセル側で
そのセルを参照する形にしても良いし。


魔界の仮面弁士  2006-03-02 18:42:02  No: 130461

> 必ず上記と同様のエラーが出ます。
NullReferenceException の例外だとすれば、多くの場合は、
「Nothing 状態の変数を操作しようとした」事が原因です。

どの行を実行した時にエラーが発生しているのかを調べ、その時の変数に、
どのような値/オブジェクトを格納しているのか、再確認してみましょう。

> 必ず、Range("E4")のように範囲指定するか、配列を作って、
> その上でのデータ入力になるのでしょうか?
セルへのデータ指定方法としては、以下のような物があります。
-------------
(1) Cells プロパティか Range プロパティで、特定のセル範囲
  (1つのセルだけではなく、複数のセル範囲も指定可能です)を取得し、
  そこに単一の値、または複数の値(1次元配列または2次元配列)を渡す。

(2) クリップボード経由でデータを渡す。(Pasteメソッド)

(3) ADODB.Recordset経由でデータを渡す。(CopyFromRecordsetメソッド)
-------------
他にも方法はありますが、基本的には(1)の手法が一般的でしょうね。
今回使っている方法も、(1)を使ったコードですね。

> 何故か、cellでエラーが出ていません。
Option Strict Off モードなら、コンパイルエラー(赤い波線表示)にはなりません。
それとも、実行時にもエラーにならないという事でしょうか。
(少なくとも、当方ではエラーになりました)

> それと当初は、
> .Range("E4").Cells.Value = TextBox1.Text
> にしていました。
E4 の位置に出力するだけなら、.Cells は余計です。
Range("E4").Value = 〜 で充分でしょう。
実際には、オブジェクト解放も視野に入れるので、
  foo = .Range("E4")
  foo.Value = TextBox1.Text
  System.Runtime.InteropServices.Marshal.ReleaseComObject(foo)
ですね。

> その後のE4のデータの入力も、開いたシートに反映されてないし…
さしあたり、以下の点をチェックしましょう。

* 最初に xlApp.Visible = True を入れて、Excel を表示させた状態に
  してみて、Excel 上に予想通りの結果が渡されているかを確認。
  (一行ずつステップ実行して、そのたびに Excel の状態を見る)

* プログラムを実行した後、[Ctrl]+[Shift]+[ESC]キーで、
  タスクマネージャを表示してみて、その「プロセス」タブに、
  非表示の Excel が残っていない事を確認。
  (残っていたら、プログラム中にオブジェクトの解放漏れがあるという事)

* ブックを Close する前に、SaveAs メソッドを呼び出し、
  ファイルを明示的に保存するようにしてみる。

> その一つ一つを解放するとなると、大変な作業になりますね。orz
連続した領域なら、配列を使って一度に指定できますので、利用してみてください。

それと、セルへの代入時に毎回解放するのが面倒なのであれば、
代入処理と解放処理を行うための Sub / Function を用意すれば、
呼び出し側のコードが煩雑になる事を防げると思いますよ。


特攻隊長まるるう  2006-03-02 18:45:31  No: 130462

>xlSheet = xlSheets("1st")で必ず上記と同様のエラーが出ます。
は解決したのかな?単純に『1st』って名前のシートが無いとか?
全角半角が違うとか?

        xlSheets = xlBook.Worksheets
        For Each xlSheet In xlSheets
            Debug.WriteLine(xlSheet.Name)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)
        Next

で出力ウィンドウに出力されるシート名を確認してみては?


tsuk@sa  2006-03-03 12:20:40  No: 130463

たくさんのアドバイスありがとうございます。
        Dim xlApp As New Excel.ApplicationClass
        Dim xlBooks As Excel.Workbooks
        Dim xlBook As Excel.Workbook
        Dim xlSheets As Excel.Sheets  ←WorkSheetsになってました。
        Dim xlSheet As Excel.Worksheet
        Dim xlRange As Excel.Range
        Dim DataArray2(200, 40) As Object
        Dim r2 As Integer
        Dim c2 As Integer
 
        xlBooks = xlApp.Workbooks
        xlBook = xlBooks.Open("C:\test.xls")←addを変更しました。
        xlSheets = xlBook.Worksheets
        xlSheet = xlSheets.Item("1st")      ←Itemをつけました。
        xlApp.Visible = True
としました。

それで、配列 DataArray2 にデータを代入して、
 DataArray2(r2,c2)= Text1.Text 

最後に、入力しました。
 xlRange.Value = DataArray2 

途中、配列のインデックスが少なかったので+αしました。
それで過去スレを参考して、印刷
 xlsApp.ActiveWorkbook.PrintOut Copies:=1, Collate:=True
しましたが、データがどこに飛んでいったのか、
殆どのセルが空白になって、20枚くらい印刷されそうになりました。
セルの結合をしてると、それを一つとして数えなければならないのでしょうか?
次にとる策として、セルの結合も罫線も全て、指定した方が良いのでしょうか?

それと
System.Runtime.InteropServices.Marshal.ReleaseComObject(DataArray2)
にしました。エラーが出て消しましたが、今、考え中です。


tsuk@sa  2006-03-03 12:44:58  No: 130464

すみません。全然、頓珍漢なレスしてました。

印刷をきっちりさせれば、10枚程度になりそうです。
一度、一枚だけプリントアウトさせて、プリンターをリセットしました。
その時、ファイルを保存するかどうか聞いてきたので、キャンセルして中を覗いてみました。
すると、200の内、3つ程だけがセル上に残り、
シート上のテンプレートの文字類は全て消されて罫線だけが残っておりました。
配列内のデータ、nullも合わせて丸ごと貼り付けたんだから、当然ですよね。

ただ、印刷時に「11/21枚」と出て、印刷プレビューさせると二枚しかないので、
その他のデータがRange外に出てるのでしょうか?


tsuk@sa  2006-03-03 12:48:52  No: 130465

あーまた・・・このところコレにかかりきりで、連日4時間睡眠なのでボーっとしてるのかな。
上記のやり方で、エクセルは開くようになりました。
それから、Worksheetsをsheetsに直してからnothingが無くなり、
やっと、データ処理をしてくれるようになりました。

そのデータも、どこかへ飛んでってますが。orz
お休みなさい。


魔界の仮面弁士  2006-03-03 18:21:30  No: 130466

> xlsApp.ActiveWorkbook.PrintOut Copies:=1, Collate:=True
これ自体は、Excel VBA的なコードですね。
VB.NETからの操作だと、 xlBook.PrintOut 〜〜 、かな。

> System.Runtime.InteropServices.Marshal.ReleaseComObject(DataArray2)
解放が必要なのは、COMのオブジェクトだけです。
DataArray2 は .NETのオブジェクトなので、上記の処理は不要です。

なお、COMのオブジェクトかどうかは、Marshal.IsComObject で判断できます。

> シート上のテンプレートの文字類は全て消されて罫線だけが残っておりました。
> 配列内のデータ、nullも合わせて丸ごと貼り付けたんだから、当然ですよね。
配列を用意する部分を、
  xlRange = xlSheet.Range("A1:D3")
  foo = xlRange.Value
のようにすると、セルの値を持った二次元配列 foo が得られますので、
得られた、foo の中身を一部書き換えてから
  xlRange.Value = foo
のようにして書き戻せば、元のデータが消えてしまうことを防げるかも。


tsuk@sa  2006-03-05 08:12:35  No: 130467

御返事送れてスミマセン。

当初、A1方式を、R1C1方式に書き直したので、
写し違いで、いくつかズレたくらいで、
> xlRange.Value = foo
で、ほぼ完璧にExcelへ書き込みできました。
ホンっトに、ありがとうございます。

これを元に、また何か作ろうと思います。
今度は、メンテしやすいように…やっぱ仕様書から作るべきかなぁ…


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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