アプリ版:「スタンプのみでお礼する」機能のリリースについて

AccessのVBAからExcelのブック(通常既に開いています)のセルの値を参照するものを作成
しているのですが、うまくいきません。ご教授頂けないでしょうか。

Set Set myXlsSheet = myXls.Worksheets("sheet1") の行がインデックスが有効範囲にあり
ません。とエラーがでます。

ここで既に開いているExcelブック自体をWorkbooks.open を使用せずにオブジェクト自体をset
して、各シート値を参照することができないでしょうか。

現状できているコード
Dim myXls As Object
Dim myXlsSheet As Object

Set myXls = CreateObject("Excel.Application")
Set myXlsSheet = CreateObject("Excel.Sheet")
myXls.Visible = False

' Set myXlsSheet = myXls.Workbooks.Open("C:\test.xls", 1) 'これだとまた同じファイルを開いて処理するため処理が遅くなる。

Set myXls = myXls.Workbooks("test.xls") 'インデックスが有効範囲にありません。のエラーがここで出ます。
Set myXlsSheet = myXls.Worksheets("sheet1")

Debug.Print myXls.WorksSheets("sheet1").Cells(1, 1).Value

myXls.Close
Set myXls = Nothing
myXls.Quit
Set myXlsSheet = Nothing
MsgBox "完了"

A 回答 (3件)

dim myxls as object


dim mybook as object
dim mysheet as object 'ダミー

set myxls = createobject("Excel.Application") 'これはエクセルアプリケーションオブジェクト
set mybook = myxls.workbooks.open("c:\test\test.xls") 'どこかではブックを開かないと始まらない

debug.print mybook.worksheets("Sheet1").cells(1, 1).value
mybook.close false
set mybook = nothing
myxls.quit
set myxls = nothing
msgbox "quit"
    • good
    • 0

> ここで既に開いているExcelブック自体をWorkbooks.open を使用せずにオブジェクト自体をset


> して、各シート値を参照することができないでしょうか。

そういうときは、GetObject 関数の出番です。
対象のブックが開かれていないとエラーが発生します。
必要なエラー処理を追加すること。
多分、ネットにサンプルは山ほどあるでしょう。

以下は、開かれているブックを参照するだけのコードですが
ブックを閉じて、エクセルも終了させるなら
コメントをはずしてください。

Sub test()
' Dim myXls As Object
Dim myBook As Object
Dim mySheet As Object

Set myBook = GetObject("C:\Test\Sample.xls")

' Set myXls = myBook.Application

Set mySheet = myBook.Worksheets("Sheet1")
Debug.Print mySheet.Cells(1, 1).Value

' myBook.Close False
' Set myBook = Nothing
' myXls.Quit
' Set myXls = Nothing
MsgBox "完了"
End Sub
    • good
    • 1
この回答へのお礼

できました。ありがとうございます。

お礼日時:2011/04/15 18:03

普通はオブジェクトを設定して外部ファイルを


開くので、同じAccessファイルでも同様です。

しかし、他のファイルとしてのAccessファイル
と同様に、早い、遅い、の問題ならば、Excelのsheetを
テーブルとしてリンクするならば早いです。

テーブルとしてリンクする方法は、

http://office.microsoft.com/ja-jp/access-help/HP …


リンク設定後、たとえば

Sub cc()
Debug.Print DLookup("F1", "sheet1")
End Sub


あるいは、DAOを使用して
Sheet1のF1のデータをすべて
表示するならば、

Sub kk()
Dim db As Database
Dim rs As Recordset

Set db = CurrentDb
Set rs = db.OpenRecordset("sheet1")

Do Until rs.EOF
Debug.Print rs!F1
rs.MoveNext
Loop
End Sub

のようにできます。

リンクした場合はシートの名前がAccess側で
テーブル名として登録されます。
なお、Accessのバージョンによってはリンクした
シートは参照専用になります。この場合は
参照でいいのでそのまま使用できます。
    • good
    • 0
この回答へのお礼

処理速度が速そうですね。テストしてみます。ありがとうございました。

お礼日時:2011/04/15 18:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A