🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

Access

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

Q&A

解決済

2回答

3445閲覧

AccessVBAでExcelを開いて色々処理したいが、タスクが消えずに残る

koH_dr7

総合スコア7

VBA

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

Access

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

0グッド

0クリップ

投稿2019/12/11 02:35

連日質問続きで申し訳ありません。
VBAを初めて20日ちょっとで詰まりに詰まっています。

Accessのフォームのテキストボックスに、触りたいエクセルファイルのパスが入っています。
Accessの同じフォームのボタンを押すと、エクセルファイルが弄られて保存される、というシステムを作ろうとしています。

ザっと見て、これでなぜタスクが残るかわかる方はおられませんか…?
昨日今日と丸一日以上調べて弄っていました。
Excelファイルを外部から触るときはオブジェクトに格納してSet, Close, Quit, Nothing等を使って、解放してあげるとタスクが残らない、と知りやってみましたがタスクが残ります。

また、Selection.ShapeRange.ShapeStyleがあやしいと思ってコメント化してもタスクは残りました。

欲しい結果は出ますが、タスクが残るせいで連続してフォームのボタンを押すとエラーが出るのをなくしたいのです。

どうか知恵をお貸しいただけたらと思います。(だいぶ長くなるので短くしています、見辛い部分もあると思いますがご了承ください)

VBA

1Set mdb = mdbDB.OpenRecordset(strSQL) 2 3'Excelオブジェクトを生成 4Set xls = CreateObject("Excel.Application") 5Set wb = xls.Workbooks.Open(Me.txtPath.Value) 6 7 8With xls 9 '画面の再描画を抑止 10 .ScreenUpdating = False 11 12Do Until mdb.EOF 13 14 '新しい社名が入ったとき 15 If mdb(0) <> "" And cname <> mdb(0) Then 16 wb.Worksheets("依頼書").Copy After:=wb.Worksheets(wb.Worksheets.count) ' 末尾に追加 17 18 shina = False 19 20 wb.ActiveSheet.Name = mdbRST1(0) 21 wb.ActiveSheet.Cells(10, 2).Value = mdb(0) 22 wb.ActiveSheet.Cells(11, 2).Value = mdb(1) 23 wb.ActiveSheet.Cells(16, 6).Value = mdb(2) 24 25 i = 1 26 27 wb.ActiveSheet.Cells(12, 2).Value = total 28 cname = mdb(0) 29 30 If mdb(4) = "品" Then 31 '品に〇をつける 32 wb.ActiveSheet.Shapes.AddShape(msoShapeOval, 6.75, 102, 27, 15).Select 33 Selection.ShapeRange.ShapeStyle = msoShapeStylePreset50 34 wb.ActiveSheet.Cells(16, 8).Value = "品" 35 shina = True 36 37 Else 38 MsgBox "種別が正しくない項目があります。 発注先 = " & mdb(0) 39 40 End If 41 42 mdbRST1.MoveNext 43 44 '既存の社名が入ったとき 45 Else 46 wb.ActiveSheet.Cells(16 + i, 6).Value = mdb(2) 47 wb.ActiveSheet.Cells(16 + i, 9).Value = mdb(3) * taxmath 48 total = total + mdb(3) * taxmath 49 wb.ActiveSheet.Cells(12, 2).Value = total 50 51 If mdb(4) = "品" Then 52 '品に〇をつける 53 wb.ActiveSheet.Cells(16 + i, 8).Value = "品" 54 55 If shina <> True Then 56 wb.ActiveSheet.Shapes.AddShape(msoShapeOval, 6.75, 102, 27, 15).Select 57 Selection.ShapeRange.ShapeStyle = msoShapeStylePreset50 58 shina = True 59 End If 60 61 62 '項目が6行を超えるときに罫線を描く 63 If i > 6 Then 64 wb.ActiveSheet.Range(Cells(16 + i, 6), Cells(16 + i, 11)).Borders(xlEdgeTop).LineStyle = xlDash 65 wb.ActiveSheet.Range(Cells(16 + i, 6), Cells(16 + i, 11)).Borders(xlEdgeLeft).LineStyle = xlContinuous 66 wb.ActiveSheet.Range(Cells(16 + i, 6), Cells(16 + i, 11)).Borders(xlEdgeRight).LineStyle = xlContinuous 67 wb.ActiveSheet.Range(Cells(16 + i, 6), Cells(16 + i, 11)).Borders(xlEdgeBottom).LineStyle = xlContinuous 68 wb.ActiveSheet.Range(Cells(16 + i, 6), Cells(16 + i, 7)).Borders(xlEdgeRight).LineStyle = xlDash 69 70 wb.ActiveSheet.Range("A1").Select 71 72 73 End If 74 75 i = i + 1 76 mdb.MoveNext 77 78 End If 79 80Loop 81 82 83 mdb.Close 84 85 'A1セルだけを選択状態にする 86 wb.ActiveSheet.Range("A1").Select 87 '画面の再描画を元に戻す 88 .ScreenUpdating = True 89 'Excelを可視状態にする 90 '.Visible = True 91 92 Dim strFilePath As String 93 Dim strFilename As String 94 Dim PathName As String 95 Dim Filename As String 96 97 'txtBoxからパスだけ取ってくる 98 Filename = Dir(Me.txtPath.Value) 99 PathName = Replace(Me.txtPath.Value, Filename, "") 100 101 strFilename = Format(Now(), "yyyy-mm-dd-hh-mm-ss") & ".xlsx" 102 strFilePath = PathName & strFilename 103 104 wb.SaveAs Filename:=strFilePath 105 106 MsgBox "ファイルの保存が完了しました" & vbCrLf & _ 107 "保存先は" & strFilePath & "です。" 108 109End With 110 111wb.Close 112xls.Quit 113Set xls = Nothing 114

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

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

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

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

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

hatena19

2019/12/11 03:38

残るタスクはなんのタスクですか。Excelですか。 また、それをどのように確認しましたか。
koH_dr7

2019/12/11 03:50

コメントありがとうございます! Excelのタスクです。 タスクマネージャーで確認しました。 裏で開いたままになっているようです。
guest

回答2

0

気になったところは以下です。
SelectionとかCellsとかxlDashとかxlContinuousとかxlEdgeTopとかxlEdgeLeftとかxlEdgeRightとかxlEdgeBottomとか親オブジェクトを指定していないですが、全てExcelのオブジェクトなんでエラー出てませんか?
あと念のためwbNothing入れておいてください。

VBA

1' ・・・略・・・ 2 'Selection.ShapeRange.ShapeStyle = msoShapeStylePreset50 3 ' ↓ 4 xls.Selection.ShapeRange.ShapeStyle = msoShapeStylePreset50 5' ・・・略・・・ 6 'Selection.ShapeRange.ShapeStyle = msoShapeStylePreset50 7 ' ↓ 8 xls.Selection.ShapeRange.ShapeStyle = msoShapeStylePreset50 9' ・・・略・・・ 10 'wb.ActiveSheet.Range(Cells(16 + i, 6), Cells(16 + i, 11)).Borders(xlEdgeTop).LineStyle = xlDash 11 ' ↓ 12 wb.ActiveSheet.Range(wb.ActiveSheet.Cells(16 + i, 6), wb.ActiveSheet.Cells(16 + i, 11)).Borders(xls.XlBordersIndex.xlEdgeTop).LineStyle = xls.XlLineStyle.xlDash 13 14 'wb.ActiveSheet.Range(Cells(16 + i, 6), Cells(16 + i, 11)).Borders(xlEdgeLeft).LineStyle = xlContinuous 15 ' ↓ 16 wb.ActiveSheet.Range(wb.ActiveSheet.Cells(16 + i, 6), wb.ActiveSheet.Cells(16 + i, 11)).Borders(xls.XlBordersIndex.xlEdgeLeft).LineStyle = xls.XlLineStyle.xlContinuous 17 18 'wb.ActiveSheet.Range(Cells(16 + i, 6), Cells(16 + i, 11)).Borders(xlEdgeRight).LineStyle = xlContinuous 19 ' ↓ 20 wb.ActiveSheet.Range(wb.ActiveSheet.Cells(16 + i, 6), wb.ActiveSheet.Cells(16 + i, 11)).Borders(xls.XlBordersIndex.xlEdgeRight).LineStyle = xls.XlLineStyle.xlContinuous 21 22 'wb.ActiveSheet.Range(Cells(16 + i, 6), Cells(16 + i, 11)).Borders(xlEdgeBottom).LineStyle = xlContinuous 23 ' ↓ 24 wb.ActiveSheet.Range(wb.ActiveSheet.Cells(16 + i, 6), wb.ActiveSheet.Cells(16 + i, 11)).Borders(xls.XlBordersIndex.xlEdgeBottom).LineStyle = xls.XlLineStyle.xlContinuous 25 26 'wb.ActiveSheet.Range(Cells(16 + i, 6), Cells(16 + i, 7)).Borders(xlEdgeRight).LineStyle = xlDash 27 ' ↓ 28 wb.ActiveSheet.Range(wb.ActiveSheet.Cells(16 + i, 6), wb.ActiveSheet.Cells(16 + i, 7)).Borders(xls.XlBordersIndex.xlEdgeRight).LineStyle = xls.XlLineStyle.xlDash 29' ・・・略・・・ 30wb.Close 31Set wb = Nothing 32xls.Quit 33Set xls = Nothing

投稿2019/12/11 04:56

Y.H.

総合スコア7918

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

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

hatena19

2019/12/11 05:01

確かにSelectionでエラーが出るはずですよね。見落としてました。 質問のコードにはエラー処理がないのでエラーが出るはずですが、その点については質問で言及がないのはなぜなのか?
Y.H.

2019/12/11 05:04

どこかこの処理の前でOn Error Resume Nextされてるのかなぁとエスパーしたうえで 「全てExcelのオブジェクトなんでエラー出てませんか?」との記載にとどめました。
hatena19

2019/12/11 05:13

たぶんそうですね。 On Error Resume Next の意味を理解していない。
koH_dr7

2019/12/11 05:45

On Error Resume Nextの意味、知りませんでした、勉強になります。 エラー処理をしていないのですが、エラーが出ません…。 Selectionの命令も通り、引きたい罫線も引ける状態です。 ツール→参照設定→Excel Object Libraryでチェックは入っています、これで通っているのでしょうか?
hatena19

2019/12/11 05:55

On Error Resume Next 以外に、On Error で始まる行はないですか。 あればコメントアウトしてください。 Selection は、xls.Selection に修正してください。
Y.H.

2019/12/11 06:03

> ツール→参照設定→Excel Object Libraryでチェックは入っています であれば、「xlDashとかxlContinuousとかxlEdgeTopとかxlEdgeLeftとかxlEdgeRightとかxlEdgeBottom」はエラーになりません。 SelectionとかCellsとかは何を参照するんだろう??? CreateObjectしたExcel.Applicationと、Excel Object Libraryで参照したExcel.Applicationの二つのインスタンスが起動してたりするんだろうか・・・
hatena19

2019/12/11 06:12

Access.Application には Selection はないので、xls.Selection としないとエラーが出るはずなんですが、質問者さんはエラー処理はしてないといってますし、謎です。 参照設定しただけでは、Excel.Application は生成されないです。 Dim xl As Excel.Application Set xl = New Excel.Application とNewしたときに生成されるはずです。 参照設定した場合は、 CreateObject ではなく、Newで生成したほうがいいと思います。
koH_dr7

2019/12/11 06:50

ありがとうございます!! xls.SelectionとCellsの書き方で見事にタスクが消えました。連続で使うこともできました! タスクマネージャーから緑のアイコンが消えた瞬間声が出ました…。 助かりました、本当にありがとうございました!
guest

0

ベストアンサー

呈示されているコードを見る限りは、原因となるようなものは見つけることはできません。
他の部分に問題がある可能性も検討ください。
それと、コード実行中にエラーが出るということはないですよね。

どうしても分からない場合は、まずはなるべくシンプルなコードを書いて実行してみて、タスクが残るか確認する。
少しずつ必要な処理を追加していって、その都度タスクが残るか確認する。
タスクが残った時に、その直前で追加した処理に問題がある。

というようなデバッグ作業で原因を特定するということになると思います。

とりあえず下記のようなコードでタスクが残らないことを確認してから、コードを少しずつ追加していってみてください。

vba

1'Excelオブジェクトを生成 2Dim xls As Object 3Set xls = CreateObject("Excel.Application") 4Dim wb As Object 5Set wb = xls.Workbooks.Open(Me.txtPath.Value) 6 7xls.Visible = True 'デバッグ作業中は表示させておいた方がよい 8'エラー処理があるならコメントアウトしておく 9 10 11wb.Close 12xls.Quit 13Set xls = Nothing

追記

あと、デバッグ(想定通りに動作しない場合に原因を特定する作業)するときは、
エラー処理は無効にしておく必要があります。
具体的には、

vba

1On Error ・・・・

の行は、先頭に ' を挿入してコメントアウト(無効)にしておく。

vba

1'On Error ・・・・

投稿2019/12/11 04:18

編集2019/12/11 05:17
hatena19

総合スコア34073

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

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

koH_dr7

2019/12/11 04:32

デバッグのやり方等をしらないまま、VBAに取り組んできましたが、少しずつ探るのですね。 どこが原因か今から探してみます、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問