VBからExcelアクティブセルに出力

解決


M.Blocker  2008-12-03 18:37:12  No: 140949

VB2008を使用して以下のプログラムを組みたいのですが、
方法がわからないので教えてください。。 
①Form内Button_Clickで、TextBoxの値をExcelのアクティブセルに出力 
②アクティブセルに数値が入力されたら、隣または下のセルをアクティブにする 
 
①のアクティブセルに出力する方法を教えてください。
②についてはExcelマクロで対応することにしましたが、
VB上からExcelマクロを実行する方法も教えてください。


YuO  2008-12-03 22:56:12  No: 140950

以下,Office 2007のPIAを使っている前提で書いています。

(1)
・Excelのアクティブセルを取得する方法
Microsoft.Office.Interop.Excel.ApplicationのインスタンスのActiveCellプロパティを参照する
・セルに値を設定する方法
Microsoft.Office.Interop.Excel.RangeのインスタンスのValueメソッドまたはValue2プロパティを使う

(2)
・Excelのマクロを実行する方法
Microsoft.Office.Interop.Excel.ApplicationのインスタンスのRunメソッドを使う
ただし,Excel 2007の既定の設定では,マクロを実行することはできません。

というか……Excel VBAでできることは,基本的にCOMとして扱うことで処理出来ます。
Microsoft.Office.Interop.Excel.Rangeのインスタンスのget_Offsetメソッドで一個下のRangeのインスタンスを取得して,Selectメソッド実行するだけだと思うのですが。


アクア  URL  2008-12-03 23:25:55  No: 140951

YuOさんが既にアドバイスされてますが、(2)について
http://support.microsoft.com/kb/306682/ja
が参考になります。


M.Blocker  2008-12-04 01:05:41  No: 140952

YuOさん、アクアさんアドバイスありがとうございます。
まず①アクティブセルについては、
Dim excelObj As Object = GetObject("フルパス\ファイル名")
Dim xlSheet As Object = excelObj.worksheets("シート名")
excelObj.Application.Visible = True
xlSheet.Range("指定セル").Activate()
Dim xlCell As Object = xlSheet.ActiveCells
としたのですが、
「公開メンバ 'ActiveCells' は型 'Worksheet' に見つかりませんでした。」でエラーとなってしまいます。

また①でセルをアクティブにしないで②マクロ実行を
excelObj.run("マクロ名")
としてみたところ、
「公開メンバ 'run' は型 'Workbook' に見つかりませんでした。」
でまたエラーとなってしまいます。
どう修正すればよいのか教えてください。
ちなみにExcelは2002ですが、バージョンによってできる/できないはありますか?


魔界の仮面弁士  2008-12-04 01:38:41  No: 140953

> としたのですが、
それだと、オブジェクトが正しく解放されません。それぞれの COM オブジェクトを
変数に受けて、使用後に Marshal.ReleaseComObject を呼び出すようにしましょう。

> 「公開メンバ 'ActiveCells' は型 'Worksheet' に見つかりませんでした。」でエラーとなってしまいます。

'ActiveCells' は、そもそも存在しません。
'ActiveCell' ならばありますが、それを持つのは Worksheet ではなく、
Windows オブジェクトと Application オブジェクトです。

> 「公開メンバ 'run' は型 'Workbook' に見つかりませんでした。」

'Run' (≠'run')を持つのは、Application です。
Workbook にあるのは、'RunAutoMacros' メソッドです。

ちなみに、Range にも 'Run' がありますが、これは
(Excel 4 互換の)マクロシートを利用するためのものです。

> Excelは2002ですが、バージョンによってできる/できないはありますか?
細かく説明すると大変ですが、Excel というのはバージョン間で、
タイプライブラリの互換性が十分に保たれてはいないので、開発環境と
実行環境の Excel バージョンが異なると、動作しなくなる事はよくあります。

Excel のバージョンが上がると、Sub メソッドが Function メソッドになっていたり、
引数の数が異なっていたりするメソッドがあります。そのため VB.NET のように、
COM オブジェクトの管理をきちんと行わねばいけない場合には、バージョンを
一致させておいた方が無難です。

# 一応、旧バージョンのメソッド定義も残されてはいる事が多いので、
# 定義が変更されたメソッドであっても、コーディングによっては、
# そのまま動作する事もありますけれども…。


M.Blocker  2008-12-05 20:49:19  No: 140954

魔界の仮面弁士さんありがとうございます。
RunでExcelマクロではなく、xlUpでアクティブセルを取得することにしました。
ですが、アクティブセルに値を入力しようと次のようにしましたが
Dim xlUp As Integer = -4162
xlSheet.Range("A65536").End(xlUp).Offset(1, 0).Activate()
xlApp.ActiveCell.value = TextBox1.Text
「オブジェクト変数または With ブロック変数が設定されていません。」
のエラーが出てしまいます。
ヒントを見ても解りませんでしたので、対処方法を教えてください。


YuO  2008-12-06 01:57:03  No: 140955

どこかでNothingが返されたのでしょう。
どこで返されたのかは,ちゃんとデバッグしてくださいとしか言えませんが……。
魔界の仮面弁士さんの助言通り,COMオブジェクトをちゃんと変数に受けておけば,どこでNothingが返ったかがわかりやすいと思います。

なお,Option Strict Onを推奨。
たぶん,xlApp.ActiveCell.Valueへの代入はできないはず (引数付きプロパティだから)。
# でも,Office系はMissing.Valueのためにかobjectを引数に取ることが多い……。


M.Blocker  2008-12-10 01:28:55  No: 140956

同僚などから聞いて、自己解決しました。
多々アドバイスいただきましてありがとうございました。


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




  


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