VB2008を使用して以下のプログラムを組みたいのですが、
方法がわからないので教えてください。。
①Form内Button_Clickで、TextBoxの値をExcelのアクティブセルに出力
②アクティブセルに数値が入力されたら、隣または下のセルをアクティブにする
①のアクティブセルに出力する方法を教えてください。
②についてはExcelマクロで対応することにしましたが、
VB上からExcelマクロを実行する方法も教えてください。
以下,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メソッド実行するだけだと思うのですが。
YuOさんが既にアドバイスされてますが、(2)について
http://support.microsoft.com/kb/306682/ja
が参考になります。
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ですが、バージョンによってできる/できないはありますか?
> としたのですが、
それだと、オブジェクトが正しく解放されません。それぞれの 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 オブジェクトの管理をきちんと行わねばいけない場合には、バージョンを
一致させておいた方が無難です。
# 一応、旧バージョンのメソッド定義も残されてはいる事が多いので、
# 定義が変更されたメソッドであっても、コーディングによっては、
# そのまま動作する事もありますけれども…。
魔界の仮面弁士さんありがとうございます。
RunでExcelマクロではなく、xlUpでアクティブセルを取得することにしました。
ですが、アクティブセルに値を入力しようと次のようにしましたが
Dim xlUp As Integer = -4162
xlSheet.Range("A65536").End(xlUp).Offset(1, 0).Activate()
xlApp.ActiveCell.value = TextBox1.Text
「オブジェクト変数または With ブロック変数が設定されていません。」
のエラーが出てしまいます。
ヒントを見ても解りませんでしたので、対処方法を教えてください。
どこかでNothingが返されたのでしょう。
どこで返されたのかは,ちゃんとデバッグしてくださいとしか言えませんが……。
魔界の仮面弁士さんの助言通り,COMオブジェクトをちゃんと変数に受けておけば,どこでNothingが返ったかがわかりやすいと思います。
なお,Option Strict Onを推奨。
たぶん,xlApp.ActiveCell.Valueへの代入はできないはず (引数付きプロパティだから)。
# でも,Office系はMissing.Valueのためにかobjectを引数に取ることが多い……。
同僚などから聞いて、自己解決しました。
多々アドバイスいただきましてありがとうございました。
ツイート | ![]() |