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

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

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

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

1回答

280閲覧

条件に一致した場合、参照するセルについて

ichigo15

総合スコア14

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

1クリップ

投稿2019/11/26 04:49

編集2019/11/27 00:08

前提・実現したいこと

 M列にL列の値を入力する
但し、N列が"確認"となっている行はS列の値を上から順番に入力させる

【マクロ実行前】

イメージ説明

【マクロ実行後】

イメージ説明

発生している問題・エラーメッセージ

・N列の値がある最後の行までしかM列に値が入力されない

 L列もしくはN列の値がある最終行までM列の値が入力されるべきなのに
途中までしか反映しないです

【現在のコード実行後】

イメージ説明

該当のソースコード

Sub てすと()

Dim dt(), ctr As Long, c As Range Range("M6:M" & Rows.Count).ClearContents For Each c In Range("S6:S" & Rows.Count).SpecialCells(2) ReDim Preserve dt(ctr) dt(ctr) = c.Value ctr = ctr + 1 Next c ctr = 0

For Each c In Range("N6:N" & Range("L" & Rows.Count).End(xlUp).Row)
If c.Value = "確認" Then
c.Offset(, -1).Value = dt(ctr): ctr = ctr + 1: If ctr > UBound(dt) Then Exit For
Else
c.Offset(, -1).Value = c.Offset(, -2).Value
End If
Next c

End Sub

試したこと

コードの"確認"を他の文字に変更するとL列の値のある最終行までの値が
入力された 

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

tatsu99

2019/11/26 08:59

>コードの"確認"を他の文字に変更するとL列の値のある最終行までの値が 入力された  コード中に"確認"の文字はありません。どうなってますか。 なさりたいことがよくわからないので、レイアウトが判るように実行前の画像と、実行後の期待する結果の画像を提示していただけませんでしょうか。
ichigo15

2019/11/27 00:11

説明が不足しており申し訳ございません。 >コード中に"確認"の文字はありません。どうなってますか。 文字化けしていたので修正いたしました。 画像を添付しましたのでご確認ください。 まだ分かりにくいようでしたらご連絡下さい。 よろしくお願いいたします。
guest

回答1

0

ベストアンサー

修正しました。
修正点は以下の個所です。
1.For Each c In Range("N6:N" & Range("L" & Rows.Count).End(xlUp).Row)
のNの最終行は、L列、N列の最終行の大きいほうを採用するようにしました。
2.N列の「確認」の数がS列の数より大きい場合、M列は空白を設定するようにしました。
(現行は「確認」の数がS列の数より大きい場合、繰り返しを打ち切っているので、そこで止まっています)

VBA

1Sub てすと() 2 3 Dim dt(), ctr As Long, c As Range 4 Dim Lmax As Long 5 Dim Nmax As Long 6 Range("M6:M" & Rows.Count).ClearContents 7 For Each c In Range("S6:S" & Rows.Count).SpecialCells(2) 8 ReDim Preserve dt(ctr) 9 dt(ctr) = c.Value 10 ctr = ctr + 1 11 Next c 12 ctr = 0 13 Lmax = Cells(Rows.Count, "L").End(xlUp).Row 'L列 最終行を求める 14 Nmax = Cells(Rows.Count, "N").End(xlUp).Row 'N列 最終行を求める 15 If Lmax > Nmax Then Nmax = Lmax 'Lmax,Nmaxの大きいほうをNmaxとして採用する 16 For Each c In Range("N6:N" & Nmax) 17 If c.Value = "確認" Then 18 If ctr > UBound(dt) Then '配列上限を超えていれば空白を設定 19 c.Offset(, -1).Value = "" 20 Else 21 c.Offset(, -1).Value = dt(ctr) 22 End If 23 ctr = ctr + 1 24 Else 25 c.Offset(, -1).Value = c.Offset(, -2).Value 26 End If 27 Next c 28 29End Sub

投稿2019/11/27 00:48

tatsu99

総合スコア5438

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

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

ichigo15

2019/11/27 23:59

tatsu99さん 修正点1は思いつかなかったです。 修正点2は盲点でした。 確かにN列の"確認"がS列より多い場合があります 何が原因か解かりやすく説明していただきありがとうございます。 とても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問