ACCESS2003のVBAで改修依頼管理ツールを作成しています

このQ&Aのポイント
  • ACCESS2003のVBAを使用して改修依頼管理ツールを作成中です。
  • EXCEL出力時にエラーが発生し、オブジェクト変数またはWithブロック変数が設定されていませんと表示されます。
  • 問題の原因がわからず困っています。同じ処理を続けるとエラーが出るため、EXCELアプリケーションの参照が曖昧になっているのかもしれません。
回答を見る
  • ベストアンサー

ACCESS2003のVBAで改修依頼管理ツールを作成しています。

ACCESS2003のVBAで改修依頼管理ツールを作成しています。 そこで問題が発生してしまい行き詰っています。 問題は改修要望依頼が入ったテーブルを一覧表でEXCEL出力する際に、 2回目の出力を行うと「オブジェクト変数またはWithブロック変数が設定されていません。」 とエラー表示がされ、ここでデバックを使いなにも変更せず終了し、もう一回実行すると 今度は正常に出力されます。つまり正常出力した後にもう一回同じことをするとエラーが出るということです。 オブジェクトの開放もプロシージャの最後で行っているので環境は一回目の出力と変わらないはずなんですが、原因がわかりません。 常に「ActiveWorkbook.Sheets("Sheet1").Name = "改修依頼一覧"」の箇所でとまるので EXCELアプリケーションの参照が曖昧になっているのでしょうか? 下記はコード一部です。どこに問題があるでしょうか? 参照設定は編集済みです。 '【定数設定】 Const QName As String = "Q_改修依頼内容" '【変数設定】 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim xlApp As Object Dim xlBook As Object Dim xlSheet As Object Dim i As Long Dim strMDBPATH As String 'MDBの保存場所、フォルダー・ディレクトリ Dim strXLSFILE As String 'テンプレートファイルの名前、e:\xxx\yyyy\テンプレート.xls Dim strSaveFile As String Dim ans As Long Dim strMsg As String Dim endCol As String '変数にエクセルアプリケーションをセットして開く Set xlApp = CreateObject("Excel.Application") ' Set xlBook = xlApp.Workbooks.Open(strXLSFILE) ' Set xlSheet = xlBook.Worksheets("Sheet1") ' xlApp.Visible = True With xlApp .Workbooks.Add .Visible = True End With   ActiveWorkbook.Sheets("Sheet1").Name = "改修依頼一覧" 'エラー発生箇所 Set cn = CurrentProject.Connection rs.Open QName, cn, adOpenKeyset, adLockReadOnly ActiveWorkbook.Sheets("改修依頼一覧").Range("A2").CopyFromRecordset rs 'A1セルを選択 Worksheets("改修依頼一覧").Cells(1, 1).Select 'ファイル名を設定 strSaveFile = "改修依頼内容一覧_" & Format(Now, "yyyymmdd_hhmmss") & ".xls" '名前を変更して保存 ActiveWorkbook.SaveAs FileName:=strMDBPATH & strSaveFile 'データ一覧画面に戻る DoCmd.SelectObject acForm, "データ一覧画面" 'オブジェクトの開放 Set xlApp = Nothing Set xlBook = Nothing Set xlSheet = Nothing Set rs = Nothing Set cn = Nothing Exit Sub 以上です。 編集モジュールなどはエラーに関係ないと思われるステートメントは省略させていただきました。 どなたかご存知の方がいればアドバイスお願いします。

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

  • ベストアンサー
回答No.1

大きく4箇所の修正 ↓(1) >.Workbooks.Add を Set xlBook = .Workbooks.Add へ ↓(2) >ActiveWorkbook.Sheets("Sheet1").Name = "改修依頼一覧" 'エラー発生箇所 を Set xlSheet = xlBook.Sheets("Sheet1") xlSheet.Name = "改修依頼一覧" へ ↓(3) >rs.Open QName, cn, adOpenKeyset, adLockReadOnly >ActiveWorkbook.Sheets("改修依頼一覧").Range("A2").CopyFromRecordset rs を rs.CursorLocation = adUseClient rs.Open QName, cn xlSheet.Range("A2").CopyFromRecordset rs へ ↓(4) >Worksheets("改修依頼一覧").Cells(1, 1).Select を xlSheet.Cells(1, 1).Select へ

anman0201
質問者

お礼

ご回答ありがとうございます。 上記の修正で無事動くプログラムになりました。 またなにかあればお願いします。

その他の回答 (2)

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

訂正です。 後半の「さらには」以下は忘れてください。 .Workbooks.Add を見ていながらすっかり見落としていました。 新規Bookを開いているのでシート名の変更は できますね。

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

オブジェクトが設定されていない。 >ActiveWorkbook.Sheets("Sheet1").Name = "改修依頼一覧"   を xlApp.ActiveWorkbook.Sheets("Sheet1").Name = "改修依頼一覧" に変更・・・だけど、 ActiveWorkbook.Sheets("Sheet1").Name = "改修依頼一覧"   を With xlApp .Workbooks.Add .Visible = True End With の .Workbooks.Add の下に同じように設定すればいいのでは。 さらには、Sheet1→改修依頼一覧 の変換が行われた後、逆の 改修依頼一覧→Sheet1の変換がされていないと、二度目にこの プロシージャの中に入ったときはSheet1は存在しない、 ということで、該当するところでエラーが生じる。 つまるところ、最初からExcelのSheet1を"改修依頼一覧" にしておき、 .Workbooks.Add .ActiveWorkbook.Sheets("Sheet1").Name = "改修依頼一覧" を除くか、 または、このプロシージャを抜けるときに改修依頼一覧→Sheet1 の変換をしてプロシージャを抜けるかのどちらかである。 新規Book作成からはいっているのではないので、最初から シート名を設定しておき、除くようにしておいたほうが コードがすっきりしていいのでは、思いますが。 と、このような感じですが。いかがでしょうか。

anman0201
質問者

お礼

ご回答ありがとうございます。 大変参考になりました。 やはり参照が曖昧になっていたのですね。

関連するQ&A

  • ACCESS2003で改修依頼管理ツールを作成しています。

    ACCESS2003で改修依頼管理ツールを作成しています。 改修依頼用の回答票を出力する際のことなんですが、 現在、回答票テンプレートをあらかじめ同フォルダ内に保存していて、 それをExcelAppで開き、回答内容テーブルのデータをそのままコピーして名前をつけて保存しています。 しかし、その方法だとすでに同じ名前のファイルが存在していると名前をつけて保存する際に、同ファイルにアクセスできませんとエラーが出ます。 デバッグしてみるとどうやらテンプレートを開く際に読取専用で開かれており、 それを編集して別名で保存しているため、作成したファイルも読取専用ファイルになっているため 2回目以降に同名で出力する際に同ファイルにアクセスできなくなっているのだと思います。 これを回避する方法を知っている方がいれば是非教えていただきたいです。 コードを見ていただくわかると思いますが保存名の定義が部署名&発行日付のため1日に2回以上同じ部署の回答票を発行する際に困っています。 一応コードも載せておきます。 'On Error GoTo Err_コマンド0_Click Dim xlApp As Object Dim xlBook As Object Dim strMDBPATH As String 'MDBの保存場所、フォルダー・ディレクトリ Dim strXLSFILE As String 'テンプレートファイルの名前、e:\xxx\yyyy\テンプレート.xls Dim strSaveFile As String strMDBPATH = GetCrtPath 'Excelの元ファイルの名前を作成 D:\xxxx\yyyy\ + テンプレート.xls strXLSFILE = strMDBPATH & "回答票テンプレ.xls" '変数にエクセルアプリケーションをセットして開く Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(FileName:=strXLSFILE, ReadOnly:=False) xlApp.Visible = True '回答票テンプレを開く ' xlApp.Workbooks.Open FileName:=strXLSFILE '回答票に回答内容をコピーする xlApp.Range("C10") = Me!起票日.Value xlApp.Range("H10") = Me!所属部門.Value xlApp.Range("P10") = Me!起票社員番号.Value xlApp.Range("T10") = Me!起票社員名.Value xlApp.Range("C17") = Me!対象システム.Value xlApp.Range("K17") = Me!処理区分.Value xlApp.Range("P17") = Me!対象画面.Value xlApp.Range("C21") = Me!改修内容.Value xlApp.Range("C38") = Me!回答日.Value xlApp.Range("I38") = Me!回答社員名.Value xlApp.Range("C43") = Me!回答内容.Value 'ファイル名に所属部門と回答日を付加する strSaveFile = "回答票_" & Me!所属部門 & "_" & Format(Me!起票日, "yyyymmdd") & ".xls" '名前を変更して保存 xlBook.SaveAs FileName:=strMDBPATH & strSaveFile 'テンプレートを終了 ' xlApp.Quit 'オブジェクトの開放 Set xlApp = Nothing Set xlBook = Nothing MsgBox "回答票を発行しました。", vbInformation Exit_コマンド0_Click: Exit Sub Err_コマンド0_Click: MsgBox Err.Description Resume Exit_コマンド0_Click End Sub

  • Access からオブジェクトとして開いたExcelのプロセスが終了しない

    AccessからExcelのデータを読み込んだ後、Accessを終了させてもプロセスが終了しません。 bookはclose、applicationはquit、オブジェクト変数はnothingというExcelの終了記述をしているので他の問題なのかと思いいろいろ調べて試しましたが解決できません。 Excelのファイル名とシート名はAccessのフォームに貼り付けたテキストボックスの値を取得させていますが下記コードでは省略しています。環境はWin2000Server、Access2000です。 どなたかお気づきの点があればどうぞご教授お願いします。 --------------------------------- Public Sub test() Dim filename As String Dim sheetname As String filename = "c:\パス\ファイル名.xls" sheetname = "シート名" 'AccessからExcelをオブジェクトとして開く Dim xlApp As Object Dim xlBook As Object Dim xlSheet As Object Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(filename) Set xlSheet = xlBook.Worksheets(sheetname) 'Excelの行取得用変数設定 Dim xlrow As Integer 'データ開始行 xlrow = 5 Dim xlrowEnd As Integer 'データ最終行(最終行は合計値が入っているので-1とする) xlrowEnd = (Range("A5").End(xlDown).Row) - 1 'Excelデータの取り込み Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "a", cn, adOpenKeyset, adLockOptimistic cn.Execute "delete * from a" xlrow = 5 'Excelデータの開始行番号 Do While xlrow <= xlrowEnd rs.AddNew rs!フィールド1 = xlSheet.Cells(xlrow, 1).Value rs!フィールド2 = xlSheet.Cells(xlrow, 2).Value rs.Update rs.MoveNext xlrow = xlrow + 1 Loop 'Excelの終了記述 xlBook.Close xlApp.Quit Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing 'ADO接続終了記述 rs.Close Set rs = Nothing cn.Close Set cn = Nothing

  • VBからエクセルを起動。そのあとエクセルを終了

    教えてください。 VBからエクセルを起動します。 そのあと、エクセルのシートの上にデータを貼り付けます。そして、エクセルを終了します。 しかし、エクセルが終了しません。 タスクバー上のエクセルをクリックすると終了します。 どうして、このような現象が起こるのかわかりません。 教えてください。 下記に同様のサンプルを書きました 誤記入があるかも知れませんが このような感じのプログラムです。 以上、よろしくお願いします。 public sub test Dim XApp as Excel.Application Dim nfilename as string Dim xlBook As Object Dim xlSheet As Object ' エクセルを起動 Set xlApp = New Excel.Application nfilename ="AAAA.xls" ' 指定されたファイルを開く Call xlApp.Workbooks.Open(nfilename) Set xlBook = xlApp.ActiveWorkbook Set xlSheet = xlBook.Worksheets(1) 'フォームを貼り付ける xlSheet.Range("a1").PasteSpecial      'ファイル名の作成 Filename="BBBB.xls" '保存 ChDir "C:\" xlBook.SaveAs Filename:=Filename,FileFormat:=xlNormal, _ Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _ CreateBackup:=False Set xlSheet = Nothing xlBook.Close True Set xlBook = Nothing xlApp.Quit Set xlApp = Nothing End sub

  • エクセルvba

    エクセルvbaなのですが Sub test() Dim xlApp As Object Dim xlBook As Object Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.FullName) 'コード・・・ Set xlApp = Nothing Set xlBook = Nothing End Sub これだと Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.FullName) の部分で、エラーになります。 実行時エラー1004です。 自身ファイルをオブジェクトに格納して操作したいのですがどうすればいいでしょうか?

  • Access-VBAでフィールドまたはレコード指定

    お世話になります。 Accessから、フィールドまたは、レコードを指定して、 Excelの指定したセルに出力することはできますか? Sub EX1() On Error Resume Next Dim db As DAO.Database Dim rs As DAO.Recordset Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Set db = CurrentDb '出力元のテーブルまたはクエリ Set rs = db.OpenRecordset("EQ") Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets(1) ' Excel のセルに値を代入 xlSheet.Cells(1, 1).CopyFromRecordset rs ' Worksheet を名前をつけて保存 xlSheet.SaveAs "D:\一時保存\abc.xls" xlApp.Quit Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing End Sub ' Excel のセルに値を代入 xlSheet.Cells(1, 1).CopyFromRecordset rs の部分でできそうなのですが。 クエリにある1つ目のレコード、またはフィールドを、Excelの(1,1)。 2つ目を、(3,1)。 3つ目を、(5,1)としたいのです。 よろしくお願いします。

  • VB6.0上でExcelオブジェクトを生成

    VB6.0上でExcelオブジェクトの生成についてです。 その1 Dim xlApp As New Excel.Application Dim xlBook As New Excel.Workbook Dim xlSheet As New Excel.Worksheet Set xlApp = New Excel.Application Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets(1) と その2 Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets(1) と、どちらが良いのでしょうか? 開発環境は  Windows2000  VB 6.0  Excel 2003 です。

  • 実行時エラー91について

    vbでエクセルにデータを入力したあと、2つのシートを選択し、 その後に両面印刷を行うプログラムを作成中ですが、 印刷の段階で 「実行時エラー91。オブジェクト変数または with ブロック変数が設定されていません。」 とのエラーがでます。 どの部分がおかしいのかわからないので教えて下さい。 Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Dim xlSheet2 As Excel.Worksheet Dim xlFile As String xlFile = App.Path & "表.xls" Dim MyFile As String MyFile = Dir$("表.xls") If Len(MyFile) > 1 Then Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(xlFile) Set xlSheet = xlBook.Worksheets("裏") Set xlSheet2 = xlBook.Worksheets("表") xlApp.Visible = True a1 = Label47.Caption a1 = Format(a1, "#,#") a2 = Label48.Caption m = a1 & "及び" & a2 & "とする。" For k = 1 To 18 s = Mid(m, k, 1) i = 8 + (k - 1) * 2 xlSheet.Cells(40, i).Value = s Next k Set xlSheet2 = xlBook.Worksheets("表") xlSheet2.Cells(4, 2).Value = Text11.Text xlSheet2.Cells(4, 10).Value = Text12.Text xlSheet2.Cells(4, 19).Value = Text13.Text xlBook.Sheets(Array("表", "裏")).Select ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True ←ここでエラー Set xlApp = Nothing Set xlBook = Nothing Set xlSheet = Nothing Set xlSheet2 = Nothing

  • シートを選択したい vba

    自身のファイルを読み取り専用で新たに立ち上げて、シートを選択したいのですが Private Sub cmd_読み取り専用で開く_Click() Dim xlApp As Object Dim xlBook As Object Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.FullName) xlApp.Visible = True xlApp.xlBook.Sheets("メイン").Select Set xlApp = Nothing Set xlBook = Nothing End Sub だと xlApp.xlBook.Sheets("メイン").Selectでエラーになります。 文法が間違ってると思うのですが、修正案をご教授ください。

  • VB2008 エクセル出力

    VB2008 エクセル出力 教えていただけると助かります VB6.0使用時にエクセル出力をするために下記のようなプログラムで出力していました ※「Microsoft Excel 9.0 Object Library」を参照 Dim xlApp As EXCEL.Application Dim xlBook As EXCEL.Workbook Dim xlsheet As EXCEL.Worksheet Dim File As String File = App.Path + "\EXCEL\" + "フォーム.xls" Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(File) Set xlsheet = xlBook.Worksheets("テスト") xlsheet.Range("A1") = "テスト" 'フォルダ作成 If Dir("D:\", vbDirectory) = "" Then Call Mkdirs("D:\テスト") 'Worksheetを名前をつけて保存します。 xlApp.DisplayAlerts = False xlsheet.SaveAs "D:\テスト\テスト.xls" xlApp.Quit Set xlApp = Nothing Set xlBook = Nothing Set xlsheet = Nothing VB2008の場合だとどのように書けば同じように動きますか ※色々試してみましたがダメでした 「Microsoft Excel 12.0 Object Library」を参照しています

  • ADOを使用してExcelデータをAccess取込む際のExcelシートの選択について

    表記のとおりADOを使用してExcelデータをAccess取込むのですが、Sheet1のデータを読込んだ後、引続きSheet2のデータを読込む様にVBAコードを書いたつもりですが、Sheet1をアクティブにした状態でExcelデータを保存していたらSheet1のデータを重複して取込み、Sheet2をアクティブにした状態でExcelデータを保存していたらSheet2のデータを重複して取込んでしまいます。どこをどうすればSheet1のデータを読込んだ後、引続きSheet2のデータを読込む様に出来るのでしょうか? ====== VBAコードの抜粋 =========   Dim xlApp As Object       ' Excelのアプリケーション定義   Dim xlBook As Object      ' ExcelのワークブックのフォルダPath+ファイル名を定義   Dim xlSheet As Object      ' Excelの参照するシート名を定義   Dim SheetName As String     ' シート名を代入   Dim SheetCount As Byte     ' シートの選択 For SheetCount = 1 To 2       ' 1回目のループでSheet1から2回目のループでSheet2からデータを取り込む If SheetCount = 1 Then SheetName = "Sheet1" If SheetCount = 2 Then SheetName = "Sheet2" Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open("ファイルPath+ファイル名") Set xlSheet = xlBook.Worksheets(SheetName) Set Wcell = xlSheet.Range("A1") Set Cn = CurrentProject.Connection Rs.Open "取込みテーブル", Cn, adOpenKeyset, adLockOptimistic xlApp.Application.Visible = True   データを取込むコードあり(省略) xlBook.Close xlApp.Visible = False Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing Next SheetCount

専門家に質問してみよう