@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

VB.NETですでに開いているEXCELの操作

1
投稿者投稿内容
をたママ
会議室デビュー日: 2008/06/12
投稿数: 5
お住まい・勤務地: 静岡県
投稿日時: 2008-08-16 07:34
VB.NETで、既に開いているEXCELブックにあるシートのセルの値を取得したいのですが、
どうすればよいのでしょうか?
対象ブックは、別のExcelのマクロから開いて加工処理をし、未保存の状態です。
対象ブックは保存はしない状態(マクロで開く前の状態)にしておきたいです。

保存されているExcelブックを開き、シートにあるセルの値を取得というのはわかるのですが...。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-08-16 13:02
引用:

をたママさんの書き込み (2008-08-16 07:34) より:

対象ブックは、別のExcelのマクロから開いて加工処理をし、未保存の状態です。
対象ブックは保存はしない状態(マクロで開く前の状態)にしておきたいです。
保存されているExcelブックを開き、シートにあるセルの値を取得というのはわかるのですが...。


VB 側と連携できていないので方法としては限られてきますよね。 対象ブックのマクロからどこかに値を吐き出してもらうなど方法はあります。 せめて "別の Excel のマクロ" が VB と連携できていれば、別の Excel のマクロから値を取得することは容易で、そこから VB 側へ値を返すこともまた容易なのですが...

事情がわからないので断言はできませんが、何だかソリューションとして不適切な気がしますね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
をたママ
会議室デビュー日: 2008/06/12
投稿数: 5
お住まい・勤務地: 静岡県
投稿日時: 2008-08-16 14:51
じゃんぬねっとさん、ありがとうございます!
質問内容がうまく説明できていなく、申し訳ありません。

引用:

じゃんぬねっとさんの書き込み (2008-08-16 13:02) より:

VB 側と連携できていないので方法としては限られてきますよね。 対象ブックのマクロからどこかに値を吐き出してもらうなど方法はあります。 せめて "別の Excel のマクロ" が VB と連携できていれば、別の Excel のマクロから値を取得することは容易で、そこから VB 側へ値を返すこともまた容易なのですが...

事情がわからないので断言はできませんが、何だかソリューションとして不適切な気がしますね。





ソリューションとして不適切、確かに自分でも正直なところ、何かすっきりしません。

・マクロのコードをVBに載せてしまう。
・マクロで処理した結果をいったん保存し、マクロ内で作成したシート名をVBに返しているので、該当シートをVBから削除する。
こんな風にした方がいいのでしょうか?

現在はVBからマクロのプロシージャに引数を渡し、作成したシート名を返しています。
Dim objXlsApp As Excel.Application
Dim objXlsBook AS Excel.Workbook
: 省略
strXlsShtNm = _
DirectCast(objXlsApp.Run("'" & objXlsBook.Name & _
"'!make_RemoveData", TxtFileName.Text.Trim, _
CmbSheet.SelectedItem.ToString.Trim), String)

strXlsShtNmに作成したシート名が返されるようにしています。
nas
会議室デビュー日: 2008/08/01
投稿数: 7
投稿日時: 2008-08-16 18:28
こんにちは、nasです。

じゃんぬねっとさんの話で違う方向に行きそうですが、最初の質問の回答です。

VB.Netの入っている環境にOfficeが入ってないので、VB.Netでは試してはいませんが
最近IronPythonでのExcel操作を覚えましたので、こちらで試してみました。

まず、Excelファイル「test.xls」に以下の簡単なマクロを入れました。
コード:

Sub test(p1 As String, p2 As Integer)
ThisWorkbook.Worksheets(1).Cells(1, 1).Value = p1
ThisWorkbook.Worksheets(1).Cells(2, 1).Value = p2
End Sub


次に、IronPythonを2つ立ち上げて1つはExcel起動&マクロ実行、
1つはExcelオブジェクト取得&シートのデータ取得を行ないました。
-------------------------------------------------------
IronPython 2.0 Beta (2.0.0.3000) on .NET 2.0.50727.1433
Copyright (c) Microsoft Corporation. All rights reserved.
>>> import clr
>>> clr.AddReference("Microsoft.Office.Interop.Excel")
>>> from Microsoft.Office.Interop import Excel
>>> app = Excel.ApplicationClass()
>>> app.Visible = True
>>> app.DisplayAlerts = False
>>> fileName="c:\\temp\\test.xls"
>>> book=app.Workbooks.Open(fileName)
>>> app.Run("test","TEST OK!",100)
>>> print book.Worksheets[1].Cells[1,1].Value2
TEST OK!
>>> print book.Worksheets[1].Cells[2,1].Value2
100.0
-------------------------------------------------------
IronPython 2.0 Beta (2.0.0.3000) on .NET 2.0.50727.1433
Copyright (c) Microsoft Corporation. All rights reserved.
>>> import clr
>>> clr.AddReference("Microsoft.VisualBasic")
>>> from Microsoft.VisualBasic import Interaction
>>> fileName="c:\\temp\\test.xls"
>>> book=Interaction.GetObject(fileName)
>>> print book.Worksheets[1].Cells[1,1].Value2
TEST OK!
>>> print book.Worksheets[1].Cells[2,1].Value2
100.0
-------------------------------------------------------
上記の様に、VBの「GetObject」を使えば、起動中のExcelオブジェクトを
取得して結果を受け取ることが出来ます。

仕様が不明なので何とも言えませんが、1つにまとめた方がすっきりするとは思います。

では。


[ メッセージ編集済み 編集者: nas 編集日時 2008-08-16 19:32 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-08-17 03:59
引用:

をたママさんの書き込み (2008-08-16 14:51) より:

現在はVBからマクロのプロシージャに引数を渡し、作成したシート名を返しています。


シート名だけじゃなくてセルの値も返してしまえば良いですよね。

引用:

上記の様に、VBの「GetObject」を使えば、起動中のExcelオブジェクトを
取得して結果を受け取ることが出来ます。


なるほど GetObject 関数ですか。 確かにファイルパスがわかっているのですからできますね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
をたママ
会議室デビュー日: 2008/06/12
投稿数: 5
お住まい・勤務地: 静岡県
投稿日時: 2008-08-17 04:51
nasさん、じゃんねっとさん、ありがとうございます!!

GetObject、セルの値も返してしまう、どちらの方法もうまくいきそうです。
目からウロコです。

早速試してみることにします。
ありがとうございました!!
1

スキルアップ/キャリアアップ(JOB@IT)