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

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

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

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

Access

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

1回答

6630閲覧

VBA 2回目以降エラーになる

name1224

総合スコア8

VBA

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

Access

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2020/05/14 02:13

お世話になります。どなたかご回答の程よろしくお願い致します。

<知りたい事>
今回AccessからEXCELを操作しております。
1回目の実行はうまくいきますが、2回目以降の実行でエラーが表示されます。
エラーの解決策を知りたいです。
ヒントになるサイトは見つけましたが、解決できませんでした。
http://hanatyan.sakura.ne.jp/vbhlp/ExcelErr.htm

「エラー内容」
'Rows'メソッドは失敗しました:'_Global'オブジェクト
maxRow の代入箇所でエラーになっている為、maxrowとmaxcolに直接数値を代入して処理を続行

すぐ後の処理のwithの箇所でエラー発生

セルの情報を取得している箇所でエラー(ヒントになるサイトを参考にcellの指定を丁寧に設定してもエラーになってしまう)

<記述>
<省略:クエリのエクスポート処理>

dim exApp as Object
dim wb as Object
dim ws as Object
dim StrFile as string
dim maxrow as long
dim maxcol as long
dim cnt as long

StrFile = "ファイルパス" '実際は省略箇所で代入済み

set exApp = CreateObject("Excel.Application")
set wb = exApp.Workbooks.Open(StrFile)
set ws = wb.Worksheets("シート名")

exApp.DisplayAlerts = False
exApp.Visible = true

MaxRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
MaxCol = ws.Cells(1, Columns.Count).End(xlToLeft).Column

with ws.Range(cells(1,1),cells(1,maxCol))
.Interior.Color = RGB(192,192,192)
.Font.Bold = True
.Borders.LineStyle = xlContinuous
end with

for cnt = 1 to maxCol
if ws.cells(1,cnt).value = "項目1" or ws.Cells(1,cnt).value = "項目2" then
ws.columns(cnt).Delete
cnt = cnt -1
end if
next

ws.Range(Cells(maxrow,32)),Cells(maxrow,34)) = ""
ws.Cells(maxrow,34) = _
"SUM(" & Range(Range("AH3"), Range("AH3").End(xlDown)).Address(false,false) & ")"

wb.save
wb.Close
exApp.Quit

exApp.DisplayAlerts = true
set exApp = Nothing
set wb = Nothing
set ws = Nothing

<省略:エラー処理>

以上の内容になります。どなたかお力添えの程よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーこの部分ですか?(可能ならエラー位置を示された方が宜しいです。)

MaxRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
MaxCol = ws.Cells(1, Columns.Count).End(xlToLeft).Column

私が見たところで、意見を書かせて頂きます。
基本的な部分ですが、書き方に曖昧な部分が多々あります。
自シート内だけで動いているのであれば、Rows.Count/Columns.Countと言う書き方で対象のシートを特定できますので動くと思いますが、別アプリから操作する場合には、この書き方ではどのシートのオブジェクトか特定できないです。

書くならば、
MaxRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Rowとして、
wsを付けてどのシートかを特定する方が良いと思います。
その他、cell/Range等この様に単独で記載する部分が多々散見されますので、先ずはこれを修正した方が良いと思います。
その後にエラー部分を細かく分解してその値を確認して下さい。
debug.print w.Rows.Count 又は、ウオッチ式などでRows.Countを見る。
特に、親となるオブジェクト(シート名)など一致しているか見た方が良いです。
例;ws.CellsとRows.Countのシート名は一緒のws名ですか?

ヒントに下記ありましたが、

http://hanatyan.sakura.ne.jp/vbhlp/ExcelErr.htm

これはExcelプロセスが正常に終了しない障害を指しています。
状態はタスクマネージャーで確認できます。
Excelプロセスがset ws=Nothing通過後に
無くなっているのであれば今回の問題とは関係ないです。

ただし、今回の記述方法ではRange/Cellと単に記載しているため、set ws=Nothingでの解放対象とはなりません。そのためプロセス残っている可能性あります。
(ただし、exApp.QuitでExcel終了記述していますので、終了しているかもしれませんが、残っている可能性は大きいと思います。)
この場合には、Accessを終了した時に、Excelのプロセスも一緒に終了します。
タスクマネージャー画面を出してこの動きを確認して下さい。
今回の問題とは余り関係無いと思いますが、記述に問題があったため結果的にプロセルが残る状態に、問題が波及して行ったと考えます。

set ws=Nothingで解放させるためには、Range/Cellではなく
ws.Range/ws.cellと記載しなければ、解放する対象とはならずプロセスは残ります。

投稿2020/05/14 04:26

tosi

総合スコア553

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

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

name1224

2020/05/14 05:31

ご回答頂きましてありがとうございます。 >set ws=Nothingで解放させるためには、Range/Cellではなく ws.Range/ws.cellと記載しなければ、解放する対象とはならずプロセスは残ります。 ご指摘を頂きました通り、「ws」の漏れが多々ありましたので全てきちんと修正したところきちんと解放されてエラーが発生しなくなりました。大変助かりました。私の質問にお時間を割いて頂きましてありがとうございました。まだまだ初心者ですので、もっと勉強したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問