質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

2回答

2991閲覧

ACCESSからのExcel操作について

napoleon

総合スコア18

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2018/06/27 05:38

編集2018/06/27 05:51

ACCESSからExcel操作のVBAは初めてで躓いております。どうかよろしくお願い致します。

◆やりたいこと
ACCESSのフォームからチェックボックスで選択した取引先データをCopyFromRecordsetで書き出し、横長のクエリを切り分けExcel上で見やすい帳票に加工したい

◆できていること
選択した取引先のデータを、任意のセルにフィールド名やクエリの内容を書き出せている

◆困っていること
都度、選択する取引先が違うため、For~Nextで繰り返し処理を行おうとしている。その際に処理が終わったExcelBookは任意の名前を付けて保存し、次の処理に進みたいと考えております。
しかし、『名前を付けて保存』でエラ-438(オブジェクトサポートなし)が表示されます。色々なサイトを見てみるのですがうまくいきません。

初心者のため根本的なミスかもしれませんがご教示いただきますようお願い致します。

Private

1 2Dim RS1 As Recordset, RS2 As Recordset 3Dim RR As Integer 'ROW 4Dim CC As Integer 'Cell 5Dim EE As Object 'Excel 6Dim i As Integer 7Dim idx1 As Integer, idx2 As Integer 8Dim CNT1 As Integer, CNT2 As Integer 9Dim Q_N As String '会社名 10 11 12 13 Set DB = CurrentDb() 14 15 For idx1 = 1 To 21 16 17 If Me("CHK_" & idx1) = True Then 18 Set RS1 = DB.OpenRecordset("SELECT M_仕入先会社マスタ.* FROM M_仕入先会社マスタ WHERE ((ID=" & idx1 & "));") 19 RS1.Edit 20 RS1!CHK = Me("CHK_" & idx1) 21 RS1.Update 22 End If 23 24 Next 25 26 Set RS1 = DB.OpenRecordset("SELECT M_仕入先会社マスタ.仕入先コード FROM M_仕入先会社マスタ WHERE (((M_仕入先会社マスタ.[CHK])=-1));") 27 28 CNT1 = 0 29 CNT2 = 0 30 31 Do Until RS1.EOF 32 33 Set EE = CreateObject("Excel.Application") 34 '本番はfalse 35 EE.Visible = True 36 37 With EE 38 .ScreenUpdating = True 39 .Workbooks.Add 40 End With 41 42 For idx2 = 1 To 4 43 44 45 Set RS2 = DB.OpenRecordset("SELECT Q_シミュレート_" & idx2 & ".* FROM Q_シミュレート_" & idx2 & " WHERE (((Q_シミュレート_" & idx2 & ".仕入先コード)='" & RS1!仕入先コード & "'));") 46 47 Q_N = RS2!会社名 48 49 If idx2 = 1 Then 50 CNT1 = DCount("*", "Q_シミュレート_" & idx2 & "", "仕入先コード = '" & RS2!仕入先コード & "'") 51 'フィールド名の書き出し 52 For i = 0 To RS2.Fields.Count - 1 53 ActiveSheet.Cells(1, i + 1).Value = RS2.Fields(i).Name 54 Next i 55 'CopyFromRecordsetメソッドで基準セルを指定してデータの書き出し 56 ActiveSheet.Range("A2").CopyFromRecordset RS2 57 58 CNT1 = CNT1 + 2 59 CNT2 = CNT1 60 61 Else 62 63 For i = 0 To RS2.Fields.Count - 1 64 ActiveSheet.Cells(CNT2 + 1, i + 1).Value = RS2.Fields(i).Name 65 Next i 66 'CopyFromRecordsetメソッドで基準セルを指定してデータの書き出し 67 ActiveSheet.Range("A" & CNT2 + 2).CopyFromRecordset RS2 68 69 CNT2 = CNT2 + CNT1 70 71 End If 72 73 Next 74'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 75↓ここからが失敗箇所です 76 With EE 77 .Save 78 EE.SaveAs "J:\シミュレート表_2018\" & Q_N & ".xlsx" 79 EE.Quit 'Excel終了 80 Set EE = Nothing '参照開放 81 End With 82 Loop 83End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/06/27 05:42

質問編集画面タイトル横にある「初心者アイコン」をご活用ください。「初心者」と質問で書くよりも伝わりますし、質問一覧に表示されるのでわかりやすくなります。
napoleon

2018/06/27 05:52

ご指摘ありがとうございます。今後使用させていただきます。
guest

回答2

0

workbookのsaveになってないのでは?

VBA

1With EE 2 .ScreenUpdating = True 3 .Workbooks.Add 4End With

VBA

1Dim wbTmp As Workbook 2With EE 3 .ScreenUpdating = True 4 .Workbooks.Add 5 Set wbTmp = ActiveWorkbook 6End With

とかしておいて、SaveのときにwbTmp.Saveとしては?

投稿2018/06/27 06:33

sysjojo

総合スコア325

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

napoleon

2018/06/27 06:48

回答ありがとうございます。 今まで実行時エラーは438だったのですが、今度は実行時エラー91が出るようになりました。 『SaveのときにwbTmp.Saveとしては? 』というのは実際にどのような記述になるのでしょうか? 無学で申し訳ありません。
sysjojo

2018/06/27 07:07

EE.SaveもしくはEE.SaveAsの代わりにwbTmp.Saveしては? という意味でした。 質問のコードに揃えるなら、 SaveAs "J:\シミュレート表_2018\" & Q_N & ".xlsx" でしょうか。 SaveメソッドはExcel.Applicationオブジェクトではなく、Workbookオブジェクトのメソッドだと思いますので。 https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/workbook-saveas-method-excel そもそもループの中でExcel.Applicationを起こして落としてしているのも悪影響ありそうなので、ループの外に出してループの中ではWorkbookの作成、クローズにした方がよいとも思いますよ。(レコードセットの1行ごとにやってるので、同じファイル名(=取引先)をたくさん作ろうとすることによるエラーも起きそうな気がしますが)
napoleon

2018/06/27 07:19

回答ありがとうございます。なんとか保存が出来ました。やはりループの中でやるのは危険ですか。。。 一旦取引先のExcelを作成しクローズした後に、再度立ち上げて製表する方が効率が良いのでしょうか? ここから条件付き書式などを設定していこうとしています。 理想としてはACCESSでExportボタンを押せばエクセルが製表されて任意のフォルダに格納されるというのが理想なのですが。。。(職場のおぢ様達がみたいというリクエストに応えるべく。。。)
sysjojo

2018/06/27 07:27

ヒントだけですが、ループの度に個々のファイルでCloseすることをやめて、 https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/workbook-save-method-excel にある、「開かれているすべてのブックを保存して Excel を終了」のコードを参考に「任意のフォルダ」を指定するコードを組み込めば、ループが終わった時にディレクトリの指定を1回だけで保存させることはできますね。 ただ、その場合Workbookはすべて開きっぱなしになるので、ActiveWorkbookやActiveSheetがどこにあるのか把握しながらコードを書かないと上手く行かなくなりますので、ご注意を。
napoleon

2018/06/27 07:30

ForEachを使うのですね あまり使ったことがないですがヒントをもとに挑戦してみようと思います。 ありがとうございました。
napoleon

2018/06/27 08:38

worksheetの変数を宣言してやってみたらうまく行きました。お騒がせ致しました。
guest

0

ベストアンサー

vba

1 With EE 2 .ScreenUpdating = True 3 .Workbooks.Add 4 End With 5 '中略 6 With EE 7 .Save 8 EE.SaveAs "J:\シミュレート表_2018\" & Q_N & ".xlsx" 9 EE.Quit 'Excel終了 10 Set EE = Nothing '参照開放 11 End With

EE(Excelオプジェクト)は保存できないのでエラーになるのですね。
新規ブックを名前を付けて保存するようにしましょう。
.Save は上書き保存なので新規ブックではエラーになりますので、.SaveAs で。

vba

1 Dim wb As Workbook 2 With EE 3 .ScreenUpdating = True 4 Set wb = .Workbooks.Add 5 End With 6 '中略 7 With EE 8 WB.SaveAs "J:\シミュレート表_2018\" & Q_N & ".xlsx" 9 WB.Close 10 .Quit 'Excel終了 11 Set EE = Nothing '参照開放 12 End With

補足

質問の回答ではなく、改善のアドバイスです。
ExcelオブジェクトをRecordsetのレコード数分、生成したり解放したりしてますが、無駄ですね。重くなるだけです。ループ前に一回生成して、ループを抜けてから解放すればOKです。

vba

1 '略 2 Dim wb As Object 'Workbook 3 '略 4 5 Set EE = CreateObject("Excel.Application") 6 '本番はfalse 7 EE.Visible = True 8 EE.ScreenUpdating = True 9 10 Do Until RS1.EOF 11 12 Set wb = EE.Workbooks.Add '新規ブックを追加 13 14 '略 15 16 WB.SaveAs "J:\シミュレート表_2018\" & Q_N & ".xlsx" 17 WB.Close 'ブックを閉じる 18 19 rs1.Movenext 20 Loop 21 22 EE.Quit 'Excel終了 23 Set EE = Nothing '参照開放

投稿2018/06/27 06:23

編集2018/06/27 07:08
hatena19

総合スコア33620

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

napoleon

2018/06/27 06:37

回答ありがとうございます。 やはり実行時エラー438が出てしまいます。保存場所をデスクトップに変えたりしてみましたが同様のエラーが出てしまいます。 試しにwith EEの下に『Range("A1").Value = "仕入先"』と記入してみたところ書き換わりました。 SaveAsがいけないのでしょうか。。。。
hatena19

2018/06/27 06:52

EE の保存ではなく新規ブックを名前をつけて保存するでないとダメでした。 回答のコードを修正しておきました。
napoleon

2018/06/27 07:04

ありがとうございました。保存することが出来ました! ここから製表で作りこんで行こうと思いますのでまた色々ご教示ください。
napoleon

2018/06/27 07:50

もうひとつお伺いしてもよろしいでしょうか。 ループで2回目の処理を行おうとしたら実行時エラー91でオブジェクト変数が設定されていないといわれました。↓この段階で 『ActiveSheet.Cells(1, i + 1).Value = RS2.Fields(i).Name』 wbを開放していないのが問題かと思い追加してみたのですが、結果変わらずでした。 EEとwb以外にもなにか追記する必要があるのでしょうか?
hatena19

2018/06/27 09:45

ActiveSheet を使うのはさせたほうがいいでしょう。 wb.WorkSheets(1) で最初のシートを参照できますので、これに置き換えてください。 追記のアドバイスも参考にしてください。
napoleon

2018/06/28 01:03

ありがとうございました。ループがうまく行きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問