|
長く成るけどこんな事?
詳しく見てないので合っているのか解りませんが?
コード的には、Sheet1のデータを「勘定科目」と言う配列変数の順番に、
Sheet2にCopyして居るだけなのかな?
だとすれば、Sheet1のデータを丸ごとSheet2にCopyして
最終列の後ろを作業列とし、其処に「勘定科目の順番に番号を入れて整列(ソート)すれば善いかも?
Option Explicit
Public Sub Sample()
'◆データ列数(A列〜Q列)
Const clngColumns As Long = 17
'◆勘定科目の列を指定(基準列からの列Offsetで指定:E列=4)
Const clngItems As Long = 4
Dim i As Long
Dim j As Long
Dim lngRows As Long
Dim rngList As Range
Dim rngResult As Range
Dim vntData As Variant
Dim vntItems As Variant
Dim lngCount As Long
Dim strProm As String
'◆Sheet1の先頭セル位置を基準とする(A列の列見出しのセル位置)
Set rngList = Worksheets("Sheet1").Cells(6, "A")
'◆Sheet2の先頭セル位置を基準とする
Set rngResult = Worksheets("Sheet2").Cells(2, "A")
'画面更新を停止
Application.ScreenUpdating = False
With rngResult
'行数の取得
lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row
If lngRows > 0 Then
'結果を消去
.Offset(1).Resize(lngRows, clngColumns).ClearContents
End If
End With
With rngList
'行数の取得
lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row
If lngRows <= 0 Then
strProm = "データが有りません"
GoTo Wayout
End If
'勘定科目の列の値を配列に取得
vntData = .Offset(1, clngItems).Resize(lngRows + 1).Value
'Sheet1をSheet2にCopy
.Offset(1).Resize(lngRows + 1, clngColumns).Copy Destination:=rngResult
End With
vntItems = Array("", "入金票", "交換小切手", "先付小切手", _
"福利厚生積立金", "退職積立金", "受取手形", _
"売掛金", "未収金", "支払手形", "買掛金", _
"未払金", "給料", "賞与", "退職金", _
"法定福利費", "福利厚生費", "旅費交通費", _
"通信費", "運賃", "広告宣伝費", "・・・・・など91の勘定科目があります")
'整列Keyを作成
For i = 1 To lngRows
'勘定科目配列に値が有るかを確認
For j = 1 To UBound(vntItems)
If vntItems(j) = vntData(i, 1) Then
Exit For
End If
Next j
'整列Keyを配列に出力
vntData(i, 1) = j
Next i
With rngResult
'整列KeyをSheet2に出力
.Offset(, clngColumns).Resize(lngRows).Value = vntData
'整列Keyでデータを整列
.Resize(lngRows, clngColumns + 1).Sort _
Key1:=.Offset(, clngColumns), Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom, SortMethod:=xlStroke
'整列Keyを配列に再取得
vntData = .Offset(, clngColumns).Resize(lngRows + 1).Value
'整列Keyを上から見て行く
lngCount = lngRows - 1
For i = 1 To lngRows
'整列Keyの番号が下の行と変わったら
If vntData(i, 1) <> vntData(i + 1, 1) Then
'最終行の下に列見出しと番号を出力
lngCount = lngCount + 1
.Offset(lngCount, clngColumns).Resize(2).Value = vntData(i, 1) - 0.5
lngCount = lngCount + 1
rngList.Resize(, clngColumns).Copy Destination:=.Offset(lngCount)
End If
Next i
'整列Keyでデータを整列
.Resize(lngCount + 1, clngColumns + 1).Sort _
Key1:=.Offset(, clngColumns), Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom, SortMethod:=xlStroke
'整列Keyを消去
.Offset(1, clngColumns).EntireColumn.ClearContents
End With
strProm = "処理が完了しました"
Wayout:
'画面更新を再開
Application.ScreenUpdating = True
Set rngList = Nothing
Set rngResult = Nothing
MsgBox strProm, vbInformation
End Sub
|
|