連日質問続きで申し訳ありません。
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
回答2件
あなたの回答
tips
プレビュー