[[20211013194155]] 『F8だと処理が止まってしまいます。F5だと間違って』(tama) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『F8だと処理が止まってしまいます。F5だと間違っていますが最後まで処理が完了できます。』(tama)

F8の使用方法について教えてください。

下記の処理を行う実行ブックを作成しました。
これを実行すると、「フォルダ」に保存されたファイルの編集を行う感じになっています。

このVBAを確認するにあたり、[F8]を使用して実行内容を1つ1つ確認したいのですが、
どうしても「Sheets.Add(after:=Sheets(Sheets.Count)).Name = "明細"」の行で、止まってしまいます。
[F5]だと全ての処理を完了することができます。(ただし、処理は間違っている...ので、[F8]を見てみたいと思っています。。。)

原因が何か教えていただけますでしょうか。
実行ブックと編集するファイルが同時に開いてしまっている辺りで、Activateの使い方が間違っているのでしょうか...
どうぞよろしくお願いいたします。

 Sub 明細シート作成()

 Application.ScreenUpdating = False
  Dim i As Long
  Dim bookname As String

  bookname = Dir(ThisWorkbook.Path & "\フォルダ\*") 
  Workbooks.Open ThisWorkbook.Path & "\フォルダ\" & bookname

   Sheets.Add(after:=Sheets(Sheets.Count)).Name = "明細"
   Sheets(2).Activate
   Sheets(2).Range("A1").CurrentRegion.Select
   Selection.Resize(Selection.Rows.Count - 1).Copy
   Sheets("明細").Activate
   Sheets("明細").Range("A1").PasteSpecial

  For i = 3 To Sheets.Count
   Sheets(i).Activate
   Sheets(i).Range("A1").CurrentRegion.Select
   Selection.Offset(1).Resize(Selection.Rows.Count - 1).Copy
   Sheets("明細").Activate
   Sheets("明細").Cells(Rows.Count, 1).End(xlUp).Offset(1).PasteSpecial
  Next i

 End Sub

< 使用 Excel:Office365、使用 OS:Windows10 >


>どうしても「Sheets.Add(after:=Sheets(Sheets.Count)).Name = "明細"」の行で、止まってしまい
エラーが出ると言うことですね?
そのときのエラーメッセージを省略せずに書いてください。
必要な情報を提示してください。

# 既に"明細"というシートがあるというのが想像されますが、そこはどうですか?
# もしくはブックに保護がかかっているとか。
# 情報提供がないので、当てずっぽうですよ。
(γ) 2021/10/13(水) 21:54


 こちらの環境では、再現出来なかったのでお力にはなれませんが、
 下記スレッドの様なことでしょうか?
[[20211008215141]]『中断モードでコードを実行することはできません』(みるく)
(#) 2021/10/13(水) 21:57

 最近、ステップ実行してると、ステップしないでそのまま最後まで実行されちゃって困っています。
 質問者さんのコードも実行してみたら、シートを追加したあと、最後まで走り切っちゃいました。
 365です。
 私は、こういうときは、STOPステートメントを至るところにいれてやってます。

 で、このコード、ブックのシート構成等の前提条件がわからないのと、
 説明もないので、何をやりたいのかよくわかりません。
 とりあえず、Sheetsの親ブックの指定を入れるのと、
 Activate、Select、Selection を使わないように書き換えるのをオススメします。
(´・ω・`) 2021/10/13(水) 22:04

既に必要なコメントはついていると思いますが、私も何点か。

■1
>Activateの使い方が間違っているのでしょうか...
VBAの世界では基本的に、ブックやシート(オブジェクトと言います)をきちんと指定すれば、そもそもActiveにしたり選択したりする必要はありません。
また、【標準モジュール】でシートの指定を省略した場合「ActiveSheet」を指定したと見なされるルールです。
したがって、複数のブックやシート相手にするならば、きちんと指定することを強くお勧めします。

 ブックやシートを変数に格納するのも有効でしょう。
 方法は↓でお示ししていたとおもいますので説明は省略します
[[20211005122554]] 『リストと同じシート名を別のエクセルファイルにコピーする方法を教えてください!』(tama)

■2
2番目シートのコピーと3番目以降のシートのコピーを別処理にしていますが、結局同じことをしているのではありませんか?

また↓だと、"明細"シートも対象になっちゃいませんか?

 For i = 3 To Sheets.Count

■3
ということを踏まえるとこういうアプローチもあるのではないかとおもいます。
(やりたい処理がよくわからないので大外れかもしれませんが。。。。)

    Sub 整理()
        Dim bookname As String
        Dim dstRNG As Range, srcRNG As Range
        Dim i As Long

        Stop 'ブレークポイントの代わり

        bookname = Dir(ThisWorkbook.Path & "\フォルダ\*")
        With Workbooks.Open(ThisWorkbook.Path & "\フォルダ\" & bookname)
            On Error Resume Next
            Set dstRNG = .Worksheets("明細").Range("B1")
            On Error Resume Next

            If dstRNG Is Nothing Then
                Set dstRNG = Worksheets.Add(after:=.Worksheets(Worksheets.Count)).Range("B1")
                dstRNG.Parent.Name = "明細"
            Else
                dstRNG.Parent.Cells.Clear
            End If

            For i = 2 To .Worksheets.Count
                If .Worksheets(i).Name <> "明細" Then
                    Set srcRNG = Intersect(.Worksheets(i).Range("A1").CurrentRegion, .Worksheets(i).Range("A1").CurrentRegion.Offset(1))
                    If Not srcRNG Is Nothing Then
                        srcRNG.Copy dstRNG
                        dstRNG.Offset(, -1).Resize(srcRNG.Rows.Count).Value = .Worksheets(i).Name
                        Set dstRNG = dstRNG.Offset(srcRNG.Rows.Count)
                    End If
                End If
            Next i
        End With
    End Sub

(もこな2) 2021/10/13(水) 23:28


次のラインにブレークポイントを入れればいいのでは。
当該コードにカーソルがある状態でF9キーで設定/解除できます。
(tkit) 2021/10/14(木) 08:02

皆様ありがとうございます。
詳細がきちんとお伝えできておらず大変申し訳ございません。

■やりたい事といたしまして、
フォルダの中に入っているファイルは売上報告書なるもので、
1シート目に「表紙」があり、
2シート目〜5シート目くらいまで「商品ごとの明細」があります。
この2シート目〜5シート目の1行目の項目名は同じなので、
まず、「明細」という名のシートを作って、
Sheet2は1行目の項目名を含む形でコピーし(最終行は合計値が入っているので省く)
それ以降のシートは項目名はいらないので2行目からコピーという流れです。

■問題が発生しているのは、
このコードを確認するにあたり、F8を使用したところ
「Sheets.Add(after:=Sheets(Sheets.Count)).Name = "明細"」
この部分で、止まってしまいます。
止まる状況の詳細ですが、エラーメッセージなどは出現せず、黄色い行になったまま動かない&進まない状態です。
何度かやっていて分かったことは、
「Sheets.Add(after:=Sheets(Sheets.Count)).Name = "明細"」
この部分で、止まったときに、もう一度プロシージャーのどこかをクリックする(どこかにカーソルを合わせる)と
処理をF8で再開することができました。もしかして、これは当たり前のことなのでしょうか...。

>(γ)様
ご返信ありがとうございます。上記の通りエラーなどはない状況です。
”明細”というシートは元のファイルにもなく、保護などもかかっておりませんでした。。。

>(´・ω・`) 様
説明不足にも関わらず、アドバイスいただきありがとうございます。「Sheetsの親ブックの指定を入れるのと、Activate、Select、Selection を使わないように書き換えるのをオススメします。」今回の問題はここにありそうですよね。(もこな2様のコードは問題なくF8が使用できるので...)色々と書き換えてみております。また分からないことがあればご質問させていただくことがあるかと思いますが、どうぞよろしくお願いいたします。

>もこな2様
お世話になっております。今回もありがとうございます。
”明細”というシートを最後に入れる処理にしてしまったので重複してしまいました...(はじめはシート1の後ろに明細シートを作る処理にしていたのですが、黄色い行になったまま進まないのでこの部分を色々書き換えていたら間違えてしまいました…。)修正します!
またシート名をA列に入れるのは今後のために必要だと思いました。参考にさせていただきます!
あと、前回の時にもお伺いするべきだったのですが、「Stop 'ブレークポイントの代わり」というのは、どういう意図で行っているのでしょうか。初歩的なご質問で大変申し訳ございません。教えていただけますと幸いです。

>tkit
ありがとうございます。
参考にしてみたところ、状況は変わらなかったのですが、この辺が解決のポイントな気がしております...。ブレークポイントについて改めて検索してみます。
(tama) 2021/10/15(金) 13:31


F8キーというのは"ステップ実行"をするためのキー指定です。
一行毎に実行させる機能です。
一行毎に止まるのが正常動作です、というより、そういう目的のためのものです。

失礼ながら手元にExcelVBAに関する書籍をお持ちですか?
最低限そうしたものを参照しながら取り組まれることをお薦めします。

# 話の前提から違ったということですかね。難しいものですね。

(γ) 2021/10/15(金) 13:41


 ええと、アクティブウインドウが変わってしまったので、
 キー入力が入ってないだけということですか?
(´・ω・`) 2021/10/15(金) 13:56

(γ)様
私のようなものに時間を割いていただきありがとうございます!
参考書にて、F8は1つ1つの作業を見ながら実行するものと学びまして、
それが、(γ)様のいう、「一行毎に実行させる機能です。」という部分だと思いますが、
その認識はあったものの、「一行毎に止まるのが正常動作です、というより、そういう目的のためのものです。」この認識には至りませんでした。
どちらもF8の機能なのですよね。そう考えれば、一旦プロシージャに戻り、再度F8を再開するのも正しいということが分かりますね。お手を煩わせてしまい申し訳ありませんでした。><!

(´・ω・`)様
お恥ずかしいながら、上記の通りでして、そもそも私のコードだとアクティブウインドウが変わってしまって、
F8を押しても反応なく止まることがあるということが分かりました。これは(´・ω・`)様のご指摘にもありましたように、
「 とりあえず、Sheetsの親ブックの指定を入れるのと、 Activate、Select、Selection を使わないように書き換えるのをオススメします。」
にもつながりますよね...。コードを今一度見直したいと思います。。。ありがとうございました。
(tama) 2021/10/15(金) 14:30


もう見てないかもしれませんが一応。

>「Stop 'ブレークポイントの代わり」というのは、どういう意図
"意図"を聞かれるということは"意味"はもう分かっているということでしょうか?
「ブレークポイント」が何なのか分かれば、おのずと答えもわかりそうですが、そのまま【ブレークポイント】の代わりとして「STOPステートメント」を記述しています。
"意図"としては、ちゃんとステップ実行して研究してくださいね。といったところでしょうか。

 ※「ステップ実行」や「ブレークポイント」という言葉自体がわからないということなら↓を読んでみてください。
 (尤も、"ステップ実行"のほうは今回理解されたと思いますが)

 【ステップ実行】
https://www.239-programing.com/excel-vba/basic/basic023.html
http://plus1excel.web.fc2.com/learning/l301/t405.html

 【ブレークポイント】
https://www.239-programing.com/excel-vba/basic/basic022.html
https://www.tipsfound.com/vba/01010

 また、以下も知っておいて損は無いと思います。

 【イミディエイトウィンドウ】
https://www.239-programing.com/excel-vba/basic/basic024.html
https://excel-ubara.com/excelvba1/EXCELVBA486.html

 【ローカルウィンドウ】
https://excel-ubara.com/excelvba4/EXCEL266.html
http://excelvba.pc-users.net/fol8/8_2.html

(もこな2) 2021/10/19(火) 02:04


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.