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

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

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

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

Q&A

3回答

19815閲覧

VBAマクロでエラー番号-2147417848が出ます

genki55

総合スコア6

VBA

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

0グッド

0クリップ

投稿2017/09/25 00:12

###前提・実現したいこと
エクセルマクロを使い標準モジュールから親フォームを表示させ、親フォームでは子フォームに表示する詳細データを選択させて編集後に子フォームを表示しております。
尚、子フォームは60情報/ページで二ページ構えております。
しかし約10回に1回は子フォームを表示させた直後に標記のエラーで異常終了してしまいます。
再起動後にダウンしやすいとかの傾向はつかめませんでした。
このエラーを回避する方法を教えてください、初心者ですのでわかりやすく表現していただくようお願いいたします。

###発生している問題・エラーメッセージ
エラーが発生しました
エラー番号:-2147417848
エラーの種類:オートメーションエラーです。
起動されたオブジェクトはクライアントから切断されました。

###該当のソースコード
エクセルVBA
Private Sub CommandButton1_Click()
'親フォームの実行釦で起動される。
'複写フォームにMKK/ATY KOP/ATY 035/9BCBの初期フォームを作成する
'OP釦で選択されているシートの検番を子フォームおよび子次頁フォームに表示する
''Debug.Print "i="; 削除シート

Application.ScreenUpdating = False Application.DisplayAlerts = False On Error GoTo er For i = 1 To 6 If Me.Controls("OptionButton" & i) = True And _ 親フォーム.Controls("Label" & 4 + i).Caption <> "" Then GoTo p1 Next i MsgBox "シートが選択されておりません" Exit Sub

p1:
'複写FのMKK・ATY KOP・ATY 035・9BCBのフォームを初期化する
If Worksheets("条件").Visible = False Then Worksheets("条件").Visible = True
Sheets("条件").Select
Range("an:ao").Delete 'フォームで使用するエクセルの行数と検番
Range("an1") = "行数"
Range("ao1") = "検番"
Range("r3:ab19").Select 'MKKフォーム
Selection.Copy
Sheets("複写F").Select
Range("a3,a21, a40,A58").Select
ActiveSheet.Paste 'MKKフォーム初期化する
Sheets("条件").Select
Range("AD3:AH26").Select
Selection.Copy
Sheets("複写F").Select
Range("M2").Select 'aty kop
ActiveSheet.Paste
Sheets("条件").Select
Range("AD29:AG43").Select
Selection.Copy
Sheets("複写F").Select
Range("M40,M55").Select 'バーコードチェック
ActiveSheet.Paste
Sheets("条件").Select
Range("AD46:AG77").Select
Selection.Copy
Sheets("複写F").Select
Range("S2").Select 'aty 035
ActiveSheet.Paste
Range("s40:s69").ClearContents
Range("A1").Select
Sheets("条件").Select
Application.CutCopyMode = False
ActiveWindow.SelectedSheets.Visible = False

シート名 = 親フォーム.Controls("Label" & 4 + i).Caption If Worksheets("完待ち" & シート名).Visible = False Then Worksheets("完待ち" & シート名).Visible = True Sheets("完待ち" & シート名).Select If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilterMode = False 'オートフィルタを解除する Range("a1").AutoFilter Field:=32, Criteria1:="<>" & Worksheets("メイン").Range("b25") 'jup発行番号以外 ActiveSheet.Range("a1").AutoFilter Field:=10, Criteria1:="<5" '等級は5級より小さい ActiveSheet.Range("a1").AutoFilter Field:=5, Criteria1:="<>無" 'カード無し以外 ActiveSheet.Range("a1").AutoFilter Field:=6, Criteria1:="<>◎" '入力済み以外 n数 = Range("a1").CurrentRegion.Columns(1).SpecialCells(xlCellTypeVisible).Count - 1 If n数 = 0 Then MsgBox "完了入力待ちの明細はありません。" Worksheets("完待ち" & シート名).Visible = False Sheets("メイン").Select Range("n9").Select Exit Sub End If If n数 >= 121 Then MsgBox "データ数が120件を超えたので120件で打ち切りました" n数 = 120 End If ReDim gyou(n数) 'フィルター後のエクセルが持つ行数を格納する i = 1 '1番上をフィールド名(項目行)だとしたら Set Rng = Range("d2", Range("d2").End(xlDown)).SpecialCells(xlCellTypeVisible) For Each c In Rng.Cells If c = "" Then Exit For If i = 121 Then Exit For If c.Row <> 1 Then Sheets("条件").Cells(i + 1, 40) = c.Row '可視セルの行番号を格納する Sheets("条件").Cells(i + 1, 41) = Cells(c.Row, 4) '検番格納 gyou(i) = c.Row i = i + 1 End If Next For i = 1 To n数 Select Case i Case Is <= 60 新子フォーム.Controls("Label" & i).Caption = Cells(gyou(i), 4) Case Is >= 61 新子次頁フォーム.Controls("Label" & i - 60).Caption = Cells(gyou(i), 4) End Select Next i If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilterMode = False 'オートフィルタを解除する 新子フォーム.Label142.Caption = n数 新子フォーム.Caption = "完待ち" & シート名 Unload Me '親フォームを閉じる 新子フォーム.Show '⇒新子フォームが表示された後にエラーとなります! Exit Sub '子フォームからここに戻ります

er: msg = "親フォーム内でエラー発生!担当者に連絡して下さい。"
End Sub
###試したこと
初心者ですのでありません。
親フォームを表示する前に全てのエクセルファイルの上書きを行ってとりあえずの対策としております。

###補足情報(言語/FW/ツール等のバージョンなど)
このソフトは自宅のエクセル2016や会社のエクセル2007で開発しました。
最近、会社はエクセル2010に更新されました。感覚的にですがエラー発生頻度が多くなった感じは受けております。

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

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

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

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

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

guest

回答3

0

Showのデフォルトはモーダルですから、親フォームが必要な気がします。
その親フォームがUnloadされているので発生しているのではと推察しますが、簡単なコードを書いてみても発生しないんですよね。
フォームの規模などによる動作タイミングかもしれません。

上記仮説が正しいとして対処案を2つ提示してみます。お試しください。

1.親フォームをUnloadしない

VBA

1Me.Hide '親フォームを非表示 2新子フォーム.Show 3Unload Me '親フォームを閉じる 4Exit Sub

アンロードしなければ親子関係を保ったままになる。

2.子フォームをモードレスにする

VBA

1Unload Me '親フォームを閉じる 2新子フォーム.Show vbModeless 3Exit Sub

モードレスにすることで親に依存しない構成にする。

投稿2017/10/11 06:26

ttyp03

総合スコア16998

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

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

genki55

2017/10/12 05:26

ttyp03様 お世話になります。 さっそく明日にでも試してみます、ありがとうございます。
genki55

2017/10/15 04:43

ttyp03様 お世話になります。 1の親フォームをアンロードしないでエラーが出たとの報告がありました。一部、今までのエラー表示画面コピーと異なる点があるようなので明日から私が操作して確認いたします。 NGなら2番を実施いたします。
ttyp03

2017/10/15 23:39

2番での確認お願いします。 しかし1番でも解決できなかったとなると、そもそも原因が別の可能性があります。 また状況をお知らせください。
genki55

2017/10/17 11:09

2番のモードレス状態で正常に子フォームが表示され、OPボタンをクリックし入力ボタンを押すと「シートを削除するか?データが残っている可能性が有る・・」等無関係と思われるMSG-BOXが表示されました。 現在は元の状態に戻して使用しております。 ほぼ同じ作りの別のソフトは問題なく動いております。新たに簡素化する方向で作り直すべきでしょうか?
ttyp03

2017/10/18 01:56

当てが外れたようで申し訳ないです。 イベントの発生順番を確認してみたところ、親フォームから新子フォームを触ったタイミング(提示のコードではLabelNのCaptionを設定している箇所)で新子フォーム側のInitializeイベントが発生します。 その他、処理中にUnload Meもしているので、イベントが多数発生していると考えられます。 なので処理順としては次のようになっていると推測します。 CommandButton1_Click():開始 CommandButton1_Click():最初のLabelN設定 新子フォーム.Initialize():イベント処理 CommandButton1_Click():復帰してLabelN処理以降継続 CommandButton1_Click():自フォーム閉じる 自フォーム.Terminate():イベント発生 CommandButton1_Click():新子フォーム表示(Show) 新子フォーム.Activate():イベント発生 それぞれのイベントの中で、そのイベントのタイミングでは存在しないはずのオブジェクトを参照したりしていないでしょうか。 流れを良く把握して動作を確認してみてください。
guest

0

処理が必ずシリアル(直列)で実行される保証はないので、実行順序のような気がします。

以下の様に順序を変更したら、改善されないでしょうか。

VBA

1 DoEvents 2 新子フォーム.Show 3 DoEvents 4 Unload Me '親フォームを閉じる

※DoEventsはOSに制御を戻すコマンドです。他にもイベント処理が実装されている場合には、DoEventsを行うことにより、他のイベント処理の実行順序が変更されエラーとなる場合があります。
最初は、DoEvents無しで、順序だけ変更されてみて下さい。

投稿2017/09/25 01:09

編集2017/09/25 01:32
sazi

総合スコア25184

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

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

genki55

2017/09/27 09:37

sazi様 お世話になっております。 最初にトライしましたDoEvents無しでは同様のエラーが発生いたしました。 DoEventsを挿入して確認中です。 勤務の都合で返信は明後日になります、ご了承ください。
genki55

2017/09/30 08:59

sazi様 お世話になっております。 DoEventsを挿入して動きをみました。その結果以前より前で同一エラー番号で異常終了するようになりました。標準モジュールから親フォーム表示(子フォームに表示する内容を編集している)のフォームモジュールで発生しました。とりあえず最初の状態に戻して使用しております。つ 次のアドバイスがありましたらお願いをいたします。
sazi

2017/09/30 13:54

DoEventsを行うのは、動作を安定させる意味もあります。 Doeventsを行った状態でエラーとなっているというのは、Doevents行わない状態ではエラーになる可能性があるという状態ですので、そのエラーとなった箇所もタイミングが起因してるのでは無いかと考えられます。 そのエラー箇所でもDoeventsを行い、逐次同様な対応をおこなってみてはどうでしょうか。 色々なイベント処理にコードを分散させると、実行順序による隠れた問題を含みやすいです。 チェックやデータ処理などを実行ボタンなどの一か所に処理を纏めるというのは良く使う方法です。
genki55

2017/10/11 04:51

sazi様 お世話になっております。 標準モジュール内の親フォーム表示の前に DoEvents を挿入しましたらそこで同様のエラー番号が発生する場合がありました。私はてっきり子フォームの何かが起因していると思いこんでおりましたので、そうでは無いことが分り一歩進んだなと感じております。
sazi

2017/10/11 05:05

処理を行うのに問題の無い状態であれば、 on error resume next として、エラー自体はスキップする方法もあります。
genki55

2017/10/15 04:46

sazi様 お世話になります。 このエラー時は on error resume next を挿入してもいずれエクセルファイル全体が強制的に全閉にされてしまいます。再立ち上げがわずらわしくなんとかしたいとの思いです。 よろしくお願いします。
guest

0

アドイン起因のエラーと思います。
”ファイル”・”オプション”・”アドイン”を選択して、”分析ツール”と”分析ツール VBA"を無効にして試してみてください。

投稿2017/09/25 00:55

MasahikoHirata

総合スコア3747

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

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

genki55

2017/09/26 10:02

Hirata様 早速の回答をいただきまして感謝、感謝の感激です。 まさか返信があるとは思ってもみませんでしたので本当に感激です。 さて、ご指摘いただいた二点ですが元々無効になっておりました。そこで二点を有効にして試してみましたが 約10回目程度に同様のエラー番号で異常終了してしまいました。 次に考えられる対応策が御座いましたらご教授のほどよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問