Excel (VBA) |
![]() ![]() |
(Windows 10全般 : Microsoft 365)
コードの内容
投稿日時: 22/10/04 11:05:24
投稿者: chokobanana
|
---|---|
始めまして失礼します
|
![]() |
投稿日時: 22/10/04 12:24:25
投稿者: simple
|
---|---|
ご質問の趣旨が余りわかっていませんが、少しコメントします。
|
![]() |
投稿日時: 22/10/04 13:16:28
投稿者: chokobanana
|
---|---|
メッセージありがとうございます
|
![]() |
投稿日時: 22/10/04 15:58:06
投稿者: QooApp
|
---|---|
言わんとすることはなんとなく理解できたのでいったん状況を整理しましょう。
Application.ScreenUpdating = True MsgBox FnameMsg Unload uf2 のMsgBoxでその変数の内容を表示する処理になっているので、3行部分を以下のような修正を行います。 Application.ScreenUpdating = True If(FnameMsg<>"")Then MsgBox FnameMsg endif Unload uf2 FnameMsg変数は最初に「=""」で空化する処理を行っているので何もトラブルが無ければそのまま中身は空のままです。If文内の「<>""」は「空じゃない」という条件式の書き方の一例です。 2.「抽出がない場合に次の関数の実行をスキップする」 引用: ここ、もう少し情報が欲しいです。 引用して記述 Sub 抽出A() Dim cel As Range Application.ScreenUpdating = False For Each cel In Range("D5", Cells(Rows.Count, "D").End(xlUp)) If cel.Value <> Empty Then Unload uf2 Else Application.DisplayAlerts = False ActiveSheet.Delete ←ここがわからない Application.DisplayAlerts = True MsgBox "抽出はありません" ←この条件を達成するときに「Call あいう」スキップというのは理解 End If Next Application.ScreenUpdating = True End Sub 「ここがわからない」と書かせてもらった部分について実際に挙動している場合の動作例を教えてください。 これ、RangeD5〜D列の最終入力行まで下方向にセルを参照しておりますが、 D5から下へ1セルずつ、 「このセルに値が入ってなければこのシート(現在アクティブなシート)を削除する」 が繰り返し実行されているように見えます。 大丈夫な動作でしょうか??? これって、D5〜nセル目まで、 「全ての範囲でデータが入力されていなければアクティブなシートを削除」 なのか、 「事実上D5セルが記入されているかしかチェックしていないからこのソースコードで別に動作に問題なし」 なのか、 「別の解釈である」 なのかわからないです。 For Each cel In Range("D5", Cells(Rows.Count, "D").End(xlUp))の部分が上位の所属を指定していないので 「現在アクティブなワークシートに対して参照する仕組み」 ここのサイトに記載されていない何らかのぼかしが入っているなら別にいいのですが、「どのワークシートをターゲットにしているのか」が指定されていないので、思わぬタイミングで実行した時に消してはいけないワークシートを削除する動作が実行される可能性があります。 また、抽出A()が実行された後に別の関数を実行するか否かの制御になるので抽出A()の中身の変更だけでは対応できません。 Sub 抽出A() 〜〜〜〜〜 End Sub を Function 抽出A() as Boolean 〜〜〜〜 If(希望の条件をここにかく)Then 抽出A = True Else 抽出A = False Endif End Function とSub関数モジュールからFunction関数モジュールに変更する処理と、 Call 抽出A Call あいう を If(抽出A = True)Then Call あいう Endif に直す(関数の戻り値で調べてみてください)2段構えの修正をすれば一応原理的には修正できる。 けれど、「希望の条件を〜」の部分の記述に影響するレベルで前述の実行内容の不備疑惑があるのでいったんこれをやる前にどのようなイメージ・実際の挙動を整理してください。 |
![]() |
投稿日時: 22/10/04 16:57:19
投稿者: chokobanana
|
---|---|
メッセージありがとうございます
|
![]() |
投稿日時: 22/10/04 17:32:13
投稿者: QooApp
|
---|---|
私が見落としてるだけなら問題ないですが、
引用: であれば、以下の記述を追記してもらって前述のFunction関数化の処理と合体してもらってもいいですか? ■1.「Dim cel As Range」の下に2行追加 Dim SkipFlag As Boolean SkipFlag = True ■2.「MsgBox "抽出はありません"」の下に1行追加 SkipFlag = False ■3.さっきの末尾処理を修正 If(SkipFlag = True)Then 抽出A = True Else 抽出A = False Endif End Function これで多分抽出A()の結果が抽出ない場合、外部から呼び出した時に戻り値としてFalseが返却されます。 逆に、抽出がある場合はTrueが戻り値として返却されます。 If(抽出A = True)Then Call あいう Endif 戻り値として受け止めることで次の実行の可否を自動で決定します 戻り値として戻す方法が基本的に一番楽で、かつ間違いがないと思います。 戻り値に設定したい値の種類を決定するのはFunction ●●() As ▼▲▼▲ の「▼▲▼▲」部分です。 戻り値は変数名の定義が不要な代わりに関数名に直接値を入力することができます。 入力しなおす(上書き)もできますが、その関数が終了した時点における格納されている値が戻り値として固定されます。 テクニカルな方法としてターゲットしているワークシートを関数を超えて受け渡すことにも使えたりします。 (その場合、代入処理のときに「Set 関数名 = ワークシート変数」という書き方になるので詳しくは「ワークシート 変数 設定」とかで調べてみてください) |
![]() |
投稿日時: 22/10/11 12:52:28
投稿者: chokobanana
|
---|---|
メッセージありがとうございます。
|
![]() |
投稿日時: 22/10/13 11:47:29
投稿者: QooApp
|
---|---|
動いたようでなによりです。
|
![]() |
投稿日時: 22/10/14 08:45:17
投稿者: chokobanana
|
---|---|
QooApp様
|