|    | 
     フィルタオプションとオートフィルタを使った、私案を参考までに示します。 
 
なお、フィルタオプションを使う関係で、見出しが必須です。 
・ListシートのA3,C3,F3,F3,S3には項目見出しを入れます。 
・ClientシートのA1,B1,C1にも見出しを、 
 それぞれListシートのA3,C3,S3と全く同一のものを記入してください。 
 
Sub 明細シート作成3() 
  Dim wsList   As Worksheet 
  Dim wsClient  As Worksheet 
  Dim wsForm   As Worksheet 
  Dim ws     As Worksheet 
   
  Dim lastRow   As Long 
  Dim myRange   As Range 
  Dim myBody   As Range 
  Dim r      As Range 
 
  Dim rowsClient As Long 
  Dim n      As Long 
  Dim txt     As String 
  Dim no     As String 
  Dim name    As String 
  Dim k      As Long 
 
  Set wsList = Worksheets("List") 
  Set wsClient = Worksheets("Client") 
  Set wsForm = Worksheets("Form") 
 
  'フィルタ範囲の指定 
  lastRow = wsList.Cells(wsList.Rows.Count, 1).End(xlUp).Row 
  Set myRange = wsList.Range(wsList.Cells(3, "A"), wsList.Cells(lastRow, "S")) 
   
  'その本体部分(つまり見出しを除いた部分) 
  Set myBody = Intersect(myRange, myRange.Offset(1)) 
 
  '重複を除いて抽出 
  myRange.AdvancedFilter Action:=xlFilterCopy, _ 
              CopyToRange:=wsClient.Range("A1:C1"), Unique:=True 
 
  '転記 
  rowsClient = wsClient.Cells(wsClient.Rows.Count, 1).End(xlUp).Row 
  For n = 2 To rowsClient 
    txt = wsClient.Cells(n, 1).Value  '受注No 
    no = wsClient.Cells(n, 2).Value   '管理No 
    name = wsClient.Cells(n, 3).Value  '注文者氏名 
 
    '管理No 毎のシートを作成 
    wsForm.Copy After:=Worksheets(Worksheets.Count) 
    Set ws = ActiveSheet 
    ws.name = txt 
 
    '固定項目の転記 
    ws.Range("B34").Value = txt 
    ws.Range("B5").Value = no 
    ws.Range("A3").Value = name 
 
    '管理Noを指定して抽出(品目毎データの転記用) 
    myRange.AutoFilter Field:=3, Criteria1:=no 
 
    'その転記 
    k = 25 
    For Each r In myBody.Columns(1).SpecialCells(xlCellTypeVisible) 
      ws.Cells(k, 1) = r.Cells(1, 6).Value 
      ws.Cells(k, 8) = r.Cells(1, 8).Value 
      k = k + 1 
    Next 
  Next 
  myRange.AutoFilter 
End Sub 
 
  
 | 
     
    
   |