Access VBAによるExcelエクスポートの方法とは?

このQ&Aのポイント
  • Access VBAを使用してExcelエクスポートを行う方法をまとめました。
  • 出力対象のテーブルごとに1つのファイルとなってしまう現在の記述を修正し、1つのExcelファイルで複数シートに出力する方法を教えてください。
  • 出力するクエリごとにExcelファイルを作成し、データが存在する場合には再度作成する方法を説明しています。
回答を見る
  • ベストアンサー

Access VBA Excel エクスポート

Access VBAにてExcel エクスポートの処理を記述しました。 現在の記述だと、出力対象のテーブル(クエリ)ごとに1つのファイルとなっており、ファイルの管理が大変なため、1つのExcelファイルで、複数シートに出力したいのですが、どこを修正すればよろしいでしょうか? ’出力対象のクエリ名が入っている配列の要素数(出力対象のクエリ数)を取得する j = UBound(QName) ’出力するクエリの分だけ繰り返す For i = 0 To j   ’同じファイル名のExcelファイルが見つかった場合 If Dir(Path & EName(i)) <> "" Then 'データ更新のため、見つかったファイルを削除する Kill Path & EName(i) End If   ’出力対象のクエリにデータ(レコード)が存在する場合 If Count(i) > 0 Then 'Excelファイルを再度作成する   ’Qname(i)が出力するクエリ名、Pathが出力先のパス、Ename(i)が出力ファイル名です。 DoCmd.TransferSpreadsheet acExport, 10, QName(i), Path & EName(i), True, "" End If End If Next

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

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

>出力対象のテーブル(クエリ)ごとに1つのファイルとなっており、 >ファイルの管理が大変なため、1つのExcelファイルで、複数シート >に出力したい とのことなので、以下ではどうですか。 strPath、およびstrFileNameは適当に設定してください Sub cmdRecCountAndExport()   Dim db As DAO.Database   Dim qdf As DAO.QueryDef   Dim myQdfName As Variant   Dim strSQL As String   Dim i As Long   Dim strPath As String   Dim strFileName As String   strPath = "C:\Users\ほげほげ\Desktop\置場\"   strFileName = "データ保存.xlsx"   Set db = CurrentDb     For Each qdf In db.QueryDefs       If Left(qdf.Name, 1) <> "~" Then         '選択クエリとクロス集計クエリを選ぶ         If qdf.Type = 0 Or qdf.Type = 16 Then           'パラメータが設定してあるものを除外           If qdf.Parameters.Count = 0 Then             'レコード件数が0のものを除外             If funcRecCount(qdf.Name) > 0 Then               If Dir(strPath & strFileName) <> "" Then                 Kill strPath & strFileName               End If               'Excelへのエクスポート               DoCmd.TransferSpreadsheet acExport, 10, qdf.Name, strPath & strFileName, True               i = i + 1             End If           End If         End If       End If     Next qdf     If i = 0 Then       MsgBox "エクスポートの対象となるクエリは存在しません"     End If   Set qdf = Nothing   db.Close: Set db = Nothing End Sub 'レコード件数を求める関数 Private Function funcRecCount(ByVal strQueryName As String) As Long   Dim db As DAO.Database   Dim rs As DAO.Recordset   Dim strSQL As String   strSQL = "SELECT COUNT(*) AS RecCnt FROM " & strQueryName   Set db = CurrentDb   Set rs = db.OpenRecordset(strSQL)   funcRecCount = rs!RecCnt   rs.Close: Set rs = Nothing   db.Close: Set db = Nothing End Function この場を借りてですが、 https://okwave.jp/qa/q9690744.html で回答した中で、         '選択クエリとクロス集計クエリを選ぶ         If qdf.Type = 0 Or qdf.Type = 16 Then           ReDim Preserve myQdfName(i)           myQdfName(i) = qdf.Name           i = i + 1         End If を、         '選択クエリとクロス集計クエリを選ぶ         If qdf.Type = 0 Or qdf.Type = 16 Then           'パラメータが設定してあるものを除外           If qdf.Parameters.Count = 0 Then             ReDim Preserve myQdfName(i)             myQdfName(i) = qdf.Name             i = i + 1           End If         End If のように変更してください。クエリにパラメータがあると データが確定できないのではずします。 同様に、この回答でもそのような処置を行っています。

その他の回答 (1)

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.1

未確認ですが、以下はいかがでしょうか。  j = UBound(QName)    For i = 0 To j      If Count(i) > 0 Then    DoCmd.TransferSpreadsheet acExport, 10, QName(i), _     "C:\test\Test.xlsx", True, "Sh" & Format(i, "0")   End If     Next

Yoshikun0928
質問者

お礼

ご回答いただきまして誠にありがとうございました。 実行してみたところ、コンパイルエラーとなってしまいました。 申し訳ありません。

関連するQ&A

  • Access VBA Excel エクスポート

    Accessにてユーザーが作成したクエリを各クエリごとにExcelファイルに出力するVBAを運用しています。 'QName()という配列にユーザーが作成した全クエリ名が格納されています。 'Pathという変数にAccessファイルのフルパスが格納されています。 'Ename()という配列に作成するExcelファイルの名前が格納されています。 j = UBound(QName) For i = 0 To j 'Excelファイルを作成する DoCmd.TransferSpreadsheet acExport, 10, QName(i), Path & EName(i), True, "" Next Excelに出力した後、ファイルを開いて処理をするのですが、処理の都合で、繰り返しが偶数回目の時に、Excelファイルを作成し、奇数回目の時は、1つ前に作成したExcelファイルの先頭に新しいシートを作成する形で、出力したいです。 どのように修正すればよろしいでしょうか? 例: i = 0 ⇒ 新しくExcelファイルを作成する i = 1 ⇒ 0の時に作成したファイルを開いて、先頭に新しいシートを作成する形で出力する i = 2 ⇒ 新しくExcelファイルを作成する i = 3 ⇒ 2の時に作成したファイルを開いて、先頭に新しいシートを作成する形で出力する これをユーザーが作成したクエリ数だけ繰り返したいです。 ※1:ユーザーが作成したクエリ数は、偶数となっています。

  • Access VBA クエリパラメーターについて

    Access VBA についてご質問させていただきます。 AccessVBAにてフォームを起動したときに、ユーザーで作成したクエリにおいて各クエリのデータ件数を取得するプログラムを作成いたしました。 '各クエリの件数をカウントする処理 Public Sub Data_Count() 'カウント用変数を宣言して、初期化する Dim i, j As Integer: i = 0: j = 11: b = 0: Dim rs As Recordset: Dim str(1) As String Dim Fname As Form: Set Fname = Forms!F99_メイン Dim mydb As Database: Set mydb = CurrentDb 'クエリ名・エクセル名用配列を初期化する Erase QName: Erase EName: Erase Count 'クエリの数だけ繰り返す For Each myqer In mydb.QueryDefs If Left(myqer.name, 1) = "Q" And Left(myqer.name, 3) <> "Q0_" Then 'クエリ名用変数の要素数を変更し、クエリ名を格納する ReDim Preserve QName(i): QName(i) = myqer.name 'エクセル用変数の要素数を変更し、エクセルファイル名を格納する ReDim Preserve EName(i): EName(i) = QName(i) & ".xlsx" '件数用配列の要素数を変更する ReDim Preserve Count(i) 'クエリを開く Set rs = CurrentDb.OpenRecordset(QName(i)) 'クエリのレコードが0件の場合 If rs.EOF Then 'クエリの件数を保存する Count(i) = 0 'クエリのレコードが1件以上の場合 Else 'クエリの最終行に移動してクエリ件数を保存する rs.MoveLast: Count(i) = rs.RecordCount End If End If rs.Close i = i + 1 End If Next End Sub 上記のコードを実行してみたところ、ユーザーで作成したクエリを開く際に、 実行時エラー'3061':パラメーターが少なすぎます。1を指定してください。というエラーが発生してしまいました。 どのように修正すればよろしいでしょうか?

  • Access VBA での有効なパスチェック

    Access VBA での有効なパスチェック お世話になっております。 Access2002 VBAで、画面入力されたパスが有効なら、 そこにテーブルの内容をExcel出力する。といったことをしているのですが、 画面入力されたパスが、 たとえば「C:\\\\\\tmp\\\\\\\」などと入力された場合、 フォルダチェックに用いているDir関数ではOKなのですが、 Excel出力するDoCmd.TransferSpreadsheetでエラーとなってしまいます。 ここでのエラーが、実行時エラー:2220なので、例外処理で拾っているのですが、 フォルダチェックの段階で、はじくよい方法はあるでしょうか? 例文です> str_tmpPath = txt_Path.Value  'ここで「C:\\\\\\tmp\\\\\\\」と入力されたとする '有効なパスかチェックする If Dir(str_tmpPath, vbDirectory) = "" Then  '上記のパスで通ってしまう。戻り値は"."   MsgBox "入力しなおして"   End End If str_SavePath = str_tmpPath & "ファイル名" 'Excel出力 DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, テーブル名, str_SavePath, True  'ここで実行時エラー:2220が発生 以上、よろしくお願いいたします。

  • Access2000よりエクセルへエクスポートする際の範囲?

    こんばんわ。 最近アクセスを始めたばかりの初心者です。 この度、クエリよりエクセル(Ver.2000)へデータのエクスポートをしたいと思ったのですが、最初の一回目はうまくいくのですが、テストを繰り返すと(恐らくレコードが増えるため)、範囲を拡張することができません、というエラーが出てエクスポートができません。どのように解決したら宜しいのかご教示頂けたらと存じます。今は下位のようにしています。 Docmd.TransferSpreadsheet acexport, 8, "クエリ名","パス\エクセルファイル名", True 宜しくお願い致します。

  • ACCESS クエリ→フォーム フィルターをかけたデータのみエクスポートしたい

    よろしくお願いします。 クエリのデータをフォームで表示し、その時にコンボボックスで表示するデータを指定し抽出・表示しています。([授業名]フィールドのコンボボックスで、指定した授業のみ抽出します) 最終的に抽出したデータを、コマンドボタンでエクスポートできるようにしたいのですが、私の記述方法では「全てのクエリのデータ」がエクスポートされてしまいます。 どのような方法でもいいのですが、指定したデータ([授業名])のみエクスポートする方法はないでしょうか・・・? *データエクスポートのVBA記述内容* Private Sub cmdデータ出力_Click() '名簿データのエクスポート Dim msg As String msg = MsgBox("名簿データを出力します。", vbYesNo, "出力確認") If msg = vbYes Then 'どの場所にデータをエクスポートするか指定 DoCmd.TransferSpreadsheet acExport, , "Q_受講者名簿用", _ "Y:\○○課\住所録データエクスポート場所\" & "受講者名簿【ACCESSより】.xls", True answer = MsgBox("受講者名簿データを出力しました", vbOKOnly, "データの出力の確認") cancel = True End If End Sub *ちなみに、フォーム上でフィルターをかけたVBAは* Private Sub cmd名簿_Click() Dim stList As String Dim stFil As String If combo1 <> "" Then stFil = "[授業名]='" & combo1 & "'" End If Me.Filter = stFil Me.FilterOn = True End Sub

  • アクセス2000→エクセル2010へエクスポート

    Private Sub cmd出力ボタン_Click() DoCmd.SetWarnings False DoCmd.TransferSpreadsheet acExport, 8, "出力クエリ", "C:データ.xlsx", True, "" DoCmd.SetWarnings True End Sub 実行すると 外部テーブルのフォーマットが正しくありません と出てしまいます。 エクセル97の形式にエクスポートする際は大丈夫でした。 spreadsheettypeの引数が違うのかとは思いますが適切な数値がわかりません。 他のやり方等もあれば教えて下さい。

  • AccessからExcelの操作

    OS:WindowsXP ソフト:Access2003 お世話になります。 Accessのクエリで抽出したデータをExcelに出力し、その後出力ファイルを開き 形式を整えたいと考えています。 Excel出力は任意の場所に出力したいと考えています。 出力については過去の質問などを検索し以下のコードで無事出力されるのは確認できました。 *************************************************************** Sub Save() DoCmd.TransferSpreadsheet acExport, 8, "Q004", GetSaveName, True End Sub Function GetSaveName(Optional ByVal strFile As String) Dim intResult As Integer With WizHook .Key = 51488399 intResult = .GetFileName(0, "", "保存先を選択してください", "保存", strFile, "", "MicrosoftExcel ブック (*.xls)|*.xls", 0, 0, 0, False) .Key = 0 End With If intResult = -302 Then 'キャンセルされた場合 GetSaveName = "False" Else GetSaveName = strFile End If End Function *************************************************************** この後に対象のExcelを開きたいのですが、うまく対象のファイルを開く事が出来ません。 CreateObject("Excel.Application") xls.Workbooks.Open() 上記のコマンドでExcelが開けると思うのですが、Open()のカッコ内には どのように指定すれば良いのでしょうか? ちなみにExcelを開いた後にやりたい事は見出し部分より上にヘッダーとして 作成日付を入力したいと考えています。 よろしくお願いします。

  • Access2010でのExcel出力について

    お世話になります。 Access2010のクエリで抽出した結果を下記のコマンドでExcelに出力しています。 Private Sub コマンド6_Click() Dim デスクトップの場所 As String デスクトップの場所 = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\" If Nz(Dir(デスクトップの場所 & "log.xlsx"), "") <> "" Then If vbNo = MsgBox("デスクトップに同じ名前のファイルが存在します。上書きしますか?", vbYesNo + vbQuestion, "ファイルが存在します") Then Exit Sub End If End If DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "Q_syukei", デスクトップの場所 & "log.xlsx" DoCmd.Close MsgBox "デスクトップに案件ログのExcelファイルが出力されました" End Sub その中のフィールドにコンボボックス利用のデータが複数あり、 1列目にID番号が振られていて、2列目に目的のデータ項目が格納されています。 元のテーブルでも、クエリでも列幅を0cm;10cmとしていて、 クエリの結果もAccess上で見ると2列目のデータ項目が表示されるのですが、 出力されたExcelには1列目のID番号しか載ってきていません。 2列目のデータをExcelに出力するにはどうすればよいでしょうか。 ご教授ください。

  • ACCESS エクスポート ダイアログ ファイル名取得

    ACCESS2003で作成したデータをダイアログで指定したファイル名でエクスポートしたいのですが、上手くできません。 ダイアログが開きその指定したフォルダーにあるエクセルファイルを選択すれば、正常にエキスポートできるのですが、 開いたダイアログにファイル名を入力すると、それ以降動かなくなります。 基本的なことが間違っているのでしょうか?? 詳しい方教えてください。下記にコードした内容を書きました。 よろしくお願いします。 Private Sub cmbTransExcel_Click() On Error GoTo Err_cmbTransExcel_Click Dim fileSaveName As Variant Set dlg = Application.FileDialog(msoFileDialogOpen) With dlg .Title = "チェック" .ButtonName = "エキスポート" .InitialFileName = "C:\Program Files\DATA\" .InitialView = msoFileDialogViewList .AllowMultiSelect = False .Filters.Clear .Filters.Add "xls", "*.xls" End With With dlg If .Show = -1 Then For Each vntPath In dlg.SelectedItems strPath = vntPath Next Else Set dlg = Nothing Exit Sub End If End With Set dlg = Nothing Dim strac As String Dim varxls As Variant Dim strmsg As String strac = "Q_チェック" 'Accessファイルを指定します。 varxls = strPath 'エクセルファイルを指定します。 strmsg = strac & " を、Excelファイルへ出力します。" & Chr(13) & _ "出力先は" & varxls & "、 シート名は" & strac & "です。" & _ Chr(13) & "よろしければ、OKをクリックして下さい。" If MsgBox(strmsg, vbOKCancel) = vbOK Then '最初のデータをフィールド名として使います。 DoCmd.TransferSpreadsheet acExport, _ acSpreadsheetTypeExcel9, strac, varxls, True MsgBox "EXCELの出力が正常終了しました。", vbInformation, "処理終了" End If Exit_cmbTransExcel_click: Exit Sub Err_cmbTransExcel_Click: MsgBox "EXCELの出力が異常終了しました。", vbCritical, "エラー!" Resume Exit_cmbTransExcel_click End Sub

  • ACCESSのVBAで

    Dim rcd As New ADODB.Recordset Sql = "SELECT * FROM 社員テーブル" rcd.Open Sql, CurrentProject.Connection If rcd.EOF Then Else 社員コード = rcd!社員コード 社員名称 = rcd!社員名称 end if のような記述で、Sqlのところをテーブルからのselectではなくクエリからデータの取得って出来るのでしょうか?(sqlのところがクエリ名になる) よろしくお願いします。

専門家に質問してみよう