|
今一、不明な点がありますが?
Option Explicit
Public Sub Sample()
'◆dataのデータ列数(A列〜C列)
Const clngColumns As Long = 3
'◆「機種名」の有る列(A列のA列からの列Offset)
Const clngGroup As Long = 0
'◆転記先の連番出力列位置を設定
'(基準位置からの列Offset:A列)
Const clngNumb As Long = 0
'◆転記先の「機種名」出力列位置を設定
'(基準位置からの列Offset:B列)
Const clngItem As Long = 1
'◆転記先の「連番」「機種名」出力行位置を設定
'(基準位置からの行Offset:6行)
Const clngRow As Long = 5
Dim i As Long
Dim j As Long
Dim lngRows As Long
Dim lngTop As Long
Dim lngCount As Long
Dim rngList As Range
Dim rngResult As Range
Dim rngHeader As Range
Dim lngSerial As Long
Dim lngWrite As Long
Dim vntGroup As Variant
Dim vntMark As Variant
Dim vntPost As Variant
Dim lngOffset As Long
Dim strProm As String
'◆転記元列を転記元基準位置からの列Offsetで指定
'「品番」B列=1、「数量」C列=2
vntMark = Array(1, 2)
'◆転記先列を転記先基準位置からの列Offsetで指定
'「品番」A列=0、「数量」E列=4
vntPost = Array(0, 4)
'画面更新を停止
Application.ScreenUpdating = False
'◆Listの先頭セル位置を基準とする(A列の列見出しのセル位置)
Set rngList = Worksheets("data").Range("A1")
'◆formの転記範囲を指定
Set rngHeader = Worksheets("form").Range("A1:S8")
'formの行数取得
lngOffset = rngHeader.Rows.Count
With rngList
'行数の取得
lngRows = .Offset(Rows.Count - .Row, clngGroup).End(xlUp).Row - .Row
If lngRows <= 0 Then
strProm = "データが有りません"
GoTo Wayout
End If
'データをA列で整列
DataSort .Offset(1).Resize(lngRows, clngColumns), .Offset(, clngGroup)
'A列データを配列に取得
vntGroup = .Offset(1, clngGroup).Resize(lngRows + 1).Value
End With
'転記先の基準位置を設定
With rngList.Parent.Parent
Set rngResult = .Worksheets.Add(After:=rngList.Parent).Range("A1")
End With
'列幅を設定
With rngHeader
For i = 1 To .Columns.Count
rngResult.Offset(, i - 1).EntireColumn.ColumnWidth _
= .Cells(1, i).EntireColumn.ColumnWidth
Next i
End With
'注目値の位置を記録
lngTop = 1
'データ行数のカウント初期値
lngCount = 1
For i = 2 To lngRows + 1
'注目値と現在値が違った場合
If vntGroup(lngTop, 1) <> vntGroup(i, 1) Then
'Headerを出力
rngHeader.Copy Destination:=rngResult.Offset(lngWrite)
'「連番」、「機種名」を出力
With rngResult
.Offset(lngWrite + clngRow, clngItem).Value = vntGroup(lngTop, 1)
With .Offset(lngWrite + clngRow, clngNumb)
lngSerial = lngSerial + 1
.NumberFormatLocal = "000000"
.Value = lngSerial
End With
'出力位置を更新
lngWrite = lngWrite + lngOffset
'「品番」、「数量」データを転記
For j = 0 To UBound(vntMark)
.Offset(lngWrite, vntPost(j)).Resize(lngCount).Value _
= rngList.Offset(lngTop, vntMark(j)).Resize(lngCount).Value
Next j
'出力位置を更新
lngWrite = lngWrite + lngCount
End With
'注目値の位置を記録
lngTop = i
'データ行数のカウント初期値に
lngCount = 1
Else
'データ行数のカウントを更新
lngCount = lngCount + 1
End If
Next i
strProm = "処理が完了しました"
Wayout:
'画面更新を再開
Application.ScreenUpdating = True
Set rngList = Nothing
Set rngResult = Nothing
Set rngHeader = Nothing
MsgBox strProm, vbInformation
End Sub
Private Sub DataSort(rngScope As Range, _
rngKey As Range, _
Optional lngOrientation As Long = xlTopToBottom)
rngScope.Sort _
Key1:=rngKey, Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False, _
Orientation:=lngOrientation, SortMethod:=xlStroke
End Sub
|
|