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

解決


M.Blocker  2008-12-03 09:37:12  No: 140949  IP: 192.*.*.*

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

編集 削除
YuO  2008-12-03 13:56:12  No: 140950  IP: 192.*.*.*

以下,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 14:25:55  No: 140951  IP: 192.*.*.*

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

編集 削除
M.Blocker  2008-12-03 16:05:41  No: 140952  IP: 192.*.*.*

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-03 16:38:41  No: 140953  IP: 192.*.*.*

> としたのですが、
それだと、オブジェクトが正しく解放されません。それぞれの 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 11:49:19  No: 140954  IP: 192.*.*.*

魔界の仮面弁士さんありがとうございます。
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-05 16:57:03  No: 140955  IP: 192.*.*.*

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


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

編集 削除
M.Blocker  2008-12-09 16:28:55  No: 140956  IP: 192.*.*.*

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

編集 削除