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

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

ただいまの
回答率

90.62%

  • VBA

    1730questions

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

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

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,966

genki55

score 2

前提・実現したいこと

エクセルマクロを使い標準モジュールから親フォームを表示させ、親フォームでは子フォームに表示する詳細データを選択させて編集後に子フォームを表示しております。
尚、子フォームは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に更新されました。感覚的にですがエラー発生頻度が多くなった感じは受けております。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/26 19:02

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

    キャンセル

0

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

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

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/27 18:37

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

    キャンセル

  • 2017/09/30 17:59

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

    キャンセル

  • 2017/09/30 22:54

    DoEventsを行うのは、動作を安定させる意味もあります。
    Doeventsを行った状態でエラーとなっているというのは、Doevents行わない状態ではエラーになる可能性があるという状態ですので、そのエラーとなった箇所もタイミングが起因してるのでは無いかと考えられます。
    そのエラー箇所でもDoeventsを行い、逐次同様な対応をおこなってみてはどうでしょうか。

    色々なイベント処理にコードを分散させると、実行順序による隠れた問題を含みやすいです。
    チェックやデータ処理などを実行ボタンなどの一か所に処理を纏めるというのは良く使う方法です。

    キャンセル

  • 2017/10/11 13:51

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

    キャンセル

  • 2017/10/11 14:05

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

    キャンセル

  • 2017/10/15 13:46

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

    キャンセル

0

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

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

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

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


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

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

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/12 14:26

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

    キャンセル

  • 2017/10/15 13:43

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

    キャンセル

  • 2017/10/16 08:39

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

    キャンセル

  • 2017/10/17 20:09

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

    キャンセル

  • 2017/10/18 10:56

    当てが外れたようで申し訳ないです。

    イベントの発生順番を確認してみたところ、親フォームから新子フォームを触ったタイミング(提示のコードではLabelNのCaptionを設定している箇所)で新子フォーム側のInitializeイベントが発生します。
    その他、処理中にUnload Meもしているので、イベントが多数発生していると考えられます。
    なので処理順としては次のようになっていると推測します。

    CommandButton1_Click():開始
    CommandButton1_Click():最初のLabelN設定
    新子フォーム.Initialize():イベント処理
    CommandButton1_Click():復帰してLabelN処理以降継続
    CommandButton1_Click():自フォーム閉じる
    自フォーム.Terminate():イベント発生
    CommandButton1_Click():新子フォーム表示(Show)
    新子フォーム.Activate():イベント発生

    それぞれのイベントの中で、そのイベントのタイミングでは存在しないはずのオブジェクトを参照したりしていないでしょうか。
    流れを良く把握して動作を確認してみてください。

    キャンセル

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

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VBA

    1730questions

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