[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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 >
# 既に"明細"というシートがあるというのが想像されますが、そこはどうですか?
# もしくはブックに保護がかかっているとか。
# 情報提供がないので、当てずっぽうですよ。
(γ) 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
■やりたい事といたしまして、
フォルダの中に入っているファイルは売上報告書なるもので、
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
失礼ながら手元にExcelVBAに関する書籍をお持ちですか?
最低限そうしたものを参照しながら取り組まれることをお薦めします。
# 話の前提から違ったということですかね。難しいものですね。
(γ) 2021/10/15(金) 13:41
ええと、アクティブウインドウが変わってしまったので、 キー入力が入ってないだけということですか? (´・ω・`) 2021/10/15(金) 13:56
(´・ω・`)様
お恥ずかしいながら、上記の通りでして、そもそも私のコードだとアクティブウインドウが変わってしまって、
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.