Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1858 / 13645 ツリー ←次へ | 前へ→

【71465】【Excel VBA】コピー&ペーストの自動化 bofbof 12/3/6(火) 23:39 質問[未読]
【71466】Re:【Excel VBA】コピー&ペーストの自動化 UO3 12/3/7(水) 0:50 回答[未読]
【71467】Re:【Excel VBA】コピー&ペーストの自動化 UO3 12/3/7(水) 0:52 発言[未読]
【71468】Re:【Excel VBA】コピー&ペーストの自動化 Hirofumi 12/3/7(水) 0:58 回答[未読]

【71465】【Excel VBA】コピー&ペーストの自動化
質問  bofbof  - 12/3/6(火) 23:39 -

引用なし
パスワード
   【Excel VBA】コピー&ペーストの自動化
以下のエクセル表があり、同じ日付ごとのデータを自動的に別のシートに移したいです。
例えば、別のシートに、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
次郎
一郎
太郎

【71466】Re:【Excel VBA】コピー&ペーストの自動...
回答  UO3  - 12/3/7(水) 0:50 -

引用なし
パスワード
   ▼bofbof さん:

元シートのD列を作業列に使います。
また、転記するシートはシート名が日付になります。(あれば、それを使いますし、なければ作成します)
転記レイアウトは、ご希望のものと少し違いますが、試してみてください。
機能としてはフィルターオプションを使っています。

Sub Sample()
  Dim c As Range
  Dim shnm As String
  Dim sh As Worksheet
  
  Application.ScreenUpdating = False
  
  With Sheets("Sheet1")  '元シート名は実際のものに
    .Columns("D").ClearContents
    .Columns("A:A").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range("D1"), Unique:=True
    For Each c In .Range("D2", .Range("D" & .Rows.Count).End(xlUp))
      shnm = Format(c.Value, "yyyy""年""mm""月""dd""日""")
      If IsObject(Evaluate("'" & shnm & "'!A1")) Then
        Set sh = Sheets(shnm)
        sh.Cells.ClearContents
      Else
        Sheets.Add
        Set sh = ActiveSheet
        sh.Name = shnm
      End If
      
      sh.Range("A1") = .Range("A1").Value
      sh.Range("A2").Value = c.Value
      sh.Range("B1").Value = .Range("B1").Value
      .Columns("A:B").AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=sh.Range("A1:A2"), CopyToRange:=sh.Range("B1"), Unique:=False
    Next
    .Columns("D").ClearContents
  End With
  
  Application.ScreenUpdating = True
  MsgBox "処理が終了しました"
  
End Sub

【71467】Re:【Excel VBA】コピー&ペーストの自動...
発言  UO3  - 12/3/7(水) 0:52 -

引用なし
パスワード
   ▼bofbof さん:

大事なことを書き忘れていました。
元シートのA列、B列の1行目はタイトル行にしてください。
(日付、名前 とか)

【71468】Re:【Excel VBA】コピー&ペーストの自動...
回答  Hirofumi  - 12/3/7(水) 0:58 -

引用なし
パスワード
   こんなのでは?

Option Explicit

Public Sub Sample()

  Dim i As Long
  Dim lngRows As Long
  Dim wksList As Worksheet
  Dim wksResult As Worksheet
  Dim lngTop As Long
  Dim lngCount As Long
  Dim strProm As String

  Set wksList = Worksheets("Sheet1")

  '仮にデータの在るシートと同じにしておく
  Set wksResult = wksList
  
  '行位置の取得
  lngRows = wksList.Cells(Rows.Count, "A").End(xlUp).Row
  
  '画面更新を停止
  Application.ScreenUpdating = False
  
  With wksList
    '日付先頭位置を初期値に
    lngTop = 1
    '同一日付のカウントを初期化
    lngCount = 1
    '日付列に就いて繰り返し
    For i = 2 To lngRows + 1
      '日付先頭と日付が違うなら
      If .Cells(lngTop, "A").Value <> .Cells(i, "A").Value Then
        '出力シートを取得
        GetSheet wksResult
        '日付を転記
        wksResult.Cells(1, "A").Value = .Cells(lngTop, "A").Value
        '名前を転記
        .Cells(lngTop, "B").Resize(lngCount).Copy _
            Destination:=wksResult.Cells(2, "A")
        '日付先頭位置を更新
        lngTop = i
        '同一日付のカウントを初期化
        lngCount = 1
      Else
        '同一日付のカウントを更新
        lngCount = lngCount + 1
      End If
    Next i
  End With
  
  strProm = "処理が完了しました"
   
Wayout:

  '画面更新を再開
  Application.ScreenUpdating = True
  
  Set wksList = Nothing
  Set wksResult = Nothing
   
  MsgBox strProm, vbInformation
     
End Sub

Private Sub GetSheet(wksMark As Worksheet)

  Dim i As Long
  
  On Error GoTo ErrorHandler
    
  For i = 1 To Worksheets.Count
    If wksMark.Name = Worksheets(i).Name Then
      Exit For
    End If
  Next i
      
  Set wksMark = Worksheets(i + 1)
  
  wksMark.UsedRange.ClearContents
  
  Exit Sub
  
ErrorHandler:
  
  Set wksMark = Worksheets.Add(After:=wksMark)

End Sub

1858 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free