• ベストアンサー

accessからエクセルのデータ転送上書きVBA

宜しくお願い致します win10 access365 先日、ここでお尋ねした アクセスファイルのVBAコードからエクセルファイルを作成するための コードをお尋ねし、以下では L.xlsxが作成されて、 アクセスのテーブル KJKTから データ転送が 行われるというコードを教示頂きました しかしながら 同様の操作をするときに L.xlsxのデータが 上書きされずに 以前に作ったデータのまま 残ってしまってました そこで 以下のようなエクセルVBAを R.xlsmに作りました Ldataclear() です 毎回 このマクロを実行して いったんL.xlsxの データを当該シートから削除して まっさらにして そのうえで Exp123()を実行すれば 目的は叶うのですが 迂遠なような気もしました もっと簡単に 上書き保存のできる コードなど あるのでありましたら 御教示くださいませ 宜しくお願い致します Private Function Exp123() '変数宣言 Dim srchXls As String 'Excelエクスポート先のファイルパス srchXls = "C:\Users\USER\Desktop\ACCESS\L.xlsx" 'Excelファイルの出力 DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "KJKT", srchXls, True, "output" 'Excelファイルをエクスポートした旨を通知する。 MsgBox "Excelをエクスポートしました。" End Function ---------------------- Public Function ExcelRmacro() Dim oApp As Object Set oApp = CreateObject("Excel.Application") oApp.Visible = True 'Only XL 97 supports UserControl Property On Error Resume Next oApp.UserControl = True 'ファイルを開く oApp.Workbooks.Open FileName:="C:\Users\USER\Desktop\ACCESS\R.xlsm" oApp.Application.Run ("'R.xlsm'!Ldataclear") End Function -------------------------------- Sub Ldataclear() ' FilePath = "C:\Users\USER\Desktop\ACCESS\L.xlsx" 'ここにファイルの場所ファイル名を記載 Set Wb = GetObject(FilePath) Set Ws = Wb.Worksheets("output") 'ここにシートを記載する Ws.Cells.Delete Wb.Save Application.CutCopyMode = False ActiveWorkbook.Save End Sub

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.3

余計なお世話ですが データをoutputシートから削除するのに'R.xlsmのマクロを使わずにAccessのVBAだけで実行する方法です。 Exp123()を実行するだけでデータ削除からエクスポートまで処理します。全て同じモジュールに記載してください。 Private Function Exp123() '変数宣言 Dim srchXls As String Dim Ws_Name As String 'Excelエクスポート先のファイルパス srchXls = "c:\ok\access\L.xlsx" '"C:\Users\USER\Desktop\ACCESS\L.xlsx" Ws_Name = "output" 'Ldataclearを呼び出す ファイルが開いているとエクスポートせずに終了 If Ldataclear(srchXls, Ws_Name) = False Then MsgBox "処理を中止しました。", vbInformation Exit Function End If 'Excelファイルの出力 DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "KJKT", srchXls, True, Ws_Name ''Excelファイルをエクスポートした旨を通知する。 MsgBox "Excelをエクスポートしました。", vbInformation End Function 'エクセルシートのデータを削除する Exp123から呼び出される Private Function Ldataclear(ByVal srchXls As String, ByVal Ws_Name As String) As Boolean Dim oApp As Object Dim Wb As Object Dim Ws As Object '該当ファイルがあれば実行する If Dir(srchXls) <> "" Then Set oApp = CreateObject("Excel.Application") Set Wb = oApp.Workbooks.Open(srchXls) '既にファイルが開いているときの処理 開いていればデータを削除せずにFalseでExp123に戻る If Wb.readonly Then MsgBox Mid(srchXls, InStrRev(srchXls, "\") + 1) & "が開いています。" & vbCrLf & "必要に応じて保存して閉じるなどの処置をしてください。", vbInformation Wb.Close oApp.Quit Set oApp = Nothing Set Wb = Nothing Ldataclear = False Exit Function End If Set Ws = Wb.WorkSheets(Ws_Name) Ws.Cells.ClearContents '.Delete Wb.Save Wb.Close oApp.Quit Set oApp = Nothing Set Wb = Nothing Set Ws = Nothing Ldataclear = True Else MsgBox Mid(srchXls, InStrRev(srchXls, "\") + 1) & "ファイルがありません。", vbCritical Ldataclear = False End If End Function

sushidokei
質問者

お礼

有り難うございました。読み込んでみます

Powered by GRATICA

その他の回答 (2)

  • luka3
  • ベストアンサー率74% (300/403)
回答No.2

・Access2010、TransferSpreadsheetは上書きできないのが仕様 https://excelshogikan.com/tips/tips220.html 「仕様」と書いてありますが、根拠は不明です。 ・AccessVBAのExcelエクスポートについて https://teratail.com/questions/44841 >ObjExcel.Range("A2").CopyFromRecordset [テーブルの中身] >Set WB = ObjExcel.Workbooks.Open([Excelファイルパス]) >WB.Close SaveChanges:=True コードが若干不足していますが、CopyFromRecordset で上書きできたという報告です。

sushidokei
質問者

お礼

TransferSpreadsheetは上書きできないのが仕様 ここが知らないとどうにもならなかったところでした 有り難うございました。

Powered by GRATICA
  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.1

2013だと上書きしてくれるのですがバージョンによって違うのかもしれませんね。 エクセルファイルに他のデータが無いのでしたら 以下のサイトの方法でファイルそのものをKillするという方法もあります。 AccseeVBA Excelエクスポート 決まったファイル名で上書き保存する https://sebastiansubway.hatenablog.com/entry/2017/09/11/173653

sushidokei
質問者

お礼

kill ステートメント 参照を巡回しまして 出来ました 有り難うございました。

Powered by GRATICA
sushidokei
質問者

補足

Private Function killLxlsx() '変数宣言 Dim srchXls As String '前回のExcelエクスポート先のファイルパス srchXls = "C:\Users\USER\Desktop\ACCESS\L.xlsx" If Dir(srchXls) <> "" Then Kill srchXls End If End Function 以上で 出来ました 有り難うございました。

関連するQ&A

  • Excel VBA Accessでデータ取り込み

    Excel VBA、Access VBAについてお教え下さい。 「My_Excel.xlsm」というファイルがあります。このファイルにはボタンが1つあります。 このボタンを押すことにより、「Imp_Excel.xlsx」というファイルを取り込みたいと思います。 取り込み先ですが、「My_Excel.xlsm」に取込むのではなく、Accessの「My_Access.accdb」の「T_MyTable」というテーブルに取り込みたいと思っています。 Accessから直に「Imp_Excel.xlsx」をインポートするには、TransferSpreadsheetを用いれば比較的簡単にデータをAccessに取り込むことができるのですが、「My_Excel.xlsm」をまたいでAccessに取り込みたいので、TransferSpreadsheetは使えません。 やり方としては、 My_Excel.xlsxを開く。 レコードセット取得。 レコードセットがEOFになるまでまわして、SQLのINSERT、またはAddNewメソッドを使用して1件1件挿入していくしか方法はないでしょうか? 今のところ、私が思い浮かぶのは上記の方法なのですが、何かもっと簡単にやれるような方法はあるでしょうか?よろしくお願いします。

  • エクセル 保存是非のダイアログを出さずに保存VBA

    エクセル 保存是非のダイアログを出さずに保存VBA エクセルファイルの ひとつのブック L.xlsxの特定のセルを 別のブックR.xlsxのセルにコピーするを VBAコードで コピーまでは出来たのですが R.xlsxのブックを保存するかどうかの ダイアログが出てしまいます これが出ないで保存できるように ActiveWorkBook.Save これを入れてもやはり保存是非の確認が 出てしまいます コードは -------------------- Sub ID移動() Dim x As Workbook Dim y As Workbook Workbooks.Open Filename:="C:\Users\USER\Desktop\ACCESS\L.xlsx" Set x = Workbooks("L.xlsx") Workbooks.Open Filename:="C:\Users\USER\Desktop\ACCESS\R.xlsx" Set y = Workbooks("R.xlsx") y.Sheets("sheet1").Range("A2") = x.Sheets("output").Range("B2") x.Close y.Close ActiveWorkBook.Save End Sub ------------------ 保存是非のダイアログがでないで 保存できるための方法を 御教示いただけますか win10 office365 すみませんが 宜しくお願い致します

  • アクセスからエクセルを開いてデータを取得するには?

    こんにちは。 MS AccessからExcelを開いて、Excel上のデータを取得したいのですが、下記のようにしたらエラーとなりました。CellsがNGみたいなのですが、AccessではCellsは使用出来ないのでしょうか? 宜しくお願いします。 Dim oApp As Object Set oApp = CreateObject("Excel.Application") oApp.Visible = True On Error Resume Next oApp.UserControl = True oApp.Workbooks.Open Filename:="C:\TEST\Book1.xls" GYO = 1 Do KI = Cells(GYO, 1).Value MsgBox KI GYO = GYO + 1 Loop Until Cells(GYO, 1) = ""

  • ACCESS2013VBA任意の文字列付与する方法

    ACCESS2013を使用しています。 メニュー用に作成したフォームにコマンドボタンを置いて、下記のようなソースを割り当て、 ボタンを押すとstrPathで指定したフォルダ内にエクセル形式にて出力するようにしています。 このフォームにテキストボックスを置いて、そこに入力した文字を出力するファイル名の末尾に 付与するにはどうしたら良いでしょうか? よろしくお願いいたします。 Function 一括エクスポート() On Error GoTo 一括エクスポート_Err strPath = "C:\Users\tanaka\Desktop\エクスポート\" DoCmd.OutputTo acOutputQuery, "DCAC", "ExcelWorkbook(*.xlsx)", strPath & "エクスポートデータ1.xlsx", False, "", , acExportQualityPrint DoCmd.OutputTo acOutputQuery, "DCAC", "ExcelWorkbook(*.xlsx)", strPath & "エクスポートデータ2.xlsx", False, "", , acExportQualityPrint DoCmd.OutputTo acOutputQuery, "DCAC", "ExcelWorkbook(*.xlsx)", strPath & "エクスポートデータ3.xlsx", False, "", , acExportQualityPrint 一括エクスポート_Exit: Exit Function 一括エクスポート_Err: MsgBox Error$ Resume 一括エクスポート_Exit End Function

  • excel VBA 新しいエクセルファイルの作り方

    エクセルのVBAについて、 特定のエクセルファイル(Aとします。)の情報を 下記の場所にあるエクセルファイル原紙に "C:¥Users¥Desktop¥原紙.xlsx" 書き写して、同じ場所に 新しいエクセルファイルを作成したいです。 エクセルファイルAの C3の左から4文字を原紙のN12 C3の右から4文字を原紙のP12 D3を原紙のD12 E3を原紙のL12 F3には日付(例 2023/3/12)となっていて、 月だけを取り出して原紙のB12 日だけを取り出して原紙のC12 にしたいです。 尚、エクセルファイルAのデータは1行だけではないので、 上記を最終行までループしたいです。 ループ後に名前を付けて保存で "C:¥Users¥Desktop¥20230312.xlsx" のように、その日付名前で保存したいです。 また、日付毎にエクセルのファイルをわけたいのですが、 ここのやり方が全く思いつかず、困っています。 エクセルのファイルAの情報で F3から↓が 3/12 3/14 3/12 となっていた場合に3/12で一回ファイルを保存して、 3/14で新しく原紙ファイルを開いて、保存して 既に保存されている日付の場合は、そのエクセルファイルを 開いて("C:¥Users¥Desktop¥20230312.xlsx") 記入していくようにしたいです。 説明が難しく、複雑ですが どなたかご教授頂けないでしょうか。 初めからどのように書いたらいいか教えていただけると幸いです。 お手数をおかけしますが、回答よろしくお願いいたします。

  • Vistaなら1回で行くのにXPだと2回

    エクセルVBAで新たなエクセルアプリケーションを立ち上げるコードが知りたく ネットで検索したら見つけました。 ---------------------------------------- Sub test() Dim oApp As Object Set oApp = CreateObject("Excel.Application") oApp.Visible = True oApp.UserControl = True Set oApp = Nothing End Sub ---------------------------------------- 上記のコードなのですが XPは2回このコードを実行しないと、新たなアプリケーションは立ち上がりません。 vistaなら1回で立ち上がります。 どちらもエクセルのバージョンは2003です。 XPがおかしいのか、2回やらないといけないコードなのかわかりません。 よろしくお願いします。

  • エクセルVBA ファイル名操作

    エクセルマクロのコードにおきまして 「フォルダの選択」ダイアログから エクセルファイル 123.xlsxを例えば 開くときに それをa.xlsxという名前に変えて 以下のそれに続くVBAコードにおいて a.xlsxを操作したいのですが、 a = Application.GetOpenFilename() Workbooks.Open a これを実行すると求めるダイアログが表示されて 使いたい123.xlsxを開くをクリックしますが これでは123.xlsxがa.xlsxにはなりません このa.xlsxのファイル名で別途ファイル作成する方法を 御教示いただけると助かります よろしくお願いします win10 office365 コードは以下 部分ですが こういう流れで作成したい所存です Sub あいう() a = Application.GetOpenFilename() Workbooks.Open a 'b.xlsxファイルを新規作成 Workbooks.Add ActiveWorkbook.SaveAs Filename:="C:\Users\USER\Desktop\あいう\b.xlsx", FileFormat:=xlXMLSpreadsheet 'a.xlsxファイルの1行目のA1~AG1のセルの値をコピー Workbooks("a.xlsx").Worksheets("Sheet1").Range("A1:AG1").Copy 'b.xlsxファイルのA3~AG3のセルに貼り付け Workbooks("b.xlsx").Worksheets("Sheet1").Range("A3:AG3").PasteSpecial xlPasteValues 以下省略 よろしくお願いします

  • EXCELのVBAで元のブック名へ戻す方法

    得意先サブマスタ作成.xlsmというブック名でマクロを作成しています。 その中でCSVファイルを読み込んでエクセルへ変えて保存をしています。 With ActiveSheet.QueryTables.Add(Connection:= _ "TEXT;C:\Users\*******\Desktop\得意先変換マスタ.csv", Destination:=Range("$A$1")) '.CommandType = 0 .Name = "得意先変換マスタ" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .TextFilePromptOnRefresh = False .TextFilePlatform = 932 .TextFileStartRow = 1 .TextFileParseType = xlDelimited .TextFileTextQualifier = xlTextQualifierDoubleQuote .TextFileConsecutiveDelimiter = False .TextFileTabDelimiter = True .TextFileSemicolonDelimiter = False .TextFileCommaDelimiter = True .TextFileSpaceDelimiter = False .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1) .TextFileTrailingMinusNumbers = True .Refresh BackgroundQuery:=False End With Application.DisplayAlerts = False ActiveWorkbook.SaveAs Filename:="C:\Users\honb014\Desktop\得意先変換マスタ.xlsx", _ FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False Application.DisplayAlerts = True このコードで行っているのですが、実行すると当然ですがアクティヴなブック名は得意先 変換マスタ.xlsxになっています。 これを元の得意先サブマスタ作成.xlsmに戻す方法はありますか? マクロでこの後に続く箇所で上記の得意先変換マスタ.xlsxを使用する際にエラーが出て しまい、このような質問をさせていただきました。 宜しくお願い致します。

  • エクセルVBA アクセスにインポート

    エクセルのデータ(列数、行タイトルは都度かわる)をアクセスにインポートしテーブルを作成したいと思っています。 VBAでこの処理をおこないたく、下記のコードで実行したのですがデバッグがはしってしまいます。 (DとEでデバッグ) 原因がお分かりになる方がおりましたら、教えていただけますでしょうか? 何卒、よろしくお願い申し上げます。 Function ExcelDataImport() 'On Error GoTo エラー Dim varac As Variant Dim varxls As Variant Dim strrange As String Dim strmsg As String varac = "T_TESTTABLE" ' --- A varxls = "C:\Users\AC\Desktop\ACTEST\RAWDATA.xlsx" ' ---B strrange = "TEST_RAWDATA" ' --- C strmsg = "Excelファイル" & varxls & " を、Accessテーブル " & varac & _ "へ、データ入力を行います。" & Chr(13) & _ "Excelファイルの入力レンジは、 " & strrange & " です。" DoCmd.DeleteObject acTable, varac ' --- D If MsgBox(strmsg, vbOKCancel) = vbOK Then DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _ varac, varxls, True, strrange ' -- E MsgBox "データ入力は、正常に完了しました。" End If Exit Function エラー: MsgBox "予期せぬエラーが発生しました。" & Chr(13) & _ "エラー番号:" & Err.Number & Chr(13) & _ "エラー内容:" & Err.Description, vbCritical Exit Function End Function

  • ACCESSからEXCELの PasteSpecial でエラーになる

    ACCESSからEXCELを操作しています。 範囲コピー後、書式のみペーストしたいのですが、うまくいきません。 以下の PasteSpecial の行でエラーになります。 エラーメッセージは「Range クラスの PasteSpecial メソッドが失敗しました。」です。パラメータを付けないと全てがコピーされ正常に終わります。 パラメータをダブルクォートで囲っても駄目でした。 EXCELのマクロ出力そのままなのですが、書き方が悪いのでしょうか。 Dim oApp As Object Set oApp = CreateObject("Excel.Application") oApp.UserControl = True oApp.Workbooks.Open FileName:="format.xls" oApp.Range("A1:D4").Select oApp.Selection.Copy oApp.Range("C9").Select '↓エラーになる oApp.Selection.PasteSpecial Paste:=xlFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

専門家に質問してみよう