質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

8642閲覧

ステップインを行うと問題なくプログラムが実行されるが、実行を行うとうまく動かない

aberudain

総合スコア7

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/07/25 06:21

編集2019/07/29 00:50

前提・実現したいこと

VBAでプログラムを作成しています、
シート内で文字検索をし、検索結果のセルを特定の数だけ移動したセルを取得し、新規作成した別のシートに値を貼り付ける作業を全シート行いたいです。

C,I,J列に値を貼りつけたいです。

コピーする箇所です。同じ形式の表がシート内にいくつかありますが、シートごとに表の数は異なります。

貼り付けイメージです。

ステップインを行うと問題なくプログラムが実行されますが、実行のみを行うと貼付が行われないので原因が知りたいです。
ただ、コピーは実行されているみたいです。

該当のソースコード

vba

1Sub test() 2 3 4 Dim x As Long 5 Dim y As Long 6 Dim myRange As Range 7 Dim firstCell As String 8 Dim yokin As Range 9 Dim memo As Range 10 Dim copycell As Range 11 Dim copysheet As String 12 13 copysheet = InputBox("シート名を入力してください", "新規作成") 14 15  Worksheets("コピー元").Copy after:=Worksheets(1) 16 ActiveSheet.Name = copysheet 17 18 19 x = 6 20 21 For y = 1 To Worksheets.Count 22 23 Worksheets(y).Activate 24 Set myRange = Worksheets(y).Cells.Find("103-00002") 25 26 If Not myRange Is Nothing Then 27 firstCell = myRange.Address 28 29 Do 30 Set yokin = ActiveSheet.Cells(myRange.Row, myRange.Column + 4) 31 Set memo = ActiveSheet.Cells(myRange.Row, myRange.Column + 19) 32 33 If yokin > 0 Then 34 Union(ActiveSheet.Cells(yokin.Row, yokin.Column), ActiveSheet.Cells(memo.Row, memo.Column)).Select 35 Selection.Copy 36 Worksheets(2).Activate 37 Cells(x, "c") = Worksheets(y).Name 38 Cells(x, "i").Select 39 ActiveSheet.Paste 40 x = x + 1 41 Worksheets(y).Select 42 End If 43 44 Set myRange = Cells.FindNext(myRange) 45 46 47 Loop While myRange.Address <> firstCell 48 49 End If 50 51 Next 52 53 Worksheets(2).Activate 54 55End Sub

試したこと

vba

1Worksheets(2).Activate 2Cells(x, "c") = Worksheets(y).Name 3

上のどちらかににブレークポイントを設置し、実行すればステップインをした時と同様に実行結果が得られますが、
ここ以外にブレークポイントを設置する、またはデバックせずにそのまま実行するとうまく貼り付けが実行されてくれません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2019/07/25 06:30

「ここら辺が原因なのはわかっている」というのはどういう事でしょうか。 通常、原因がわかれば解決できるはずです。 質問文を編集して、説明を追記して下さい。
aberudain

2019/07/25 06:41

ここにブレークポイントを設置し実行すると貼付が実行されます。 ステップインでも同様に問題なく実行されます。 ただ、ブレークポイントを設置しないで実行、または別の場所にブレークポイントを置いて実行すると貼り付けができていません。 似たような事例があれば教えていただきたいです。
gentaro

2019/07/25 06:44

その説明も全然ピンときませんが、それが起こったことを正確に記述できているのであれば「質問文を編集して追記して下さい」
hatena19

2019/07/25 07:26

ソースコードはマークダウン記法のソースタグで囲んでください。 分からなければ、ソースを選択した状態でツールバーの <code> をクリックしてください。
coco_bauer

2019/07/25 07:31

「Cells(x, "c") = Worksheets(y).Name」の Cellsの使い方は間違っています。 Cellsの引数は2つで、一つ目が行番号、二つ目が列番号を指定します。 C4 セルを指定するなら、Cells(4,3)となります。
hatena19

2019/07/25 07:42

Cells の第2引数には、列番号でも列名(アルファベット)でも指定できますので間違ってません。 まあ、誤解を生みやすいので、Range("C" & x) とするか、Cells(x, 3) の方がいいとは思いますが。
guest

回答2

0

memo は条件式によって格納されますよね。
If yokin.Value > 0 Then のときだけ
newWS.Cells(x, "j").Value = memo.Value 
memoの値を代入してます。
ゆえに条件式にはまらないときの処理漏れによって
memoが格納されないのではないでしょうか?

投稿2019/07/29 01:31

nanami12

総合スコア1015

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

実際にテストしたわけではないので原因の指摘はできないが、
とりあえずおかしいと思える部分の指摘とコーディングのアドバイスをしておきます。

For y = 1 To Worksheets.Countと全シートを対象に処理を行っているが、"コピー元"シートと新規作成したシートは対象から除外する必要があるのでは。

Activate、Select してアクティブなシートやセルを対象に処理しているが、不安定要因になるので、オブジェクト変数に代入するか、Withステートメントで指定して、それに対して処理を実行するようにした方がいいでしょう。また、その方か読みやすいです。

また、Copy Paste ではなく、Value を使って代入したほうが高速です。

さらに、変数宣言は以前は冒頭にまとめて宣言するのが普通でしたが、最近は使う直前に宣言するのがトレンドです。
VBA - 見やすい 変数の 宣言位置|teratail

上記の方針に基づいて現状のコードを書き換えてみました。

vba

1Sub test() 2 3 Dim copycell As Range 4 5 Dim copysheet As String 6 copysheet = InputBox("シート名を入力してください", "新規作成") 7 8 Dim newWS As Worksheet 9 Set newWS = Worksheets("コピー元").Copy(after:=Worksheets(1)) 10 newWS.Name = copysheet 11 12 'Set copycell = ActiveSheet.Cells(6, "i") 13 14 Dim x As Long '挿入開始行 15 x = 6 16 17 '"コピー元"シートが一番目、その後に新規作成シートを挿入すると仮定しました 18 'もしそうでないなら、シート名をチェックして"コピー元"とcopysheetはとばすようにする 19 Dim y As Long 20 For y = 3 To Worksheets.Count 21 With Worksheets(y) 22 Set myRange = .Cells.Find("103-00002") 23 24 If Not myRange Is Nothing Then 25 26 Do 27 Dim yokin As Range 28 Dim memo As Range 29 Set yokin = .myRange.Offset(, 4) '右へ4列分移動 30 Set memo = .myRange(, 19) '右へ19列分移動 31 32 If yokin.Value > 0 Then 33 'Union(yokin, memo) 34 newWS.Cells(x, "c").Value = .Name.Value 35 newWS.Cells(x, "i").Value = .yokin.Value 36 newWS.Cells(x, "j").Value = .memo.Value 37 x = x + 1 38 End If 39 40 Set myRange = Cells.FindNext(myRange) 41 42 Loop While myRange.Address <> firstCell 43 44 End If 45 46 Next 47 48 newWS.Activate 49 50End Sub

投稿2019/07/25 10:20

hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aberudain

2019/07/26 04:35

```vba Sub test() Dim x As Long Dim y As Long Dim myRange As Range Dim firstCell As String Dim yokin As Range Dim memo As Range Dim copycell As Range Dim copysheet As String copysheet = InputBox("シート名を入力してください", "新規作成") Dim newWS As Worksheet Worksheets("コピー元").Copy after:=Worksheets(1) Set newWS = ActiveSheet newWS.Name = copysheet x = 6 For y = 3 To Worksheets.Count Worksheets(y).Activate Set myRange = Worksheets(y).Cells.Find("103-00002") If Not myRange Is Nothing Then firstCell = myRange.Address Do Set yokin = myRange.Offset(, 4) Set memo = myRange(, 19) If yokin.Value > 0 Then newWS.Cells(x, "c").Value = Worksheets(y).Name newWS.Cells(x, "i").Value = yokin.Value newWS.Cells(x, "j").Value = memo.Value x = x + 1 End If Set myRange = Cells.FindNext(myRange) Loop While myRange.Address <> firstCell '?????Z????????Do~Loop??p?? End If Next newWS.Activate End Sub ``` ご回答を参考にして元の形を残しつつエラーが出ないように修正いたしました。 ただ、シート名、yokin,memoそれぞれ貼付ができるようになりましたが、memoだけ ランダムで取得漏れがあるみたいです。 それでも全く貼り付けができなかったことに比べればだいぶましになりました。 ありがとうございます。
nanami12

2019/07/29 01:29

memo は条件式によって格納されますよね。 If yokin.Value > 0 Then のときだけ newWS.Cells(x, "j").Value = memo.Value  memoの値を代入してます。 ゆえに条件式にはまらないときの処理漏れによって memoが格納されないのではないでしょうか?
aberudain

2019/07/29 02:33

解決しました。 貼りつけられたメモ内容に違和感を覚えよく確認したところ、想定した場所の隣のセルを代入していました。 そのためベストアンサーは丁寧に添削してくださったhatena19様にいたしました。 ですが、nanami12様のコメントによりシートをよく見比べて原因がわかりましたので誠にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問