アプリ版:「スタンプのみでお礼する」機能のリリースについて

シート名:受付のVBAコードを設定しております。
シート内のセルを変更するたびにシート全体が更新?されるようで、
セルに対してのマクロを実行した場合でも、かなりの時間がかかります。
解決方法があれば教えてください。
コード
Private Sub Worksheet_Change(ByVal Target As Range)
Dim tbl As Variant
Dim i As Integer
tbl = Array("D10", "D11", "E10", "E11", "F10", "F11")
With Worksheets("審査")
For i = 0 To 5
.Range("B" & 26 + i).Value = Range(tbl(i)).Value
If Range(tbl(i)).Value = "" Then
.Range("E" & 26 + i).Value = ""
Else
.Range("E" & 26 + i).Value = "後日図書の提出をお願いいたします。"
End If
Next i
End With
Application.ScreenUpdating = False
Application.EnableEvents = False
On Error Resume Next
Sheets("消防添").Visible = [R37] = "消防添"
Sheets("F審査").Visible = [F14] = "フラット35(設計)"
Application.ScreenUpdating = True
Application.EnableEvents = True
If Range("D2").Value = "紙申請" Then
Call 電図
Else
Call 紙図
End If
If Range("N41").Value = "■" Then
Call 注意1表示
End If
If Range("F3").Value = "札幌市" Then
Call 注意2表示
End If
If Range("D7").Value = "計画変更" Then
Call 注意3表示
End If
If Range("N44").Value = "■" Then
Call 注意4表示
End If
If Range("N45").Value = "■" Then
Call 注意5表示
End If
If Range("D7").Value = "計画変更" Then
Call 注意6表示
End If
If Range("D7").Value = "計画変更" Then
Call 注意7表示
End If
If Range("N46").Value = "■" Then
Call 棟数表示
End If
If Range("L67").Value = "■" Then
Call 印刷表示
End If
If Range("G205").Value = "■" Then
Call 構造
End If
If Range("R66").Value = "■" Then
Call 車庫増築
End If
If Range("D5").Value = "車庫等:単独" Then
Call 車庫単独
End If
If Range("R55").Value = "車庫注意" Then
Call 車庫単独
End If
If Range("W85").Value = "F電子" Then
Call フラット紙非
End If
If Range("W86").Value = "F紙" Then
Call フラット電非表示
End If
If Range("W85").Value = "F電子" Then
Call 電子フラット保存
End If
If Range("W86").Value = "F紙" Then
Call 紙F保存
End If
If Range("D7").Value = "計画変更" Then
Call 計変画像表示
End If


If Range("F8").Value >= 3 Then
Call 通路
End If




End Sub

よろしくお願いします。

質問者からの補足コメント

  • うーん・・・

    回答ありがとうございました。
    おっしゃっていただいた、
    せめて停止は変数宣言の後に持ってきても良いような。
    はコードをどのように変更すればよろしいでしょうか。
    よろしくお願いします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2023/05/26 11:11

A 回答 (4件)

Private Sub Worksheet_Change(ByVal Target As Range)


Dim tbl As Variant
Dim i As Integer
Application.ScreenUpdating = False '★ ここへ異動
Application.EnableEvents = False '★  〃
tbl = Array("D10", "D11", "E10", "E11", "F10", "F11")
With Worksheets("審査")
For i = 0 To 5
.Range("B" & 26 + i).Value = Range(tbl(i)).Value
If Range(tbl(i)).Value = "" Then
.Range("E" & 26 + i).Value = ""
Else
.Range("E" & 26 + i).Value = "後日図書の提出をお願いいたします。"
End If
Next i
End With
On Error Resume Next
Sheets("消防添").Visible = [R37] = "消防添"
Sheets("F審査").Visible = [F14] = "フラット35(設計)"
'~略~
Application.ScreenUpdating = True '☆ これらも後ろにしてみて様子見?
Application.EnableEvents = True '☆ これらも後ろにしてみて様子見?
End Sub
    • good
    • 0
この回答へのお礼

コード変更ありがとうございました。
早速、試してみましたら、以前よりスピードが速くなりました。
助かりました。

お礼日時:2023/05/26 11:38

こんにちは


解決はしたのかも知れませんが
>かなりの時間がかかります。解決方法があれば教えてください。
イベント抑止命令の外でイベント発生トリガーが実行されている可能性がありますが情報不足の為、的確な回答ができません
例えばEnableEventsプロパティはApplicationに対してなので他のプロシージャでTrue処理をされると別シートなどであってもTrue処理された事になります
また、Targetを制限する条件分岐などが無くスタックする可能性もありますね
(シートの何処のセルを手作業などを含め変更するともれなく実行されるって怖いですね)

以下余談
良くここまでQAサイトを駆使して色々な方が書いた実行プロシージャを集め
処理業務をしているものと感心します
プロセス、処理、ソースコードが分からず組み合わせで処理を行っていくのは、複数ブックなどを扱っているようですしそろそろ限界ですかね

業務フローに合わせ処理フローを書き出し 各プロシージャを整理するのが良いと思います
特に制御系(Applicationオブジェクト)メソッド、プロパティやイベント、ファンクション、Call などは 使用方法や呼び出しトリガーを考察して改修する必要があると思います

また、(抑止系は必要ですが)抑止系プロパティ例えばCalculationやEnableEventsなどなどに頼らない(言葉の綾)条件分岐(If Intersect)などの細分化や配列作業などでの高速化なども必要かもしれませんね

いずれに致しましても個々のプロシージャを掲示されても 的確な回答をすることは難しく、検証する事も難しいのではないかと思います
つまりは、QAサイトでの回答をそのまま分からず実施する事は難しい事になるので、、そろそろ限界なので自身で理解して整理、改修する必要があると思いますよ
(私的に)コードの提示は現用語より分かり易いので良いですが、
挿入位置やプロシージャ名の指定など かなり重症だと思いますので
いきなりは無理かもしれませんが自身で考え行う事を優先、努力されてはいかがでしょう
勿論、拝見すれば出来る協力は惜しみません
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
いつも助けて頂きましてありがとうございます。
おっしゃる通りです。
少しづつ、理解を深めていき、自分自身で出来るように努力いたします。
今後も、よろしくお願いします。

お礼日時:2023/05/26 13:56

こんにちは



ご提示のプロシージャからCallされる可能性のあるプロシージャがたくさんありますが、それらがどうなっているのかによります。

ご提示のコードは
>Sub Worksheet_Change
ですけれど、どこかのセルに入力すれば、該当していれば、同じプロシージャがその度に呼び出されることになるので、かなり効率の悪い処理になっているのではと推測されます。
(処理の内容が不明なので、よくわかりませんけれど・・)
それぞれ呼び出されるプロシージャでも同じように効率の悪い処理を行っていれば、それなりの時間が掛かることでしょう。

>解決方法があれば教えてください。
ご提示の範囲内で言うならば、変更セルと処理の関係を整理して、不要な処理を行わないようにすることでしょう。

例えばA1セルの値を変更しただけでも、ご提示のコードの場合は、該当すれば全部の別プロシージャを呼び出すことになります。
実際は、A1セルの値の変更では「何もしない」で良いはずです。
この処理が、関係のないセルに入力するたびに発生するので、重く感じられるのではないでしょうか?

具体的な解決法として考えられるのは、上記の整理を行った上で、
・変更されたセル位置をチェックして、関係する処理だけを行う
ように変更することで、それなりに改善するのではないかと推測されます。

呼び出されるプロシージャの内容が不明ですが、そちらでも同じようにたくさんのプロシージャを呼び出すような仕組みになっているとするなら、ご提示のコードだけではなく、全体的に見直す必要がありそうな気もしますけれど・・・
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
参考にさせて頂きます。

お礼日時:2023/05/26 11:36

更新などの停止と再開は、その範囲を広げると問題ありなのですか?



例えば変数宣言の後・End Subの手前にしてみるとか。
Callで呼び出されるものが影響しないのなら、今のままでも良いのかもですが・・・
せめて停止は変数宣言の後に持ってきても良いような。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!