ジメジメする梅雨のお悩み、一挙解決! >>

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 "完了"

このQ&Aに関連する最新のQ&A

A 回答 (3件)

> ここで既に開いている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
    • 0
この回答へのお礼

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

お礼日時: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

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

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q EXCEL>getObjectしたEXCELファイルのシートを指定したい

ACCESSのVBAマクロでEXCELファイルを指定してデータを取得しようとしています。

GetObject("C:\ファイル名.xls", "Excel.Sheet")

でEXCELファイルを取得するまでは良いのですが、そのファイルのシートを指定する方法がわかりません。

基本かもしれませんが、ご教示をお願いします。

Aベストアンサー

こんにちは。

Accessで使っているとき、マクロ側でExcelが起動されていることがあるのでしたら、GetObjectも考慮に入れたほうがよいのかもしれませんね。

それを考慮しなければ、オートメーション・オブジェクトは、
Set xlApp = CreateObject("Excel.Application")
だけでよいです。

'GetObject をお使いの場合は、
Dim xlApp As Object
Const MYPATH As String = "○○○"
Const FILENAME As String ="××××"
'
'オートメーション・オブジェクトの生成
On Error Resume Next
 Set xlApp = GetObject(, "Excel.Application") '起動済Excelの取得
  If TypeName(xlApp) = "Empty" Then
    '起動済Excelが無い時新規作成
   Set xlApp = CreateObject("Excel.Application")
  End If
On Error goto 0
'
xlApp.Visible = True 'どちらでも可
With xlApp.Workbooks.Open(MYPATH & "\" & FILENAME)
 .Worksheets("Sheet1").Select
 '作業
 .Close False
End With
'以下を忘れると、後々、悲惨なフリーズの原因です。
Set xlApp = Nothing
'

でも、

例えば、Excelを開いて加工するのでなければ、このような方法もありかと思います。(myTableにインポートする)

DoCmd.TransferSpreadsheet acImport, , "myTable", MYPATH & "\"FILENAME", True, "Sheet1!A1:D50

'

こんにちは。

Accessで使っているとき、マクロ側でExcelが起動されていることがあるのでしたら、GetObjectも考慮に入れたほうがよいのかもしれませんね。

それを考慮しなければ、オートメーション・オブジェクトは、
Set xlApp = CreateObject("Excel.Application")
だけでよいです。

'GetObject をお使いの場合は、
Dim xlApp As Object
Const MYPATH As String = "○○○"
Const FILENAME As String ="××××"
'
'オートメーション・オブジェクトの生成
On Error Resume Next
 Set xlApp = GetObj...続きを読む

QACCESS(VBA)でエクセルファイルを開く時

VBAでエクセルファイルを開いて処理していますが
一つのエクセルファイルを開いている時に(これは手操作)
VBAからエクセルファイルを開くと
一瞬、開いたような反応を示すのですが
すご、閉じてしまい
用を足しません
こんな時、VBAで今開こうとするエクセルファイルを
優先的に開けたら、と思いますが
むりでしょうか?
よろしくお願いします

Aベストアンサー

以下の方法で開けませんか?

Sub ExcelCreate()
Set MyExcel = CreateObject("excel.application")
'MyExcel.Workbooks.Open FileName:="C:\test.xls" '<---既存のエクセルブックを開く場合
MyExcel.Workbooks.Add '<---新しくエクセルを生成する場合
MyExcel.Visible = True
End Sub


人気Q&Aランキング

おすすめ情報