電子書籍の厳選無料作品が豊富!

以下のエクセル表があり、同じ日付ごとのデータを自動的に別のシートに移したいです。
例えば、別のシートに、2004/1/1に書かれているデータのみを移す。(シート2参照)

それをVBAで書くにはどうすればいいでしょうか。
マクロの記録をするのではなく、この表の日付を増やしたり変えたりしても機能するようにコードを書きたいと思っております。

For LoopとIf thenを使い、A1セルがそれより下のセルの値と異なるまでコピーし続ける、、といった作業をすればよいのでしょうか。

全くの初心者で勉強中です。よろしくお願いいたします。

列行 A B
1 2004/1/1 太郎
2 2004/1/1 次郎
3 2004/1/1 三郎
4 2004/1/1 一郎
5 2004/1/1 五郎
6 2005/3/3 三郎
7 2005/3/3 次郎
8 2005/3/3 太郎
9 2005/3/3 四朗
10 2006/2/2 次郎
11 2006/2/2 一郎
12 2006/2/2 太郎


シート2
2004/1/1
太郎
次郎
三郎
一郎
五郎



シート3
2005/3/3
三郎
次郎
太郎
四朗


シート4
2006/2/2
次郎
一郎
太郎

A 回答 (2件)

とりあえず下記のソースでご質問された内容の動作ができてる?ことを確認したので


試してみてください。

使うときの注意点として、
A列には日付、B列には名前を必ず入力することと、
一番左側のワークシート以外は全部削除してしまうので、
下記のプログラムを実行する前にSheet2やSheet3といったワークシートが
削除されてもいいか確認してください。

もし必要であればプログラムの解説もいたします。


Public Sub sub_SplitDate()
Dim i As Long, j As Long, k As Long
Dim lngBeforeDate As Long
Dim lngAfterDate As Long
Dim wbkActiveSheet As Worksheet
Dim rngInputData As Range
Dim r As Range
Dim lngLastRow As Long
Dim varInputArray As Variant

Set wbkActiveSheet = ActiveSheet
With Worksheets(1)
lngLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
For i = 1 To lngLastRow
If i = lngLastRow Then Exit For

lngBeforeDate = DateValue(.Cells(i, 1).Value)
lngAfterDate = DateValue(.Cells(i + 1, 1).Value)

If lngBeforeDate = lngAfterDate Then


Else
j = j + 1

End If

Next i

j = j + 1
If Worksheets.Count > 1 Then
For i = 2 To Worksheets.Count
Application.DisplayAlerts = False
Worksheets(2).Delete
Application.DisplayAlerts = True

Next i

End If
For i = 1 To j
Worksheets.Add after:=Worksheets(Worksheets.Count)

Next i
wbkActiveSheet.Activate

j = 2
k = 1
For i = 1 To lngLastRow
If i = lngLastRow Then Exit For


' MsgBox Worksheets(1).Cells(i, 2).Value
lngBeforeDate = DateValue(.Cells(i, 1).Value)
lngAfterDate = DateValue(.Cells(i + 1, 1).Value)
If lngBeforeDate = lngAfterDate Then
With Worksheets(j)
If k = 1 And i = 1 Then
MsgBox Worksheets(1).Cells(i, 2).Value

.Cells(k, 1).Value = Worksheets(1).Cells(i, 1).Value
k = k + 1
.Cells(k, 1).Value = Worksheets(1).Cells(i, 2).Value
k = k + 1

Else
.Cells(k, 1).Value = Worksheets(1).Cells(i, 2).Value
k = k + 1

End If
End With
Else
Worksheets(j).Cells(k, 1).Value = Worksheets(1).Cells(i, 2).Value
j = j + 1
k = 1
Worksheets(j).Cells(k, 1).Value = Worksheets(1).Cells(i, 1).Value
k = k + 1
Worksheets(j).Cells(k, 1).Value = Worksheets(1).Cells(i, 2).Value

End If

Next i
Worksheets(j).Cells(k, 1).Value = Worksheets(1).Cells(lngLastRow, 2).Value

End With


End Sub
    • good
    • 0

>For LoopとIf thenを使い、A1セルがそれより下のセルの値と異なるまでコピー



セルを一つ一つ舐め回して書き写していくのは,まぁ一番「簡単そう」なのでそういうやり方を好むヒトもいますが,一番遅くて効率の悪い方法です。


幾つか,ご相談の言葉足らずで前提条件が不明な箇所があります。
●そもそもふつーは1行目にタイトル行,2行目から実データにしますが,ホントにご質問で例示されたようにいきなり一行目から実データを列記しているのですか。
●A列の日付は,必ず昇順で既に並べ替えてあるのですか。それともホントは順不同のデータを処理したいのですか。
●いまは「1/1のデータを移す」と,あたかもリストに1/1があり3/3がある事が「既知の事実」であるかのように書かれていますが,ホントにやりたいのは「日付に該当するシートもマクロで作成する」ところからではないのですか。それともそこは判ってるので質問していない(回答不要)のですか。



準備:
ブックを開く
Sheet1にデータを用意する
ALT+F11を押す
挿入メニューから標準モジュールを挿入する
標準モジュールにマクロを記載する

作成例:
sub macro1()
 dim h as range
 for each h in worksheets("Sheet1").range("A1:A" & worksheets("Sheet1").range("A65536").end(xlup).row)
’シートを用意する
 if application.countif(worksheets("Sheet1").range("A1:A" & h.row), h.value) = 1 then
  worksheets.add after:=worksheets(worksheets.count)
  activesheet.name = format(h.value ,"yyyymmdd")
  h.copy destination:=range("A1")
 end if

’データを転記する
 worksheets(format(h.value, "yyyymmdd")).range("A65536").end(xlup).offset(1).value = h.offset(0, 1).value
 next
end sub
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!