Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Microsoft 365)
入力中、50件を超えた辺りで実行時エラーで停まってしまう
投稿日時: 24/02/09 00:54:06
投稿者: FANTA66

お世話になります。皆様。正常に動作しているマクロが突然エラーで停まってしまいます。
以下をお読みいただき、是非、修正方法を教えてください。よろしくお願いいたします。
 
【動作概要】●Excel365でデータ入力用フォームを作成して会員入力を実行
 フォームのテキストボックスに会員番号を入力。
 別シート(M)から会員番号が一致した氏名・カナ・電話番号を呼び出す。
 呼び出した氏名などをフォームのテキストボックスにあてはめ、
 追加事項として※座席番号と併せて入力し登録を繰り返す。
 ※座席番号とは、枚数、階数、列数、席番号。
【シートの詳細】
 シート(M):呼び出し基の会員データ
   補足:最初は約47,000件ありましたが、Excelにインポートする前に最小限に絞り約8,000件。
   絞った理由:不具合点Eのエラーでメモリ不足を指摘されたため最小限にした。
         結果は変わりませんでした。(詳細は【不具合点】を参照)
 ワークシート:入力済データを保管、入力結果を入力フォーム上に設置したリストボックスで表示。
【不具合点】
 @順調に入力を進められるが50件を超過した辺りでエラーが発生する。但し、しない場合もある。
 A1回目のエラー:実行時エラー −2147417848(80010108) オートメーションエラー
 BExcelを強制終了後、データ救出し入力を継続。
 C2回目のエラー:実行時エラー'1004' アプリケーション定義またはオブジェクト定義のエラー
 DBと同様の救出作業。その後、入力を継続。
 E3回目のエラー:実行時エラー'7' メモリが不足しています。
 結果、動作不安定となってしまう。
 
【エラーで停まる箇所】詳細は以下のマクロをご参照くださいる
 Set myKekka = 〜 の行でストップします。
 
【修正したい点】
 50件以上のデータで多発してしまう不具合を解消したい。
 
【VBAコード】以下にコードを記します。
 
 Private Sub btn_KaiinBangou_Click()
 
 '会員番号を入力したあと漢字氏名を表示する
    Worksheets("M").Activate
    Dim 会員番号 As Long
    Dim myLastRange As Range, myKekka As Range
      
 'テキストボックス「txb_Kensaku」に会員番号が入力されているか検査する
 '未入力時は、メッセージボックスで注意を促し「txb_Kensaku」にカーソルを戻す
    If txb_KaiinNumber.Value = "" Then
        MsgBox "会員番号を入力してから、「会員番号」ボタンを押してください。"
        txb_KaiinNumber.SetFocus
    Else
        会員番号 = txb_KaiinNumber.Text
        Set myLastRange = Worksheets("M").Range("A1").End(xlDown)
        Set myKekka = Worksheets("M").Range(Worksheets("M"). _
                      Range("C2"), myLastRange).Find(what:=会員番号, lookat:=xlWhole)
            If myKekka Is Nothing Then
                MsgBox "該当する会員はいません"
                txb_KaiinNumber.Text = ""
                txb_KaiinNumber.SetFocus
            Else
                txb_Kana.Text = Cells(myKekka.Row, 2).Value
                txb_KaiinName.Text = Cells(myKekka.Row, 3).Value
                txb_tel01.Text = Cells(myKekka.Row, 4).Value
                txb_tel02.Text = Cells(myKekka.Row, 5).Value
                txb_Maisu.Text = Cells(myKekka.Row, 6).Value
                Me.txb_Maisu.SetFocus
            End If
    End If
 End Sub
 
以上です。なにとぞよろしくご指導をいただけますようお願いいたします。
FANTA

回答
投稿日時: 24/02/09 09:13:47
投稿者: simple

拝見する限りでは、そのプロシージャーのコードの問題ではなく、
Excelの内部処理に関するものだと思われます。
 
「Excel −2147417848(80010108) オートメーションエラー」などで検索すると
いくつか類似現象は報告されているようです。
ただ、原因は単一ではなく、色々と複合的な条件下で発生するようです。
ユーザー側で解決できる問題ではなさそうでうね。
 
他の方から有効な対応策が提示されれば結構ですが、そうでなければ、
Microsoft社運営の質問掲示板で質問するとか、直接M社に照会するとかされたらいかがですか。
 
ちなみに、
・Mシートを特定したりしなかったりするのは理由がありますか?
・会員番号検索の対象はA:C列なんですか?
  (間違って登録されている可能性への対応ですか?)
といった細かい点が気になりました。(事象には影響しないと思いますが。)

回答
投稿日時: 24/02/09 09:29:42
投稿者: QooApp

1.別途参考までにPCスペックの補完をしてもらえますでしょうか。
記載済み
 Windows 10 Pro
 Microsoft 365
不明
 メモリ
 ドライブのタイプ HDD or SSD
 CPU(i5-12000みたいな表記の)
 
2.スペック的に処理落ちしているのか判定する方法
 シートMの掲載名簿数を10件とか100件くらいにしてみてください(バックアップ取ってから)
 Find処理が重すぎるなら当該の件数を極端に減らしたときは正常に動作するはずです。
 
3.正常に動作とは

引用:
正常に動作しているマクロが突然エラー

 元々稼働していたものが最近エラーになり始めたのか、作ったは良いが動かないのか
 ・稼働していた時のPCと別PCで動かした
 ・処理を変更した
 ・何もしていない(元々稼働していた時のまま)
  等々、どのパターンか
 
4.質問
 −1.処理落ちするレベルなら、
    画面更新を停止することで余計なメモリを食わずに済ませることも考えられます。
    Application.ScreenUpdating = False を調べてみてください
 
 −2.本当に処理落ちなのか
    オートメーションエラーの指摘はsimpleさんが書き込まれていたので同上
 
 −3.ソースコードを1行ずつ実行してみてください。
    ソースコードを表示した状態で、
    ブレークポイントをWorksheets("M").Activateの行あたりに設定してください。
    その後、VBを本来の実行方法で起動してください。
    検索のボタンを押すとブレークポイントのところでいったん止まります。
    その後F8キーを押すごとに1行ずつ実行されます。
    Set myKekka〜の箇所まで問題ないことを確認してください。
    ※やり方がわからなければ「VBA ブレークポイント 使い方」で調べてみてください
 
5.コードの変数定義などに少し心配があります ※元のエラーとは関係ないです。
 ・Dim 会員番号 As Longと数値型で定義してありますが、
  空欄かどうかしか判定していないので文字が入力された状態で実行が通りそうです。
  当然、型が違うので代入エラーが想定されます。
  型キャストという方法を調べてみてください。
 
6.提案
 FindがダメならFor文使うとかの方法に変えてみては
 開始行と終了行の番号が現時点で把握できているので
For i = 開始行 to 終了行
    If( Worksheet(M).Cells.(i,列番号A列なら1).Value = 探したい番号) Then
        変数に一致結果の値を格納する処理
        ※ForからExit Forで脱出してもよい
        この時、iに行番号が入っているので同行の別列もCells(i,2)とかで取得できます
    Endif
next i

 提案理由:取得したいデータは1件なので、
      1万件データがあろうがなかろうがフリーズする時間と
      Findで処理する時間の差は埋まるのではと思います。

回答
投稿日時: 24/02/09 09:47:40
投稿者: Suzu

コードの組み立て自体に問題は無いと思われます。
 
ただ、ある特定の動作の場合、問題が発生する事がある。
 
何も知らない人からしたら、「不具合だー」と言っても過言では無い様な事が
改善されず、顕在的に残っている事もあります。
 
FIND も そんな事があります。
引数を省略すると、前回使用した引数が暗黙のうちに使用されたり
繰り返し使用する際に エラーが発生し易かったり・・
 
 
VBAのFindメソッドの使い方には注意が必要です
https://excel-ubara.com/excelvba4/EXCEL225.html
 
もご参考にどうぞ。

回答
投稿日時: 24/02/09 09:55:20
投稿者: Suzu

コードで気づいた点。
 
 
 Private Sub btn_KaiinBangou_Click()
  
 '会員番号を入力したあと漢字氏名を表示する
    Worksheets("M").Activate
    Dim 会員番号 As Long
    Dim myLastRange As Range, myKekka As Range
       
 'テキストボックス「txb_Kensaku」に会員番号が入力されているか検査する
 '未入力時は、メッセージボックスで注意を促し「txb_Kensaku」にカーソルを戻す
    If txb_KaiinNumber.Value = "" Then
        MsgBox "会員番号を入力してから、「会員番号」ボタンを押してください。"
        txb_KaiinNumber.SetFocus
    Else

        会員番号 = txb_KaiinNumber.Text

引用:
Dim 会員番号 As Long

 
txb_KaiinNumber は、テキストボックスですよね。
それは、入力規則等で、数値に限定しているのでしょうか?
入力数値の桁数も含め、データ型 Long 限定で大丈夫でしょうか?
 
 
 
引用:
Set myLastRange = Worksheets("M").Range("A1").End(xlDown)
        Set myKekka = Worksheets("M").Range(Worksheets("M"). _
                      Range("C2"), myLastRange).Find(what:=会員番号, lookat:=xlWhole)

 
まぁ、やりたい事は判るのですが
myLastRange を オブジェクト変数として宣言する必要はありません。
 
  Dim myLastRow As Long
 Set myKekka = Worksheets("M").Range("A1","C" & myLastRow).Find(what:=会員番号, lookat:=xlWhole)
 
で良いのでは?
 
ここを、Match 使った方が。。ですが。
 
 
 
 
引用:
Else
                txb_Kana.Text = Cells(myKekka.Row, 2).Value
                txb_KaiinName.Text = Cells(myKekka.Row, 3).Value
                txb_tel01.Text = Cells(myKekka.Row, 4).Value
                txb_tel02.Text = Cells(myKekka.Row, 5).Value
                txb_Maisu.Text = Cells(myKekka.Row, 6).Value
                Me.txb_Maisu.SetFocus
            End If

 
ここも
他は上位オブジェクトから指定しているのに、Cellsから始まるのが気になります。
Withを使っても良いでしょう。
 
また、使うのは、Rowだけなのであれば、先に変数にRow の値を受け、その変数を指定します。

回答
投稿日時: 24/02/09 10:04:20
投稿者: QooApp

追記
 1.ワークシートMをいったんCSVで書き出して保存できますでしょうか。
   オートメーションエラーの原因が
   Excelファイルそのものの内部的な破損の疑いがあることがあるようです。
 
   ・ワークシートMのページを表示して名前を付けて保存を実行
   ・保存先と名前を指定
   ・保存拡張子をCSV(UTF-8)で保存実行
   ・VBAとウィンドウレイアウトを丸ごと別ファイルで再現してください。
    ※VBAコードはテキストをコピペで構いませんが、GUIウィンドウレイアウトは調べてみてください
   ・新規に再現したファイルに「データ」タブ
    >「テキストまたはCSVから」データ取り込み
   ・CSV指定
   ・ウィンドウにCSVの取り込み結果が出るので
    左上の「元のファイル」というドロップダウンリストから
    「65001 Unicode (UTF-8)」を選択
   ・右下の「読み込み」を実行
   ・表示された取り込み結果のシート名をVBで指定しているワークシート名に設定する
   ・VBA実行
 
   新規作成したExcelファイル(未破損状態)で
   同じ環境(ファイルコピーは破損も継承されるので不可)を再現したら
   オートメーションエラーが回避できる可能性を指摘している記事が何件かありました。
 
訂正:

引用:
If( Worksheet(M).Cells.(i,列番号A列なら1).Value = 探したい番号) Then

 正しくは
If( Worksheets(M).Cells.(i,列番号A列なら1).Value = 探したい番号) Then

 でした。

回答
投稿日時: 24/02/09 10:24:07
投稿者: WinArrow

他の回答者と重複するかもしれませんが、
エラーの原因の特定するとは無いと思いますが・・・・

引用:

       Set myKekka = Worksheets("M").Range(Worksheets("M"). _
                      Range("C2"), myLastRange).Find(what:=会員番号, lookat:=xlWhole)

この時の検索範囲は、A2から始まります。
そして、A列を検索します。
ここは、理解していますか?
 
なぜ、検索範囲の先頭セルが、C2なんですか?
それと、検索範囲にC列まで含める必要があるのか?
 
仮にA列のデータが数値ではなく、文字列でも、検索結果は同じになるようですね・・・

回答
投稿日時: 24/02/09 10:42:34
投稿者: WinArrow

FINDの代わりにMATCHを使ってみてください。
 
参考:代案コード

    On Error Resume Next
    myROW = WorksheetFunction.Match(会員番号, Columns("A"), 0)
    If Err.Number <> 0 Then
        'アンマッチエラー
    Else
'     正常処理
    End If
    On Error GoTo 0

回答
投稿日時: 24/02/09 15:07:05
投稿者: WinArrow

以前、オートメーションエラーは経験しました。エラー番号までは覚えていま\。
 
掲示のプロシジャではなく、ユーザーフォームの操作に関連していたと記憶しています。

回答
投稿日時: 24/02/09 17:31:26
投稿者: 竹ちゃん

これはもう間違いなくExcelもしくはOSの問題。
 
なので、コードをいくらいじってもダメ。
 
私も2週間前ぐらいから10回以上マクロが破壊されている。今日も2回破壊された。
エラーも色んな種類がでるけど、その中でも「オートメーションエラー」は定番。
これはまだいい方で、VBEでコードが全く見えなったりもする。
 
でも、Excelに「開いて修復する」っていうのがあるから、これを使えば元に戻る。
実際に実行するマクロが入っているXLSMだけでなく、途中マクロでオープンするXLSMがあるのであれば、全て「開いて修復する」しておくのが吉。
 
こうなるとマイクロソフトのアップデートを待つより仕方ない。
ということで、今の私は「はいはい、また壊れちゃったか〜」ぐらいの余裕の境地になってる。
そうなるのも問題ではあるが・・・。
 
成功を祈る!

投稿日時: 24/02/10 14:17:54
投稿者: FANTA66

皆様!!細かいご指導とご指摘をありがとうございます。ひと通り拝見いたしました。各所のご質問はコードを確認してゆき回答いたします。少しお時間をくださいませ。FANTA66

投稿日時: 24/02/10 14:37:05
投稿者: FANTA66

simple様 ありがとうございます。
まず
・Mシートを特定したりしなかったりするのは理由がありますか?
 回答 Mシートには会員番号、氏名、氏名カナ、電話番号1、電話番号2のデータがあります。
    フォーム上のテキストボックスに入力する会員番号と一致するデータの氏名etcを
    フォーム上のtxb_KaiinName etcに表示していますので、呼び出す際に指定しているつもりです。
 
・会員番号検索の対象はA:C列なんですか?
 回答 シートMにある必要な列を範囲指定しているつもりです。
    シートMにあるA列=会員番号 B列=氏名カナ    C列=氏名漢字 です。
    本来はD=電話番号1 E=電話番号2 があってA:Eと表記していましたが、
    エラー発生の原因がシートMに関連しそうだと判断して仮にA:Cとしています。
    また、現在は「Set myKekka=」で停まるのでDとEは表示を拾えないだけなら問題ないと
    考えたためです。
 
また、ご教授いただいた通り、同様の事例が発生してる模様もあるのでMicrosoft側に起因する事
かもしれない。と考えたりもしています。
 
以上が返信です。引き続きよろしくお願いいたします。FANTA66
 

投稿日時: 24/02/10 15:23:33
投稿者: FANTA66

QooApp様 ありがとうございます。
以下にご質問いただいたあとに回答を書き込みます。
よろしくお願いいたします。
 
"]1.別途参考までにPCスペックの補完をしてもらえますでしょうか。
記載済み
 Windows 10 Pro はい。Windows10Proです。 
 Microsoft 365  はい。Microsoft365です。
不明
 メモリ 社のクライアントでうろ覚えですが16GBだったと思います
 ドライブのタイプ HDD or SSD HDDです。
 CPU(i5-12000みたいな表記の)CPUはCOREi5までは記憶していますがあらためて確認いたします。
 
2.スペック的に処理落ちしているのか判定する方法
 シートMの掲載名簿数を10件とか100件くらいにしてみてください(バックアップ取ってから)
 Find処理が重すぎるなら当該の件数を極端に減らしたときは正常に動作するはずです。
 回答 20件にデータを削減し試みました。結果、データの繰り返し利用で50件超えで良好。
    100件超でも良好。でしたが、数回繰り返すうちに52件で停まるようになりました。
    また、それも承知の上でテスト入力を繰り返し、エラー発生時にWindows再起動をしたりも
    試みました。でも、一度エラーを起こすとVBAが壊れる事がありました(画面白くなります)
 
3.正常に動作とは

引用:
正常に動作しているマクロが突然エラー

 元々稼働していたものが最近エラーになり始めたのか、作ったは良いが動かないのか
 回答 元々は30件ほどのデータ入力しかありませんでした。そのときは正常でした。
    だいたい52件でエラー発生となります。ただ、60件超え、110件の入力も正常に終了した例も
    ありました。
 ・稼働していた時のPCと別PCで動かした 回答 社で私は2台。あと二人が使用しています。
                    補足 50件未満のデータ数でエラーは起こりません・・。
                       なぜかわかりません。
 ・処理を変更した 
 ・何もしていない(元々稼働していた時のまま)
  等々、どのパターンか
  回答 基本的に50件未満で正常動作するので変更はしていません。
     しかしこのエラー発覚後にテストで
     コピーをとった別ExcelでOn Error GoToを入れてエラー対策も試みました。
     この場合はそのエラー処理で停止してしまいます。
     (ワークシートからデータ保存用シートにまとめる際にエラー停止します)
 
4.質問
 −1.処理落ちするレベルなら、
    画面更新を停止することで余計なメモリを食わずに済ませることも考えられます。
    Application.ScreenUpdating = False を調べてみてください
  回答 Application.ScreenUpdating = Falseでの更新は特に記述していませんが、
     画面更新は実施しています。この辺りがいけないのでしょうか・・教えてくださいませ。
     
     今は会員一名を入力するたびに登録しています。
     結果をフォーム上のリストに反映するためです。
     UserForm_Initialize上で並び順を降順にする指示を入れています。
     最新入力データがすぐに視認できるよう、リスト内を降順に表示させたいためです。
     
     これはまずいのでしょうか・・。この点、ご教示いただけると幸いです。
 
 −2.本当に処理落ちなのか
    オートメーションエラーの指摘はsimpleさんが書き込まれていたので同上
    回答 考えられる点ですね。
 
 −3.ソースコードを1行ずつ実行してみてください。
    ソースコードを表示した状態で、
    ブレークポイントをWorksheets("M").Activateの行あたりに設定してください。
    その後、VBを本来の実行方法で起動してください。
    検索のボタンを押すとブレークポイントのところでいったん止まります。
    その後F8キーを押すごとに1行ずつ実行されます。
    Set myKekka〜の箇所まで問題ないことを確認してください。
    ※やり方がわからなければ「VBA ブレークポイント 使い方」で調べてみてください
    回答 f9 f8は試みました。停止する行の会員番号など変数の値はあっています。
 
5.コードの変数定義などに少し心配があります ※元のエラーとは関係ないです。
 ・Dim 会員番号 As Longと数値型で定義してありますが、
  空欄かどうかしか判定していないので文字が入力された状態で実行が通りそうです。
  当然、型が違うので代入エラーが想定されます。
  型キャストという方法を調べてみてください。
  回答 恐れ入りますが、If txb_KaiinNumber.Value = "" Then で空欄の判定は行っています。
     番号は数値の入力だけです。
     テキストボックスにコードで0-9に規制、IMEを3-fmIMEModeDisableにて設定しております。
 
6.提案
 FindがダメならFor文使うとかの方法に変えてみては
 開始行と終了行の番号が現時点で把握できているので
For i = 開始行 to 終了行
    If( Worksheet(M).Cells.(i,列番号A列なら1).Value = 探したい番号) Then
        変数に一致結果の値を格納する処理
        ※ForからExit Forで脱出してもよい
        この時、iに行番号が入っているので同行の別列もCells(i,2)とかで取得できます
    Endif
next i

 提案理由:取得したいデータは1件なので、
      1万件データがあろうがなかろうがフリーズする時間と
      Findで処理する時間の差は埋まるのではと思います。[/quote]
  
  回答 ご教授ありがとうございます。是非、試させていただきたいと思います。
 
以上でございます。引き続きよろしくお願いいたします。FANTA66

投稿日時: 24/02/10 15:28:24
投稿者: FANTA66

Suzu様 ありがとうございます。
リンクでいただいたFindについては後程拝見いたします。
今回は先の方々にもご報告したのですが、30件ほどの入力時には問題なくて
50件超えたら、急に問題発覚したり、問題が起こらず作業完了したり・・。と
使用者から不審な目を向けられて困惑しているところです。
 
引き続きよろしくお願いいたします。FANTA66

投稿日時: 24/02/10 15:37:10
投稿者: FANTA66

Suzu様 先程に続きありがとうございます。
お気づきの点を追加していただき本当にすみません。
 

Suzu さんの引用:
コードで気づいた点。
 
 
 Private Sub btn_KaiinBangou_Click()
  
 '会員番号を入力したあと漢字氏名を表示する
    Worksheets("M").Activate
    Dim 会員番号 As Long
    Dim myLastRange As Range, myKekka As Range
       
 'テキストボックス「txb_Kensaku」に会員番号が入力されているか検査する
 '未入力時は、メッセージボックスで注意を促し「txb_Kensaku」にカーソルを戻す
    If txb_KaiinNumber.Value = "" Then
        MsgBox "会員番号を入力してから、「会員番号」ボタンを押してください。"
        txb_KaiinNumber.SetFocus
    Else
        会員番号 = txb_KaiinNumber.Text

引用:
Dim 会員番号 As Long

 
txb_KaiinNumber は、テキストボックスですよね。
それは、入力規則等で、数値に限定しているのでしょうか?
入力数値の桁数も含め、データ型 Long 限定で大丈夫でしょうか?
 
回答 このテキストボックス自体にIMEの入力規制を3にし、コードで0-9で指定しているので
   大丈夫かと考えております。
 
引用:
Set myLastRange = Worksheets("M").Range("A1").End(xlDown)
        Set myKekka = Worksheets("M").Range(Worksheets("M"). _
                      Range("C2"), myLastRange).Find(what:=会員番号, lookat:=xlWhole)

 
まぁ、やりたい事は判るのですが
myLastRange を オブジェクト変数として宣言する必要はありません。
 
  Dim myLastRow As Long
 Set myKekka = Worksheets("M").Range("A1","C" & myLastRow).Find(what:=会員番号, lookat:=xlWhole)
 
で良いのでは?
 
ここを、Match 使った方が。。ですが。
 
回答 ありがとうございます。Matchですね。Matchに変更してみます。
   Matchは未使用ですので勉強して参ります。💦
 
 
引用:
Else
                txb_Kana.Text = Cells(myKekka.Row, 2).Value
                txb_KaiinName.Text = Cells(myKekka.Row, 3).Value
                txb_tel01.Text = Cells(myKekka.Row, 4).Value
                txb_tel02.Text = Cells(myKekka.Row, 5).Value
                txb_Maisu.Text = Cells(myKekka.Row, 6).Value
                Me.txb_Maisu.SetFocus
            End If

 
ここも
他は上位オブジェクトから指定しているのに、Cellsから始まるのが気になります。
Withを使っても良いでしょう。
 
回答 With・・そうですね気付かずにおりました。確かにまとめる事ができますね。
 
また、使うのは、Rowだけなのであれば、先に変数にRow の値を受け、その変数を指定します。

 
ありがとうございます。引き続きよろしくお願いいたします。FANTA66

投稿日時: 24/02/10 15:46:17
投稿者: FANTA66

QooApp様 追記をありがとうございます。
CSVへの書き出し・・などについては試してみます。
 
今までは基となるExcelのバージョンを残しておりますので、
Excelファイルごとコピーして機能テストを試みましたが、
破損も継承されてしまうのですね・・・。それはしりませんでした。困りました💦
VBAもエクスポートではなく桜エディタにコピペして動作環境を整えてから試してみます。
 
ありがとうございました。引き続きよろしくお願いいたします。FANTA66
 

投稿日時: 24/02/10 16:01:59
投稿者: FANTA66

WinArrow様 ありがとうございます。
以下に回答を書き込みして参ります。よろしくお願いいたします。
 

WinArrow さんの引用:
他の回答者と重複するかもしれませんが、
エラーの原因の特定するとは無いと思いますが・・・・
引用:

       Set myKekka = Worksheets("M").Range(Worksheets("M"). _
                      Range("C2"), myLastRange).Find(what:=会員番号, lookat:=xlWhole)

この時の検索範囲は、A2から始まります。
そして、A列を検索します。
ここは、理解していますか?
回答 ごめんなさい。誤っていたら教えてください。
   以下の考えでコードを記述しておりますがご教授ください。
   @A2からの検索範囲で良いと考えております。
    A1列からC1列は項目行としております。項目行も実際には不必要と考えておりますが・・。
   AA列の検索で良いと考えております。
    会員番号の値がA列にあります。
なぜ、検索範囲の先頭セルが、C2なんですか?
それと、検索範囲にC列まで含める必要があるのか?
回答 上記同様に間違っていたら教えてください。
   @A検索範囲の先頭はC2で項目行のC1を省いているつもりです。
     また、A列からC列、行番号2からEndRowまでを範囲と考えております。
     本来の列範囲はAtoEなのですが、
     メモリ不足がこのエラーの原因かも・・と考えて少し範囲を縮めて考えているところです。
     従いまして、本来、範囲として考えているのは
     D列に電話番号1、E列に電話番号2が存在してます。
 
 
仮にA列のデータが数値ではなく、文字列でも、検索結果は同じになるようですね・・・
回答 A列に数値以外はございません。会員番号を入力するフォーム上でも数値に限定しております。
 
以上です。私はVBAが好きになり社内便利屋のような形で日々勉強(偉そうに言えませんが💦)
自作しております。引き続きよろしくお願いいたします。FANTA66
 

投稿日時: 24/02/10 16:06:55
投稿者: FANTA66

WinArrow様 追記をありがとうございます。
回答 Matchですね。先程、Suzu様からもご教授いただきましたMatchですね。
   このコードは使用した事がないので勉強したいと思います。
   以下に記述例をいただきありがとうございます。
   動作確認を試みてみます。
 
ありがとうございます。引き続きよろしくお願いいたします。FANTA66

投稿日時: 24/02/10 16:10:40
投稿者: FANTA66

WinArrow様
重ねての追記をありがとうございます。
エラーは調べてみても明確な答えが見つからず難解だと思います。
フォーム上の可能性も十分にあるのかと思います。
なにしろ、記述したコードで停まるので、動作上の不具合は
そのコードにあるのかと考えてします。
 
何か思い出された事がございましたら、また、教えてください。
引き続きよろしくお願いいたします。FANTA66

投稿日時: 24/02/10 16:23:30
投稿者: FANTA66

竹ちゃん様 ありがとうございます。
 
いただいたエールに感謝いたします。実際のところ、修復に半月ほどかけております。
が。進展が見られません。
なにしろ、記述したコードで難なく動作する場合も多々あるものですから。
 
ほとほと困り果てて、いつも参考にさせていただいているこちらに伺っているところです。
おっしゃるようにVBAエディタすら開かなくなつた事もありました。
やがて、画面が白くなり、Excelのこのプログラム自体が起動しなくなります。
その場合は基となるバージョンを使い振り出しに戻って修復しておりました。
もちろん、エラーバージョンはごみ箱にも入れず直行で削除します。
 
開いて修復 というのは試した事はありませんが、
どうやらエラー修復にも可不可があるようですね・・。
 
愚痴になってしまいました。ありがとうございました。
引き続きよろしくお願いいたします。FANTA66

回答
投稿日時: 24/02/10 19:13:07
投稿者: Suzu

経験則ですが、
・オートメーションエラーが件数が多い場合に発生
・メモリエラーも発生
 
については、無理と言うか、もっとメモリーを消費せずに処理できるであろうタスクを
ゴリゴリの力技で処理しようとした場合に発生します。コピペの繰り返しなんかは目もあてられません。
 
 
今回の提示されたコードだけではなく、記載されていない部分にも原因が潜在していると思われます。
 
ユーザーフォームを使っている場合、ユーザーフォーム自体に ゴミ と言いますか
不具合の原因になりうる設定が残っており、
それが、悪さをして アプリケーションエラーを起こす事もあります。
この場合は、新規ブックにユーザーフォームをインポートでエラーが発生しなくなる事も。
最悪、新たに作成し、コードをコピペすれば発生しなくなる事もあります。
 
Excel 32bit なら、64bit に変えればメモリ不足からは解放される可能性もありますね。
 
 
「インポート」とひとことで済ませていますが、その手法はどの様な方法でしょうか?
インポートと言うからには、もともと 存在するシートのデータを消してインポートしているのでは?
ではどうやって消しています?
不要なセルの書式設定等のデータが残っていたりしませんか?
 
データの取り込みに際しても、1セルづつ書き込んだりしていませんか?
 
行数・列数、各セルの文字数にも拠るでしょうが、
・CSV を Excel で開いた際のメモリの使用量の増加分
・同じCSVファイルについて、インポート処理を行う前と行った後の メモリ使用量の増加分
を比べてみてください。
 
後者の方が、とても大きくないですか?
あまり変わりないのであれば、Excel では荷が重いのかもしれません。
データベース(Accessや、SQLServer、Oracle)等を検討する必要があるのでしょう。
 
 
いろんな処理を進める前に、インポート後に Save を行う事で メモリ開放される事もあります。
 
 
今回の処理は、ボタンをクリックするたびに、 myLastRange の位置を求めていますが
既存データの中から会員番号のデータをフォームに表示する処理のであれば、
myLastRange の 位置は 変わらないのでは?
 
オブジェクト変数の後始末 Set ○○ = Nothing が抜けているのも
繰り返し処理なら気になるところ。
 
 
今回の各セルの値を、1セルづつ参照しフォームに写すのではなく
行のデータを配列に代入し、フォーム表示の際には、配列から参照するだけでもメモリ節約になります。
 
 
そんな手法については、経験し覚えていく話ですが。
 
とりとめの無い書き方になってしまいましたが、
今回提示されたコードの部分ではなく、もっと全体的に見直しが必要であろうと推測します。

投稿日時: 24/02/11 14:06:00
投稿者: FANTA66

Suzu 様
 
コメントありがとうございます。
疑わしい箇所のご指摘をいただきありがとうございます。
大変参考になりありがたく思います。
 
恐縮ですが、
現段階では一度、新たなExcelに機能を移行してみようと思います。
 
ありがとうございます。取り急ぎお礼申し上げます。FANTA66

回答
投稿日時: 24/02/13 10:09:48
投稿者: 竹ちゃん

---成功を祈る!
>いただいたエールに感謝いたします。
いや、そんなことはどーでもいーので、
 
>開いて修復 というのは試した事はありませんが、
いやいやせっかく提案させてもらったのに、騙されたと思って、これを試してみてよ。
 
「開いて修復する」方法はメチャ簡単。以下のとおり。10秒もかからないから。
@[ファイル]、[開く] をクリック。
A 破損したブック(正常に動作しなくなったブック)が保存されている場所とフォルダーを選択。
B [ファイルを開く] ダイアログ ボックスで、破損したブックを選択。
C [開く] の横にある矢印をクリックし、[開いて修復] をクリック。
D修復したブックを保存。
 
私の見たては、今起こっていることは前にも言ったとおり、コードの問題ではない。
エラー発生に再現性はなく、偶発的に発生。
しかもエラー発生個所はおよそエラーになるような所ではなく、エラー内容も不可解そのもの。
コードをいじって何とかできるような類のものではなく、それで世間も騒ぎ出している(去年の12月からだから結構経過してしまったが)。
 
なので今は対処療法しかない。それが「開いて修復」。
マイクロソフトもさすがに現在鋭意取り組んでくれているはず。
 
ということでもう一回。「開いて修復する」で、
成功を祈る!

回答
投稿日時: 24/02/13 10:14:50
投稿者: QooApp

返信遅れてすみません。
回答ありがとうございます。
 
回答の返答
1.スペック的によほど作業負荷に耐えられない低スペックとは思えないので大丈夫だと思います。
  もう少し低いスペックでも本件本来なら動作して然りでしょうし、FINDに疑義がある感じでしょうね。
2.画面更新を停止する処理を現在運用済みであれば問題ないと思います。
3.少ない量で動作するとのことで、以下の提案が無関係とは思いますが一応確認程度にメモします。
  ・セルの書式が列のすべての値に対して同じ書式が適用されているか
   (特に数値縛りと文字列縛りの違いとか)
   エラーが発生するのが52件目と明示的なのが疑問が残ります。
   他のセルと値の保持仕様が違うことがあり得ないかと考えたりします
   エラーが発生する場所のセルと他セルの違いが発見できないか色々比較してみてください
※といっても基本的FINDの判定はセル内テキストを見るだけのはずなので書式由来の不具合とは思えませんが
 
4.最速で修復する方法として提案できるのはMatch使うかより単純化(For文等)するかが速いと思います。

引用:
実際のところ、修復に半月ほどかけております。
が。進展が見られません。
なにしろ、記述したコードで難なく動作する場合も多々あるものですから。
  
ほとほと困り果てて、いつも参考にさせていただいているこちらに伺っているところです。
おっしゃるようにVBAエディタすら開かなくなつた事もありました。
やがて、画面が白くなり、Excelのこのプログラム自体が起動しなくなります。
その場合は基となるバージョンを使い振り出しに戻って修復しておりました。
もちろん、エラーバージョンはごみ箱にも入れず直行で削除します。

 
業務的に不具合抱えた状態でやるのも大変でしょうから、
いったん別の処理に置き換えて後から定期的に解消できないか調べるくらいにするのが妥協点かと思います。
 
文言検索系はあまり知識がないので、
WinArrowさんから提案されているMatchを使うとか、私は思いつかないほうです。
 
ただし、高度な処理で簡便に書いて不具合を起こす場合に限っては、
低級処理で多少長文になっても動作不具合を減らす(バグを単純化する)ことは可能だと考えています。
 
Match>だめならForくらいのペースで置き換えてとりあえずの応急処置にするのが安牌になると思います。
全データが多いと伺っているので多少処理時間伸びるかもしれませんが。

回答
投稿日時: 24/02/13 10:30:42
投稿者: WinArrow

検索方法として、
「FIND」・・・現在のコード
「MATCH」・・・提案
「Firループ」
 
私の感触でいえば、
この中では、
一番遅いと思うのは「FIND」で
一番早いと思うのは、「MATCH」
「FORループ」は、考え方、コードによって、だいぶ違いがあるんで、
一概に早い/遅いは言えません。

投稿日時: 24/02/16 00:01:43
投稿者: FANTA66

皆様。詳細なご指導に感謝しております。ありがとうございます。
今週は急な出張に出ているため、いただいた内容のチェックを基に確認作業を進める事ができずにおります。
以下にいただいている内容についてお伝えしたい事をまとめさせていただきました。
試す事などは週末に出来そうです。
 
竹ちゃん様。「開いて修復する」の方法をご教授いただきありがとうございます。
      試みてみますので結果をご報告させていただきます。
      
QooApp様。 いただいた詳細について置き換えながらの応急処置などを試みます。
      一応、Matchを単体で動作確認し、その後、組み込んでみたいと思います。
      場合によってはFor〜Nextも試します。
      
WinArrow様。ご提案いただいたMatchを試してみます。
 
それとその後試した事を列記いたします。結果はNGで50件でオートメーションエラーとなります。
ただ、余計なコードが無くなったせいか入力動作も軽くなった感じはしていて・・。
もしや上手く動くか??!!と感じた矢先にエラーとなり残念です。
◆実施したこと
・新しいExcelにフォーム、部品、コードなどを記述し、動作環境に必要最小限となる環境を作成。
・ワークシートMをCSVで書き出し、書き戻しした。UTF-8
・必要なVBAコードを桜エディタにコピペし、新Excelに書き戻した。
・各変数をNothingを追加してメモリ開放した。
・Matchは書き方を勉強中。
 
皆様への連絡が滞ってしまい失礼いたしました。
引き続きよろしくお願いいたします。FANTA66

投稿日時: 24/02/26 00:39:55
投稿者: FANTA66

皆様。お世話になります。
なかなか連絡できず、時間がかかってしまいすみません。以下の@のようにMatchに変えてみました。
まず、Matchの使い方は以下で合っているでしょうか。
Findの時と同様に入力もできましたが、結果は同様、50件過ぎで停まる。でした・・・。
 
エラーで停まる箇所は、以前のようにFindの行(今回はMatch)ではなく、
フォームのデータをシートに書き込みするモジュールで発生しました。
★実行時エラー −2147417848(80010108) オートメーションエラー
 
そのモジュールはAです。下から二行目の F_Input_DataInput.Show部分 です。
表示データの並べ替えなどのためフォームを開き直しています。その部分で停まります。
また、停まったあと画面右下にクリップボードエラーが出現するようになりました・・・。
何か、根本的に考え方を変えないといけないのでしょうか。
 
以上が経過と結果です。
それでは以下の@がMatchに変えたモジュールです。
その後、Aとしてシートにデータを書き込みするモジュールを載せます。
 
 
@Matchにかえてみました
Private Sub btn_KaiinBangou_Click()
 
'会員番号を入力したあと漢字氏名を表示する
    Worksheets("M").Activate
    With Worksheets("M")
        If txb_KaiinNumber.Value = "" Then
'会員番号が入力されずに「会員番号」ボタンを押下した場合にダイアログ表示し再入力を則す
            MsgBox "会員番号を入力してから、「会員番号」ボタンを押してください。"
            txb_KaiinNumber.SetFocus
        Else
'会員番号が入力され「会員番号」ボタンを押下した結果
            Dim 会員番号 As Long
            Dim myKekka As Long
            Dim n As Long
             
            myKekka = 0
            会員番号 = txb_KaiinNumber.Text
             
            On Error Resume Next
            myKekka = WorksheetFunction.Match(会員番号, .Range("A1:A48000"), 0)
            On Error GoTo 0
             
'入力の「会員番号」が該当しない場合
            If myKekka = 0 Then
                    MsgBox "該当する会員はいません"
                    txb_KaiinNumber.Text = ""
                    txb_KaiinNumber.SetFocus
            Else
                    txb_Kana.Text = .Cells(myKekka, 2).Value '氏名カナ
                    txb_KaiinName.Text = Cells(myKekka, 3).Value '氏名漢字
                    txb_tel01.Text = Cells(myKekka, 4).Value '自宅電話番号
                    txb_tel02.Text = Cells(myKekka, 5).Value '連絡先電話番号
                    Me.txb_Maisu.SetFocus
            End If
        End If
    End With
     
    Exit Sub
End Sub
 
A以下は登録ボタンでワークシート10にフォームのデータを書き込みするプログラムです。
 動作は一会員データごとに登録しています。
◆停まる箇所は以下のモジュール内の作業後、入力フォームを開く際に発生します。
 ⇒下から二行目のF_Input_DataInput.Show部分です。
 
Private Sub btn_edit_Click()
'フォームからワークシート10にデータを移行する
    Dim LastRow As Long
        LastRow = Worksheets(10).Cells(Rows.Count, 2).End(xlUp).Row
            With Worksheets(10)
                .Cells(LastRow + 1, 1).Value = LastRow 'A列-No
                .Cells(LastRow + 1, 2).Value = Me.txb_KaiinNumber 'B-会員番号
                .Cells(LastRow + 1, 3).Value = Me.txb_Kana 'C-氏名カナ(※)
                .Cells(LastRow + 1, 4).Value = Me.txb_KaiinName 'D-氏名漢字
                .Cells(LastRow + 1, 5).Value = Me.txb_Maisu 'E-枚数
                 
                .Cells(LastRow + 1, 6).Value = Me.txb_Kaisu 'F-階数
                .Cells(LastRow + 1, 7).Value = Me.cmb_direction 'G-方角
                .Cells(LastRow + 1, 8).Value = Me.txb_Retsu 'H-列数
                .Cells(LastRow + 1, 9).Value = Me.txb_SekiBan1 'I-座席1
                .Cells(LastRow + 1, 10).Value = Me.txb_Kara 'J-〜
                 
                .Cells(LastRow + 1, 11).Value = Me.txb_SekiBan2 'K-座席2
                .Cells(LastRow + 1, 12).Value = "2" 'M-チェックボックス用
                .Cells(LastRow + 1, 13).Value = Me.txb_MsKouenName  'M-公演名
                .Cells(LastRow + 1, 14).Value = Me.txb_MstKouenbi 'N-日付
                .Cells(LastRow + 1, 15).Value = Me.txb_KouenWeekday 'O-曜日
                 
                .Cells(LastRow + 1, 16).Value = Me.cmb_Weekday 'P-祝休日
                .Cells(LastRow + 1, 17).Value = Me.txb_KaienTime 'Q-開演時間
                .Cells(LastRow + 1, 18).Value = Me.txb_tel01 'R-自宅電話番号
                .Cells(LastRow + 1, 19).Value = Me.txb_tel02 'S-連絡先電話番号
                .Cells(LastRow + 1, 20).Value = Me.txb_HaisekiBangou 'T-配席番号
                 
                .Cells(LastRow + 1, 22).Value = txb_MstNum 'V-選択マスタ番号
'入力するたびにセルに数式「YYYY/MM/DD HH:MM:SS」をセットする
                .Cells(LastRow + 1, 23).NumberFormatLocal = "YYYY/MM/DD HH:MM:SS"
                                     'W-データ作成時間
'数式に合わせた記録方法で作成時間を記録する⇒時分で昇順にすると入力順確認できる。
                .Cells(LastRow + 1, 23).Formula = Format(Now(), "YYYY/MM/DD HH:MM:SS")
                                     'W-データ作成時間
                .Cells(LastRow + 1, 24).Value = Worksheets("初期設定").Range("G2").Value                                  'リストタイトル
            '項目20個目は削除フラグで使用する
            End With
'テキストボックス会員番号は空にする
    Me.txb_KaiinNumber.Value = "" '
     
'フォーム「F_Input」を閉じる
    Unload Me
     
'ワークシート10を入力時系列で逆順にする(基準とするのはW列)
    Worksheets(10).Select
    Range("A:AC").Sort key1:=Range("W1"), order1:=xlDescending, _
    Header:=xlYes, dataoption1:=xlSortTextAsNumbers
 
'フォーム「F_Input」をリセットして開き直す
    F_Input_DataInput.Show ⇒ ここで停まります
 
 
End Sub
以上でございます。長くなりましたが、伝えたい動作をご理解いただけますよう
省かずに載せました。
なお、動作的にほぼ同件数で停まるため、別の方法を考える必要も考えた方が良いか。と
考えております。
ご教授ください。よろしくお願いいたします。FANTA66

回答
投稿日時: 24/02/26 09:17:27
投稿者: WinArrow

今回のエラーは、
「F_Input_DataInput」の初期化プロシジャ内で発生していると推測します。
ステップ実行で確認してみてください。
問題のデータ(50件目(?))の一つ前の処理内容と
問題のデータとの比較してみてはい如何でしょう?
 

回答
投稿日時: 24/02/26 11:22:31
投稿者: 竹ちゃん

結局、私が提案していた「開いて修復する」は試してみた?
状況は改善されていないみたいだけど、試してないなら、今エラーが出てるそのブックで試してみてよ。
 
もう一回言うよ。
私の見たては、今起こっていることは何回も言っているとおり、コードの問題ではない。
 
それでダメなら謝るしかないけど・・・。

投稿日時: 24/02/27 01:32:06
投稿者: FANTA66

WinArrow様。竹ちゃん様。早速のご連絡をありがとうございます。
 
いただいたことから実行したことは以下の通りです。
・「F_Input_DataInput」内をステップインでは特に異常終了はしません。
 ⇒エラーで止まるまでは実行していません。
・正常に動作し入力を実施した結果
 ⇒54件でストップしましたが、53件目は52件目までと同じく問題はないと思われます。
・違いがあるとするとエラー発生時に保存して終了すると、53件目まではシート10に保存されます。
 ⇒この場合はエラー処理でワークシート10からデータを復旧できる可能性があります。(未)
・エラー終了し保存せずに終了すると入力済データの全てが失われます。(それは当たり前のこと)
  
 
ここからは、竹ちゃん様への回答も含めて参ります。
「開いて修復」ですが、試しました。
これで本当に修復できる場合があるのでしょうか。
結果的には修復できませんでした。ログを残してくれましたが、
Excel自体を保存せずに終了したため入力済データの全てが失われました。
(この点はすでに気になりません。)
以下はログ内容を転記しました。
このログから解決策が見つかりましたら教えてください。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
 ここで改行します
<logFileName>error053360_01.xml</logFileName><summary>ファイル
 ここで改行します
 'K:\Excel制作中\●●リストver20240218版1547_●●テスト中_02_エラー対策入り原版.xlsm'
 ここで改行します
にエラーが検出されました </summary><additionalInfo><info>ファイル レベルの検証と
 ここで改行します
修復が完了しました。
 このブックの一部が修復されたか、破棄された可能性があります。
 ここで改行します
</info></additionalInfo></recoveryLog>
以上がログの中身です。 
 
◆今後について
近いうちに、エラーになるまで!?ステップ実行で確認してみます。が。気持ちが折れそうです。
  
竹ちゃん様が・・もう一回言うよ。
私の見たては、今起こっていることは何回も言っているとおり、コードの問題ではない。
と仰ってましたが、この動作不良はコードの記述が原因でないとすると、
別の方法を考案するのが賢明なのでしょうか・・。(涙・・・)
 
ぼやきますが、
Accessで実現可能なことも理解しているのですが、
以前Access2003から2007のヴァージョンアップで痛い目に遭いましたので、
Accessで作成した上、私がいなくなった場合に修正などができず、
将来的に使用不可となると困るため、Excelで作成しています。
 
取り急ぎ、近日中にステップでデータ入力を実施しストップするまで実行してみます。
また、少しばかり時間をいただきます。
 
お二人様。ありがとうございます。
今回の私の回答にご助言がございましたらよろしくお願いします。
FANTA66

回答
投稿日時: 24/02/27 08:54:12
投稿者: 半平太

なんかメモリリークが発生しているような現象ですが、
コードを見る限りそんなことは起きなさそう。
 
ただ、質問当初の「Excelにインポート」と言う文言がちょっと気になります。
開いている他ブックに対して(または自ブックの他シートに対して)クエリを実施すると
激しいメモリリークが発生します。
そんなことはやってないですね?

回答
投稿日時: 24/02/27 09:58:48
投稿者: Suzu

引用:
そのモジュールはAです。下から二行目の F_Input_DataInput.Show部分 です。
表示データの並べ替えなどのためフォームを開き直しています。その部分で停まります。

 
このプロシージャが、このF_Input_DataInput のユーザーフォームクラスに書かれているのでしょうか?
同一プロシージャ内で、 Unload を行った後、すぐに Show を行っているのですか?
 
Unload、Show 共に コメントアウトを行ってもエラーになりますか?
 
そもそも、何のためにそんなことをするのですか?
実行中のコードの記載で、フォームを閉じる命令を出しているにも関わらず、更に、開く命令を出す。
混乱の原因になると思いませんか?
 
各テキスト/コンボ等の 入力項目の初期化を行うためにであれば悪手です。
そんな手抜きをせずに、各コントロールに 初期値 を渡しなさい。
 
ユーザーフォームのテキストボックスの値を一度にクリアする
https://www.moug.net/tech/exvba/0090051.html
 
 
引用:
エラーで停まる箇所は、以前のようにFindの行(今回はMatch)ではなく、
フォームのデータをシートに書き込みするモジュールで発生しました。
★実行時エラー −2147417848(80010108) オートメーションエラー
 
そのモジュールはAです。下から二行目の F_Input_DataInput.Show部分 です。
表示データの並べ替えなどのためフォームを開き直しています。その部分で停まります。
また、停まったあと画面右下にクリップボードエラーが出現するようになりました・・・。
何か、根本的に考え方を変えないといけないのでしょうか。

 
クリップボードエラーとの事ですが、
提示されているコードではクリップボードを使用するコードは存在しなさそうです。
 
提示されていないコードにそれがあるのではありませんか?
オートメーションエラーは、発生する部分だけのコードだけを見ても解決できない事が多いです。
 
 
引用:
Accessで実現可能なことも理解しているのですが、
以前Access2003から2007のヴァージョンアップで痛い目に遭いましたので、
Accessで作成した上、私がいなくなった場合に修正などができず、
将来的に使用不可となると困るため、Excelで作成しています。

 
Access 2003 から 2007 では、大きな問題は発生しなかったと記憶しています。
今回のコードを見ると、入力や表示に凝り、変な手抜きをした結果発生したのでは?
 と疑ってしまいます。
 
引用:
別の方法を考案するのが賢明なのでしょうか・・。(涙・・・)

質問者には、全体のコードも見えませんから、当然、処理フローも分かりません。
インポート 云々 の部分も、結局どんな方法でインポートしてるかも秘匿されている状態です。
部分的にしか判らない状態で、そんな事を聞かれても回答者は答えられませんが
 
引用:
将来的に使用不可となると困るため、Excelで作成しています。

ユーザーフォームなど使用せずに一般機能にて実現できる手順書を作った方が良いかもしれませんよ。

回答
投稿日時: 24/02/27 10:33:17
投稿者: 竹ちゃん

そうですか。ダメでしたか。それは申し訳ない。
実は私のOfficeのバージョンには問題があることが分かっていて、それが更新されるまではマクロの正常動作は保証されていないのです。
私のバージョンは、バージョン 2312 (ビルド 17126.20190) ですが、これがマクロが正常に動かなくする元凶。他のバージョンも同様に怪しいけど。
私が日々体験していることは以下のようなこと。今日もさっき発生したところ。
1.現象としては、考えられないような箇所で考えられないようなエラーが発生する。
2.しかも色んなエラーが発生する。
3.昨日まで問題なく動作していたものが急に動作しなくなる。
4.これらは必ず問題が起きるわけでもなく、偶発的に発生する。
5.一旦問題が起きるとコードをどういじってもダメ。
6.しかし、問題が発生したブックは「開いて修復する」で正常動作するようになる。
 
これを解消してくれるのが、2/13リリースのバージョン 2401 (ビルド 17231.20236)で、以下がその参考資料。 
https://learn.microsoft.com/ja-jp/officeupdates/current-channel#version-2401-february-13
私は↑これで直ると信じてます。
 
でも、訳あって私のOfficeはすぐにバージョンアップできないので、今は耐える時期なのです。
 
ということで、FANTA66さんもこれに近いかなと思って提案してみたんだけど、違ったのかな〜。
なので、私はもう降参です。
良かれと思ってのことでしたが、失礼しました。

投稿日時: 24/02/27 12:04:51
投稿者: FANTA66

半平太様。コメントをありがとうございます。
 
メモリに関してはコードからしてもなんでかなぁ・・と考えられずにおります。
 
CSVのインポートですが、UTF-8を読込するよく出ている方法です。
また、ほかのブックとは関係性はありません。
ですので、他ブックに対してのクエリ実施もありません。
 
いろいろとありがとうございます。FANTA66

投稿日時: 24/02/27 12:20:40
投稿者: FANTA66

Suzu様。ありがとうございます。
 
このプロシージャが、このF_Input_DataInput のユーザーフォームクラスに書かれているのでしょうか?
同一プロシージャ内で、 Unload を行った後、すぐに Show を行っているのですか?
 
回答 そうです。
 
Unload、Show 共に コメントアウトを行ってもエラーになりますか?
 
回答 はいコメントアウトしても変わりませんでした。
 
そもそも、何のためにそんなことをするのですか?
実行中のコードの記載で、フォームを閉じる命令を出しているにも関わらず、更に、開く命令を出す。
混乱の原因になると思いませんか?
 
回答 フォーム上で入力したデータをワークシートに入れたあとで、フォーム内にあるリストに
   降順で最終の入力を常に上にくるようにしたくて実施しています。
 
各テキスト/コンボ等の 入力項目の初期化を行うためにであれば悪手です。
そんな手抜きをせずに、各コントロールに 初期値 を渡しなさい。
 
回答 特にご指摘いただいた事は実施していません。ただ、会員番号を入力待ちとするため
   ""にて空白にし、カーソルを置いているつもりです。
 
ユーザーフォームのテキストボックスの値を一度にクリアする
https://www.moug.net/tech/exvba/0090051.html
 
 

引用:
エラーで停まる箇所は、以前のようにFindの行(今回はMatch)ではなく、
フォームのデータをシートに書き込みするモジュールで発生しました。
★実行時エラー −2147417848(80010108) オートメーションエラー
 
そのモジュールはAです。下から二行目の F_Input_DataInput.Show部分 です。
表示データの並べ替えなどのためフォームを開き直しています。その部分で停まります。
また、停まったあと画面右下にクリップボードエラーが出現するようになりました・・・。
何か、根本的に考え方を変えないといけないのでしょうか。

 
クリップボードエラーとの事ですが、
提示されているコードではクリップボードを使用するコードは存在しなさそうです。
 
回答 そうですか。私もクリップボードに起因する事はしていないつもりです。
 
提示されていないコードにそれがあるのではありませんか?
オートメーションエラーは、発生する部分だけのコードだけを見ても解決できない事が多いです。
 
回答 すみません・・。全てのモジュールを載せるのはいかがかと思ったのと、
   エラーで反転している箇所を中心にし、それに絡む処理を載せたつもりです。
   確かにググっても中々良いと思われる事にならず、いつも拝見しているこちらに質問いたしました。
 
引用:
Accessで実現可能なことも理解しているのですが、
以前Access2003から2007のヴァージョンアップで痛い目に遭いましたので、
Accessで作成した上、私がいなくなった場合に修正などができず、
将来的に使用不可となると困るため、Excelで作成しています。

 
Access 2003 から 2007 では、大きな問題は発生しなかったと記憶しています。
今回のコードを見ると、入力や表示に凝り、変な手抜きをした結果発生したのでは?
 と疑ってしまいます。
 
回答 特に大きな問題が発生していなかったのなら良かったと思います!!
   私の社では、Accessでシステム会社に外注し構築してもらっていたので、
   約1年ほどかかって修正してもらいました。
   なにしろ、検索からしておかしくなったので・・。
   因みに私は社のシステム担当のひとりで私が手を下した訳ではございません。
 
引用:
別の方法を考案するのが賢明なのでしょうか・・。(涙・・・)

質問者には、全体のコードも見えませんから、当然、処理フローも分かりません。
インポート 云々 の部分も、結局どんな方法でインポートしてるかも秘匿されている状態です。
部分的にしか判らない状態で、そんな事を聞かれても回答者は答えられませんが
 
回答 ごめんなさい!! 先述した通り、どこまでモジュールの開示をするのが良いのかも
   検討つかずに質問しておりまして、漠然と解決に至らない事への質問でした。
   ここは訂正させていただき、この質問はなかった事としてください。
 
引用:
将来的に使用不可となると困るため、Excelで作成しています。

ユーザーフォームなど使用せずに一般機能にて実現できる手順書を作った方が良いかもしれませんよ。[/quote]
 
回答 ありがとうございます。チョイスのひとつとして参考にさせていただきます。
 
いろいろとご指摘いただきありがとうございます。
また、お時間を割いていただき誠に申し訳ございません。FANTA66

投稿日時: 24/02/27 12:24:59
投稿者: FANTA66

竹ちゃん様。いろいろとありがとうございます。
3回試しました。その結果をお知らせいたしました。
 
誤らないでください。そちらも大変ですね。
私のExcelは
Microsoft® Excel® for Microsoft 365 MSO (バージョン 2401 ビルド 16.0.17231.20236) 64 ビット
です。
 
竹ちゃん様が仰るバージョンなのでしょうか・・。
 
とにかくいろいろとありがとうございます。
FANTA66

回答
投稿日時: 24/02/27 15:55:56
投稿者: Suzu

引用:
Unload、Show 共に コメントアウトを行ってもエラーになりますか?
 
回答 はいコメントアウトしても変わりませんでした。

 
そうですか。
では、Unload、Show は 関係ないのかな。
 
 
引用:
そもそも、何のためにそんなことをするのですか?
 
回答 フォーム上で入力したデータをワークシートに入れたあとで、フォーム内にあるリストに
   降順で最終の入力を常に上にくるようにしたくて実施しています。

 
それは、ListBox のRowSource を フォームの Initialize にて、決定しているからでしょうか?
そうなのであれば、Initialize を Call すれば 良いのでは?
或いは、登録後に、RowSourceを指定しなおせば 良いのでは?
 
リストの指定に関しても、降順に並べると言うことは、新しい数件だけ表示すればほぼ済むのであれば
RowSource に上位10件分のアドレスを指定、または、AddItem にて 10件分だけ追加
 
更に、最新入力は 2行目 の様に決まった位置に来るはずですから
2行目なら、2行目を Insert後、2行目にデータを入れれば、並べ替え不要になります。
 
また、セルからの読み取り・セルへの書き込みにしても
24列分のセルをを繰り返し参照するのではなく 配列を使い 一度に書き込み/読み込みを終わらせる事で
動作が安定する事があります。
 
50件分 保存無しでずーっと登録していませんか?1件ごとに保存してみてください。
 
 
Ex)
Private Sub CommandButton1_Click()
  Dim varvalues(2) As Variant

  If Len(Me.TextBox1) > 0 And Len(Me.TextBox2) > 0 Then
    With Worksheets("Sheet1")
      varvalues(0) = Me.TextBox1
      varvalues(1) = Me.TextBox2
      .Rows(5).Insert
      .Range("A2").Resize(, 2).Value = varvalues
      Me.ListBox1.RowSource = "=Sheet1!A2:B" & .Cells(.Rows.Count, 4).End(xlUp).Row
    End With
  ThisWorkBook.Save ' ← Save を追加してみてください。
  End If
End Sub

 
 
引用:
回答 すみません・・。全てのモジュールを載せるのはいかがかと思ったのと、
   エラーで反転している箇所を中心にし、それに絡む処理を載せたつもりです。
   確かにググっても中々良いと思われる事にならず、いつも拝見しているこちらに質問いたしました。

 
何度も言いますが、エラーが発生している部分が原因とは限りませんので、
絡む部分のみを抽出し提示されても、解決につながるとは限りません。

投稿日時: 24/02/27 16:46:02
投稿者: FANTA66

Suzu様。何度もありがとうございます。
ご教授いただいた事を踏まえて試してみます。
FANTA66

投稿日時: 24/03/05 17:55:21
投稿者: FANTA66

FANTA66でございます。
 
教えていただきました皆様へ。
質問を投げかけたまま申し訳ございません。
 
実は2月28日より急遽、出張が入りまして多忙となり、
こちらへのアプローチが疎かになってしまっておりました。
また、この先も長期に渡りますので暫くは社に戻れない状況です。
モーグへの質問をしたままでは失礼なため、
質問を中断させていただきます。
 
急場を凌ぐ方法が見つかっておりますので、
使用者には対応をお願いする事といたしました。
 
皆様のアドバイスはメモに移しましたので、
時間が取れましたら修正を試みたいと思います。
 
しかし、このメッセージを持ちまして終了とさせていただき、
解決済とさせていただきます。
誠に勝手ではございますがよろしくお願い申し上げます。
 
皆様にはお知恵をお借りしたまま、誠に申し訳ございません。
いろいろとありがとうございました。
 
FANTA66