AccessVBA エクセル出力時にエラー

このQ&Aのポイント
  • リストの選択に合わせてクエリをエクセルで出力するVBAコードを作成していますが、データベースまたはオブジェクトが読み取り専用であるため、エラーが発生しています。
  • エクセル出力時のエラーを解決するために、XLXS形式での出力を行いたいですが、行数が多いためにマクロビルダーの「書式を保持してエクスポート」は使用できません。
  • エクセル出力時に発生する読み取り専用のエラーについて、どの部分を修正すればよいかわからず困っています。ご教授いただけると幸いです。
回答を見る
  • ベストアンサー

AccessVBA エクセル出力時にエラー

Private Sub コマンド1_Ckick() If リスト = "1"Then DoCmd. TransferSpreadsheet acExport_ , , "クエリ1","MicrosoftExcel(*.xlxs)" ElseIf リスト = "2"Then DoCmd. TransferSpreadsheet acExport_ , , "クエリ2","MicrosoftExcel(*.xlxs)" End If End Sub ------------ リスト(1 Or 2)を選択後、コマンド1をクリックすると、 リストの選択に合わせてクエリをエクセル出力したいです。 行数が10万行と多い為、 行数制限があるマクロビルダーの「書式を保持してエクスポート」を使わず XLXS形式で出力したいです。 しかし、上のVBAを実行したところ、 「データベースまたはオブジェクトは読み取り専用なので更新できません」 というエラーが出てしまいます。 どこを訂正すればよいのかわからず困っています。 どうかご教授の程、よろしくお願いいたします。

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

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

色々とおかしいです。 TransferSpreadSheet メソッドのヘルプを読んでみてください。 DoCmd.TransferSpreadsheet acExport _ , spreadsheettype:=acSpreadsheetTypeExcel12Xml _ , tablename:="クエリ2" _ , FileName:="c:\hoya\hoya.xlsx" _ , hasfieldnames:=True のような感じになります。 (パラメータの名前部分 例:spreadsheettyep:= などは分かりやすくするために付けたので 無くても構いません) あと、投稿の際に質問欄にべた書きしたためかもしれませんが、 行継続文字 _ の前には半角スペースが必要です。 エクセルの拡張子もxlsxです。 ※実行する前に、メニュー→デバッグ→○×のコンパイルを行ってエラーが出ないことを 確認してください。 ※変数『リスト』はテキスト型ですよね?

semi076
質問者

お礼

具体的に教えていただき、本当にお手数をお掛け致しました。 >※実行する前に、メニュー→デバッグ→○×のコンパイルを行ってエラーが出ないことを 確認してください。 提示していただいた例を参考に修正し、動作することを確認しました。 ○×コンパイルを使ったことがなかったので、 こんな便利なものを教えていただき、感謝しております。 >※変数『リスト』はテキスト型ですよね? テキスト型です。 教えていただいた例で問題ありませんでした。 回答者No.1さんも、そもそもちゃんと指定できていない点を指摘いただきましたが、 より詳しく書いていただいたNo.2さんをベストアンサーとします。 至らない事ばかりなのにも関わらず、この度は丁寧に教えていただきましてありがとうございました。

その他の回答 (1)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> , , "クエリ1","MicrosoftExcel(*.xlxs)" クエリの次は何を意図しているのですか? Exportするファイル名を書くはずなんですが。 出力するファイルを指定すべきところに、ワイルドカードを書いちゃダメです。 さらに(*.xlxs)は(*.xlsx)の間違いでしょうね。 "C:\20130718\Export1.xlsx"のように書いてください。 elseのクエリ2についても。

semi076
質問者

お礼

ご回答いただきありがとうございます。 そもそも誤りが多すぎました・・・。 色々な点をご指摘いただき、感謝しております。 修正し、エラーが出ないことを確認しました。 この度はありがとうございました。

関連するQ&A

  • ACCESS 2000でのExcel出力

    ACCESS 2000でExcel出力時に下記のソースで出力しています。 出力先をユーザーに選択させたい(Windowsでファイル保存時に出てくるやつみたいに)のですが、どのような方法がありますか? Private Sub 集計結果_Click() DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel8, _ "クエリA", "c:\集計.xls" End Sub 宜しくお願いします。

  • 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に出力するにはどうすればよいでしょうか。 ご教授ください。

  • 「クエリが閉じてるなら」「クエリが開いてるなら」

    Sub test() If クエリが閉じてるなら Then  DoCmd.OpenQuery "クエリ1" ElseIf クエリが開いてるなら Then  DoCmd.Close acQuery, "クエリ1" End If 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を開いた後にやりたい事は見出し部分より上にヘッダーとして 作成日付を入力したいと考えています。 よろしくお願いします。

  • Excelファイル 修復不可能

    Excel側からAccessモジュールを呼び出してExcelへクエリ結果をエクスポートしてますが、そのエクスポートされたファイルをオープンすると頻繁に(5回に1回くらい)「修復不可能」と言う、あのダイアログでメッセージが出ます。同じ条件のDATAでも毎回では無く、普通に成功する時もあります。一連の操作を全てExcel側からvbで行っているので、失敗したり、成功したりで安定せずに困っています。解決方法はあるでしょうか?DATA量はそんなにありません、Sheet数は4Sheetです。 Access側のモジュール varAccess1 = "Q_内容分類集計" varAccess2 = "Q_新旧集計" varAccess3 = "Q_業種別集計" varAccess4 = "Q_業種別新旧集計" varExcelPass1 = "\\Cs0097\63022_cr\顧客対応システム\発表資料取込用.xls" strmsg = "実績を、Excelファイルへ出力します。" & Chr(13) & _ "よろしければ、OKをクリックして下さい。" If MsgBox(strmsg, vbOKCancel) = vbOK Then DoCmd.TransferSpreadsheet acExport, _ acSpreadsheetTypeExcel9, varAccess1, varExcelPass1, True DoCmd.TransferSpreadsheet acExport, _ acSpreadsheetTypeExcel9, varAccess2, varExcelPass1, True DoCmd.TransferSpreadsheet acExport, _ acSpreadsheetTypeExcel9, varAccess3, varExcelPass1, True DoCmd.TransferSpreadsheet acExport, _ acSpreadsheetTypeExcel9, varAccess4, varExcelPass1, True MsgBox """データ出力は、正常に完了しました。""" End If Exit Sub

  • アクセス(access)からエクセルにエクスポート

    アクセスから、エクセルにクエリのデータを出力する際に、 「TransferSpreadsheet」を使用していますが、 そのエラー処理について、教えて下さい。 保存しようとしているファイルが既に開かれている場合に、 処理を中止し、エラーメッセージを出したいのですが、 どのようにすればいいのでしょうか? なお、現在のVBAは次のとおりです。 Private Sub コマンド01_Click() Dim a As String Dim b As Variant a = "Q_一覧表" b = "C:\一覧表.xls" DoCmd.TransferSpreadsheet acExport, _ acSpreadsheetTypeExcel9, a, b, True MsgBox "データを出力しました。" Exit Sub End Sub

  • Access2010クエリーのExcel出力書式

    Access2010で作成したクエリーをそのままの書式でEXCELに出力するVBAを組みたいと思っています。VBAは下記のとおり書いてみましたが、クエリーで表示される書式(ある列はカンマ、ある列は日付形式など)をそのまま移すことができません。このVBAをどのように変更したら、クエリーそのままの書式で出力できますでしょうか? '''''QUERYを指定 Dim varQE1 As Variant varQE1 = "QE1_List" 'QUERY名 '''''日付つきファイル名を指定 Dim varExcelPass As Variant varExcelPass = "C:\List_" & Format(Now(), "yyyymmdd") & ".xls" '''''ファイル変換出力 DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, varQE1, varExcelPass, True

  • クエリ式'(品名 In(A102))'の構文エラー

    実行時エラー'3075': クエリ式'(品名 In(A102))'の構文エラー:演算子がありません。 とでます。どこがダメなのか分かりませんので教えて下さい。 アクセスは初心者ですので分かりやすくお願いします。 チェックを入れた品名だけをレポートに出すようにしたくて 調べて下記のようにしたのですがエラーが出ます。 Private Sub コマンド_Click() If Me.チェック Then Me.品名リスト = Replace(Me.品名リスト & ",", "," & Me.品名 & ",", ",") Me.品名リスト = Left(Me.品名リスト, Len(品名リスト) - 1) Else Me.品名リスト = Me.品名リスト & "," & Me.品名 End If End Sub Private Sub 実行_Click() Dim strFilter As String If Me.品名リスト <> "" Then strFilter = "品名 In(" & Mid(Me.品名リスト, 2) & ")" DoCmd.OpenReport "Rカタログ", acViewPreview, , strFilter Else MsgBox "選択されたデータはありません。" End If End Sub

  • AccessのフォームをExcelに出力

    いつもお世話になっております。 現在、Access2003でDBを作成中です。 "テーブル1"をパラメータクエリで抽出します。"クエリ1"。 そのクエリを基にフォームを作成しています。"フォーム1"。これは抽出して印刷したり、Excelに出力するために作成しました。レポートではなく、フォームにした理由は、コマンドボタン等を配置できることからです。 Excelに出力する際のVBAでつまづいてしまいました。 DoCmd.OutputTo acOutputForm, "フォーム1", acSpreadsheetTypeExcel9 これで問題なく出力できています。が、、、 Access2007の一部のPCでこれを実行するとエラーが出ます。 原因は"OutputTo"が含まれているとエラーになるようです。 ちなみにエラーは「現在出力しようとしているオブジェクトの形式は無効です。」 「2007 Office スイート Service Pack 2」こちらをインストールすると良いそうなのですが、だめでした。 WindowsXP、Office2007はこのVBAだとエラーになります。 WindowsVista、Office2007は正常に使えました。 PCの何か設定?と考えたりもしたのですが、はっきりとした原因がわからないのでは、他の人にDBを使っていただけないので、エラーにならないVBAでいきたいです。 もうひとつ、 mFileName = InputBox("ファイル名を入力してください。") DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "フォーム1", mFileName こちらのVBAはクエリの出力だとうまくいくのですが、フォームだとだめでした。 クエリから抽出して保存すれば良いのですが、理想はこの形です。 1.フォーム1を開くと「担当者を入力」とパラメータクエリが働き、抽出結果をフォーム1に表示される。 2.[出力]ボタンを押すと、ダイアログボックスが開いてファイル名を指定して保存する。または、ダイアログボックスが開かなくても名前を指定できれば良いです。最悪、指定できなくても良いですが、原因となる、"OutputTo"を避けたVBAでいきたい。 3.mFileName = InputBox("ファイル名を入力してください。") DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "クエリ1", mFileName これだと、1.でパラメータクエリで抽出結果をフォームに表示させて、2.で[出力]ボタンを押すと、また、パラメータクエリで抽出しなければならなくなるのでできれば避けたいです。 こちらの条件でご教授お願い致します。 また、WindowsXP、Office2007でエラーが出ましたので、これを解決する方法でも良いです。 よろしくお願い致します。

専門家に質問してみよう