予定表を作成しております。
完了した予定ついて履歴を残したいので、ボタンをクリックするとシート1のU列に「完了」
と記入されている行をシート2の3行目~に転記(切り取り)されるものを作成したいです
シート2にはシート1の完了した予定がどんどん転記されるイメージです。
【シート1】
B列の8行目からAM列の307行(B8:AM307)を使用した予定表があります。
予定が完了した行についてはU列に「完了」と記入しています。
【シート2】
シート1のU列に完了と記入されている行をシート2のB列3行目~に転記したいです。
自分なりに調べてみたのですが下記のコードだと中途半端な行しか転記されません。
ご教授お願い致します。
Private Sub kanryou_Click()
Dim i, LastRow As Long
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To LastRow
If Cells(i, 21) = "完了" Then
Rows(i).Cut Sheets("完了分").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
End If
Next i
End Sub
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
こちらになります。こちらでは簡単な確認しか行っていません。
特に各列の細かい確認(関数式の列とそうでない列の確認)はしていません。
あなたのほうで、詳細の確認をお願いします。
VBA
1Private Sub kanryou_Click() 2 Const endRow As Long = 307 3 Const startRow As Long = 8 4 Dim wrow As Long, LastRow As Long 5 Dim fromRow As Long 6 Dim toRow As Long 7 Dim sh1 As Worksheet 8 Dim sh2 As Worksheet 9 Dim dicT As Object '完了の行番号記憶 10 Dim ctr As Long '完了の件数 11 Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義 12 Set sh1 = Worksheets("予定表") 13 Set sh2 = Worksheets("完了分") 14 LastRow = sh2.Cells(Rows.Count, "B").End(xlUp).Row + 1 15 If LastRow < 3 Then LastRow = 3 16 ctr = 0 17 For wrow = startRow To endRow 18 If sh1.Cells(wrow, "U") = "完了" Then 19 sh1.Range("B" & wrow & ":AM" & wrow).Copy sh2.Range("B" & LastRow & ":AM" & LastRow) 20 sh1.Cells(wrow, "U") = "" 21 ctr = ctr + 1 22 If ctr = 1 Then 23 toRow = wrow 24 fromRow = wrow 25 End If 26 dicT(wrow) = True 27 LastRow = LastRow + 1 28 End If 29 Next wrow 30 If ctr = 0 Then 31 MsgBox ("完了行なし") 32 Exit Sub 33 End If 34 Do While (toRow < endRow) 35 fromRow = get_from_row(dicT, endRow, fromRow + 1) 36 If fromRow = -1 Then 37 Exit Do 38 End If 39 Call move_line(sh1, toRow, fromRow) 40 toRow = toRow + 1 41 Loop 42 For wrow = endRow - ctr + 1 To endRow 43 Call clear_line(sh1, wrow) 44 Next 45 MsgBox (ctr & "行 処理完了") 46End Sub 47 48Private Function get_from_row(ByVal dicT As Object, ByVal endRow As Long, ByVal fromRow As Long) As Long 49 get_from_row = -1 50 Do 51 If fromRow > endRow Then Exit Function 52 If dicT.Exists(fromRow) = False Then 53 get_from_row = fromRow 54 Exit Function 55 End If 56 fromRow = fromRow + 1 57 Loop 58End Function 59 60Private Sub move_line(ByVal ws As Worksheet, ByVal toRow As Long, ByVal fromRow As Long) 61 ws.Range("B" & toRow).Value = ws.Range("B" & fromRow).Value 62 ws.Range("C" & toRow).Value = ws.Range("C" & fromRow).Value 63 ws.Range("E" & toRow).Value = ws.Range("E" & fromRow).Value 64 ws.Range("G" & toRow & ":U" & toRow).Value = ws.Range("G" & fromRow & ":U" & fromRow).Value 65 ws.Range("AJ" & toRow).Value = ws.Range("AJ" & fromRow).Value 66 ws.Range("AL" & toRow).Value = ws.Range("AL" & fromRow).Value 67End Sub 68 69Private Sub clear_line(ByVal ws As Worksheet, ByVal toRow As Long) 70 ws.Range("B" & toRow).ClearContents 71 ws.Range("C" & toRow).ClearContents 72 ws.Range("E" & toRow).ClearContents 73 ws.Range("G" & toRow & ":U" & toRow).ClearContents 74 ws.Range("AJ" & toRow).ClearContents 75 ws.Range("AL" & toRow).ClearContents 76End Sub 77
投稿2020/11/17 06:21
総合スコア5493
0
オートフィルターで抽出して、
コピペしたら、ループをVBAで書く必要がなくなります。
ただし、表にタイトル行が必要になります。
この方法でやるなら、マクロの記録をしてみるところから始めます。
また、サンプルがネット上にありそうな気がします。
また、フィルターオプションの機能で抽出すれば、
VBAのコードがさらに少なるかもしれません。
シート上を汚すことにはなりますが。。。。
あ、コピペじゃなくて、移動なんですかね。
なら、オートフィルターですね。
投稿2020/11/13 10:03
編集2020/11/13 10:05総合スコア2163
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
これでどうでしょうか。
VBA
1Private Sub kanryou_Click() 2 Dim wrow As Long, LastRow As Long 3 Dim sh1 As Worksheet 4 Dim sh2 As Worksheet 5 Set sh1 = Worksheets("Sheet1") 6 Set sh2 = Worksheets("完了分") 7 LastRow = sh2.Cells(Rows.Count, "B").End(xlUp).Row + 1 8 If LastRow < 3 Then LastRow = 3 9 For wrow = 8 To 307 10 If sh1.Cells(wrow, 21) = "完了" Then 11 sh1.Range("B" & wrow & ":AM" & wrow).Cut sh2.Range("B" & LastRow & ":AM" & LastRow) 12 LastRow = LastRow + 1 13 End If 14 Next wrow 15End Sub 16
投稿2020/11/13 09:48
総合スコア5493
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/13 09:59
2020/11/16 02:15
2020/11/17 00:06 編集
2020/11/16 04:29
2020/11/17 00:08
2020/11/17 01:20
2020/11/17 01:27
2020/11/17 01:33
2020/11/17 02:48
2020/11/17 02:50
2020/11/17 05:37
2020/11/17 05:38
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/17 06:51