下記のコードで、データ出力時に条件に合うデータを上から順に詰めて出力していきたいのですが、条件に合わない場合の空白セルを含んで出力されてしまいます。
targetrowの記述周りがおかしいと思うのですが原因がわかりません。デバッグでエラーもありません。
どのように修正すれば上から順に詰めて出力できるでしょうか?
ご教授お願い致します。
Sub 勤務区分入力()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim lastRow As Long
Dim i As Long
Dim targetRow As Long
' シート1とシート2を設定
Set ws1 = ThisWorkbook.Sheets("入力シート")
Set ws2 = ThisWorkbook.Sheets("出力シート")
' シート1の最終行を取得
lastRow = ws1.Cells(ws1.Rows.Count, "F").End(xlUp).Row
' Sheet2のG列から上に向かってデータを埋めるための行を設定
targetRow = 7
' データを検査してコピー
For i = 9 To lastRow ' A2から最終行まで
If ws1.Cells(i, 6).Value = "日勤" And IsEmpty(ws1.Cells(i, 5).Value) Then
ws2.Cells(i - 2, 3).Value = "17:00~18:00"
ws2.Cells(i - 2, 4).Value = "17:00~"
ElseIf ws1.Cells(i, 6).Value = "6:45早出" And IsEmpty(ws1.Cells(i, 5).Value) Then
ws2.Cells(i - 2, 3).Value = "15:15~16:15"
ws2.Cells(i - 2, 4).Value = "15:15~"
ElseIf ws1.Cells(i, 6).Value = "11時遅出" And IsEmpty(ws1.Cells(i, 5).Value) Then
ws2.Cells(i - 2, 3).Value = "19:30~20:30"
ws2.Cells(i - 2, 4).Value = "19:30~"
End If
' 次の行に移動
targetRow = targetRow + 1
Next i
' リリースオブジェクト
Set ws1 = Nothing
Set ws2 = Nothing
End Sub
No.2ベストアンサー
- 回答日時:
以下のようにしてください。
Sub 勤務区分入力()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim lastRow As Long
Dim i As Long
Dim targetRow As Long
' シート1とシート2を設定
Set ws1 = ThisWorkbook.Sheets("入力シート")
Set ws2 = ThisWorkbook.Sheets("出力シート")
' シート1の最終行を取得
lastRow = ws1.Cells(ws1.Rows.Count, "F").End(xlUp).Row
' Sheet2の7行から下に向かってデータを埋めるための行を設定
targetRow = 7
' データを検査してコピー
For i = 9 To lastRow ' A2から最終行まで
If ws1.Cells(i, 6).Value = "日勤" And IsEmpty(ws1.Cells(i, 5).Value) Then
ws2.Cells(targetRow, 3).Value = "17:00~18:00"
ws2.Cells(targetRow, 4).Value = "17:00~"
targetRow = targetRow + 1
ElseIf ws1.Cells(i, 6).Value = "6:45早出" And IsEmpty(ws1.Cells(i, 5).Value) Then
ws2.Cells(targetRow, 3).Value = "15:15~16:15"
ws2.Cells(targetRow, 4).Value = "15:15~"
targetRow = targetRow + 1
ElseIf ws1.Cells(i, 6).Value = "11時遅出" And IsEmpty(ws1.Cells(i, 5).Value) Then
ws2.Cells(targetRow, 3).Value = "19:30~20:30"
ws2.Cells(targetRow, 4).Value = "19:30~"
targetRow = targetRow + 1
End If
Next i
' リリースオブジェクト
Set ws1 = Nothing
Set ws2 = Nothing
End Sub
ご回答ありがとうございます。
targetRow = targetRow + 1がそれぞれの条件で必要だったのですね。
コードの全文記述ありがとうございます。
今後もよろしくお願いします。
No.1
- 回答日時:
こんにちは
うまくいかないコードだけ見せられても、何をしたいのかよくわかりませんね。
なんとなくの雰囲気だけですが、おかしそうな点を挙げてみると・・
>For i = 9 To lastRow ' A2から最終行まで
・コメントには「A2から」とあるけれど、多分、9行目からになっている。
・そのループ内でws2に転記している行は、「i - 2」行目となっていて、
ws1の行番号依存なので、質問タイトルにある「抽出して(してないのかも?)
詰めて転記」をしているとは思えない。
抽出処理はなく、ws1の全行をなんらかの形で転記するのなら、
ws1の行番号依存でもよさそうですけれど・・
>targetRow = 7
・通常なら、転記先の行番号とかなのでしょうけれど、処理内で使用していない
ので意味をもたない変数になっている。
想像するところ、出力先の行番号はこの変数の示す行なのではないでしょうか。
(↑勝手な妄想ですけれど・・)
>条件に合わない場合の空白セルを含んで出力されてしまいます
・条件に合わない行(?)として扱われるのは、ご提示のループでは、IF及び
ElseIfの条件で偽となる行は処理を行わずに、次の行に進むことになります。
その条件の内容が、実際に処理をしないものと一致しているのか再確認
してみましょう。
※ 何をしたいのか理解できない状態で回答していますので、あくまでもご参考までに。
※ もしも、ご自身でデバッグする気があるのなら、例えばブレークポイントを設定して、1行ずつ処理をさせてみて、思っていることと違う結果になった時の処理を調べてみるとかが考えられます。
さらには、ステップ実行を併用するなどで、原因となっている箇所を特定できるものと思います。
ご回答ありがとうございます。
>For i = 9 To lastRow ' A2から最終行まで
これはコメントのミスでした。
>targetRow = 7
出力先の行番号と思って記載しておりました。。。。
>条件に合わない場合の空白セルを含んで出力されてしまいます
>条件に合わない行(?)として扱われるのは、ご提示のループでは、IF及びElseIfの条件で偽となる行は処理を行わずに、次の行に進むことになります。
IFとElseIFの条件が理解できていなかったみたいです。。。勉強します。
ご丁寧にありがとうございます。ステップ実行して調べたりはしたのですが、今度質問するときはもう少し詳細に分からないことを記述しようと思いました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルマクロでデータ出力の際の条件がうまく機能しません。 5 2023/10/01 12:50
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- Visual Basic(VBA) エクセルマクロで出力行の増やし方がわかりません。 4 2023/09/28 23:40
- Visual Basic(VBA) 条件をつけてカウントする 4 2021/12/19 20:27
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) Excel VABについて 1.xlsm、VBA.xlsm2つのファイルがあり、1.xlsmにてVB 6 2021/12/13 17:46
- Visual Basic(VBA) 【VBA】ユーザーフォーム リストボックスのヘッダー設定方法 2 2021/12/02 11:15
- Visual Basic(VBA) 空のシートに関数を入れたい 2 2021/12/03 15:08
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数シートからデータを拾って...
-
エクセルファイルのシート毎の容量
-
Excelでシートの違うデータでグ...
-
excelの不要な行の削除ができな...
-
シート削除して同名シート追加...
-
トランジスタの選び方
-
【エクセルマクロ】複数シート...
-
Excelマクロ 差分抽出の方法が...
-
エクセルで複数行のデータを1列...
-
EXCEL 複数行のデータを1行にま...
-
エクセル VBA VLOOKUP
-
Excelで日付変更ごとに、自動的...
-
LM340T-18とLM320T-18の違いは...
-
ファンモータが作動しない。
-
重いExcelファイルのことで教え...
-
時間帯の重複を除いた集計について
-
コンボボックスの参照先(ListF...
-
Excelファイルの容量が異常に大...
-
エクセル マクロ "特定の日付...
-
【Excel】マクロでグラフ系列に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数シートからデータを拾って...
-
エクセルファイルのシート毎の容量
-
Excelでシートの違うデータでグ...
-
excelの不要な行の削除ができな...
-
シート削除して同名シート追加...
-
Excelで日付変更ごとに、自動的...
-
EXCELで2つのファイルから重複...
-
VBAで CTRL+HOMEの位置へ移動...
-
オートフィルタで抽出したデー...
-
トランジスタの選び方
-
ファンモータが作動しない。
-
EXCEL 複数行のデータを1行にま...
-
別々のシートの表をピボットテ...
-
エクセルのカメラ機能について
-
エクセル マクロ "特定の日付...
-
他のシートの一番下の行データ...
-
(VBAにて)日付でデータを抽出す...
-
エクセルVBAで、特定文字から始...
-
【エクセル」 特定のセルで条件...
-
EXCEL の表を一行ずつシートに...
おすすめ情報