VBAを使用してAccess開いているExcelブックのセル値を参照する方法について

このQ&Aのポイント
  • AccessのVBAから既に開いているExcelブックのセルの値を参照する方法について教えてください
  • 現在のコードでは、セルの値を参照しようとするとインデックスが有効範囲外のエラーが発生しています
  • Excelブック自体をオブジェクトとしてセットし、それを利用してセルの値を参照する方法を知りたいです
回答を見る
  • ベストアンサー

Access開いているブックのセル値参照

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

質問者が選んだベストアンサー

  • ベストアンサー
  • bonaron
  • ベストアンサー率64% (482/745)
回答No.2

> ここで既に開いている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

kktaro88
質問者

お礼

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

その他の回答 (2)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

普通はオブジェクトを設定して外部ファイルを 開くので、同じAccessファイルでも同様です。 しかし、他のファイルとしてのAccessファイル と同様に、早い、遅い、の問題ならば、Excelのsheetを テーブルとしてリンクするならば早いです。 テーブルとしてリンクする方法は、 http://office.microsoft.com/ja-jp/access-help/HP005187610.aspx?redir=0 リンク設定後、たとえば 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のバージョンによってはリンクした シートは参照専用になります。この場合は 参照でいいのでそのまま使用できます。

kktaro88
質問者

お礼

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

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

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"

関連するQ&A

  • 新しいブックを名前を付けて保存したいのですが

    ACCESS2000からEXCEL2000をADOで操作しています。 以下の処理は開いている(アクティブ)シートを 新しいブックにコピーしています。 ----- Dim oApp As Object Dim oWkb As Object Dim oWks As Object Set oWkb = oApp.Workbooks.Open(CurrentProject.Path & "\Excel一覧.xls") Set oWks = oWkb.Worksheets("Sheet1") '新しいブックにシートコピー oWks.copy ----- お尋ねしたいのは 新しいブックを名前を付けて保存したいのですが どのようにすればいいですか?

  • ACCESSのVBAからExcelのセルから読めたのですが、書く方法を教えてください

    下記の方法でCell(1,1)、から読むことができました そこで今度書き込みなのですが With xlBk.Worksheets("Sheet1")    'Debug.Print .Cells(1,1)    .Cell(1,2) = "data" End With としても、エクセルシートには書かれていないのですが 書く方法を教えてください ただ、下記の Open(Filename:=strFile, UpdateLinks:=0) はエクセルをOpenする時 「このブックは他のデータソースへのリンクがふくまれています」 とメッセージがでるので、UpdateLinks:=0、と入れています よろしくおねがいします '--------------------------------- Dim xlApp As Excel.Application Dim xlBk As Excel.Workbook Dim strFile As String strFile = "C:\Sample\Book1.xls" Set xlApp = CreateObject("Excel.Application") Set xlBk = xlApp.Workbooks.Open(Filename:=strFile, UpdateLinks:=0) With xlBk.Worksheets("Sheet1")   Debug.Print .Cells(1,1) End With xlBk.Close False xlApp.Quit Set xlApp = Nothing '----------------------------------

  • ExcelVBA ブック全データを別ブックにコピー

    お世話になります。 自分のPC環境のC:\test\配下にある"練習.xls"というブックがります。 ボタンが押された時にこのブックの全データをデスクトップにある"集計.xls"のA1から張り付けたいのです。 あるサイトで下記のようなロジックが公開されていましたので、ファイル名を変えて実行しましたが 下記★箇所で"インデックスが有効範囲にありません"とエラーが出てしまいます。 どなたか改善方法をご教授いただけませんでしょうか? よろしくお願い致します。 環境 windows XPSP3  Excel2003 Sub ボタン1_Click() Dim a As Variant Dim b As Variant Workbooks.Open Filename:="C:\test\練習.xls" ★Set a = Workbooks("\C:\test\練習.xls").Worksheets("sheet1").UsedRange Set b = Workbooks("集計.xls").Worksheets("sheet1").Range("A1") a.Copy (b) Set a = Nothing Set b = Nothing End Sub

  • VBAにて新規ブックへ既存シートのコピー

    みなさんのお力を貸して下さい。 現在エクセルマクロにて新規ブックを作成し、作成したブックへ既存のシートをコピーをしたいと思っています。 しかし、コピーメソッド実行時にエラー1004 WorksheetクラスのCopyメソッドが失敗しましたというエラーが発生して困っています。 Dim oXls As Object Dim oWbk As Object Dim oSheet As Object Set oXls = CreateObject("Excel.Application") Set oWbk = oXls.Workbooks.Add ThisWorkbook.Worksheets("Sheet1").Copy Before:=oWbk.Worksheets("Sheet1")  どなたかご教授、よろしくお願いします。

  • VBで既存エクセルシートを新規ブックにコピー

    VB6,Excel2003です。 既存のエクセルシートを新規ブックにコピーする プログラムを作成してみましたが タスクバーに新規ブックのタスクバーボタンが2つできてしまいます。 どこが原因か教えてください。よろしくお願いします。 Private Sub Command1_Click() Dim xlsApp As Excel.Application Dim xlsBookTemp As Excel.Workbook 'コピー元ブック Dim xlsBookCopy As Excel.Workbook 'コピー先ブック Dim xlsSheetTemp As Excel.Worksheet 'コピー元シート Dim xlsSheetCopy As Excel.Worksheet 'コピー先シート Set xlsApp = CreateObject("Excel.Application") Set xlsBookTemp = xlsApp.Workbooks.Open("C:\Temp.xls") Set xlsSheetTemp = xlsBookTemp.Sheets(1) Set xlsBookCopy = xlsApp.Workbooks.Add Set xlsSheetCopy = xlsBookCopy.Sheets(1) xlsApp.Visible = True 'コピー元のSheet1を新規ブックにコピーする xlsSheetTemp.Copy Before:=xlsSheetCopy 'コピー元のブックは閉じる xlsBookTemp.Close '///新規ブックの編集処理/// Set xlsSheetTemp = Nothing Set xlsBookTemp = Nothing Set xlsSheetCopy = Nothing Set xlsBookCopy = Nothing Set xlsApp = Nothing End Sub

  • ブックの選択について

    ブックの選択について 以下のように、マクロのあるブック意外のブックを開いて からマクロのあるブックを選択しようとしてもできません。 具体的には一番下の Workbooks(thisBook).Select が正常に動きません。 なぜでしょうか? Dim myFName As String Dim macrobook As Object Dim thisBook As Workbook Set thisBook = ThisWorkbook myPath = ActiveWorkbook.Path ChDir myPath myFName = Dir("*S*.xls") Workbooks.Open Filename:=myFName Workbooks(myFName).Activate Worksheets(1).Select Workbooks(thisBook).Select

  • CreateObject関数 引数にパスワード

    CreateObject関数を使ってエクセルを開く際に、 引数にパスワードを設定することは可能ですか? 新規Microsoft Excel ワークシート.xlsと言うファイルには、 読み足りパスワードとして0000と言うパスワードが設定されているのですが Sub Sample() Dim MyPath As String Dim MyFile As String Dim xlApp As Object Dim xlBook As Object MyPath = "C:\" MyFile = "新規Microsoft Excel ワークシート.xls" Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(MyPath & MyFile) xlApp.Visible = True Set xlApp = Nothing Set xlBook = Nothing End Sub このようなvbaコードで開く時に、 どうやってパスワードを設定すればいいでしょうか? Set xlBook = xlApp.Workbooks.Open(MyPath & MyFile),"0000" こうすると構文エラーになります。 Sub Sample02() Dim MyPath As String Dim MyFile As String MyPath = "C:\" MyFile = "新規Microsoft Excel ワークシート.xls" Workbooks.Open Filename:=MyPath & MyFile, Password:="0000" End Sub これのCreateObjectバージョンが知りたいです。

  • SETを使ったほうがよい?

    accwessからエクセルファイルを開きたいのですが、 App.Workbooks.Open と、 Set xlBook = xlApp.Workbooks.Open とどちらを使った方がいいのでしょうか? ////////////////////////////////////////////////////////// Private Sub ファイル1_Click() Dim App As Object Dim MyFileName As String MyFileName = "D:\My Documents\test.xls" Set App = CreateObject("Excel.Application") App.Workbooks.Open FileName:=MyFileName App.Visible = True End Sub でも Private Sub ファイル2_Click() Dim xlApp As Object Dim xlBook As Object Dim FileName As String Const FolderName = "D:\My Documents\test.xls" Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(FolderName & FileName) xlApp.Visible = True Set xlApp = Nothing Set xlBook = Nothing End Sub ////////////////////////////////////////////////////////// でも開けました。 多分、SETを使うかどうかの違いだと思うのですが VBAでコードを作る際、どちらのコードを使った方がいいか教えてください。

  • Access2000:VBAを使用したエクセル操作

    下記のように既存のエクセルファイルにクエリからとってきたデータを挿入したいと考えております。 既存のエクセルファイルを開くことは成功したのですが、ある条件だとシートを追加するという処理(オブジェクト記述)がわかりません。 シート追加、あわせてブック追加方法もお願いします。 Set ExcelApp = CreateObject("Excel.Application") Set Book = ExcelApp.Workbooks.Open("C:\query\module\VBExcel.xls") Set Sheet = Book.Worksheets("test1")←追加したい

  • AccessでExcelのSheet間のコピーをしたい

    ACCESSのデータを読み込み、エクセルの元帳からレイアウトをコピー、新しいExcelのSheetにレイアウトとデータを書き込もうとしていますがうまく動きません。どこが悪いのでしょうか?次のように書きました。 Private Sub NEW_BOOK() Dim xlBookOrig As Workbook Dim xlBookNew As Workbook Dim xlSheetOrig As Worksheet Dim xlSheetNew As Worksheet Set xlApp = CreateObject("Excel.Application") xlApp.Application.Visible = True Set xlBookOrig = xlApp.Workbooks.Open("C:\元帳.xls") Set xlSheetOrig = xlBookOrig.Worksheets(1) Set xlBookNew = xlApp.Workbooks.Add Set xlSheetNew = xlBookNew.Worksheets(1) xlSheetOrig.Copy xlSheetNew.Paste xlSheetNew.Name = Left$(strMODL, 9) xlSheetNew.Cells(5, 1).Value = strSTAT xlSheetNew.Cells(4, 3).Value = strITEM ..... xlSheetNew.SaveAs "C:\'" & Left$(strMODL, 7) & "'.xls" これで実行すると、BOOK1 BOOK2 の2つが生成され、 BOOK1にはSHEET名、各データが書き込まれ、BOOK2には元帳のレイアウトがコピーされレイアウトとデータが一つになりません。 どこが間違っているのでしょうか? 宜しくお願いします

専門家に質問してみよう