• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ACCESS2003のVBAで改修依頼管理ツールを作成しています。)

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

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

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

  • ベストアンサー
回答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