|
もう見ていないかな?
手動で操作する手順ほぼそのままで
Option Explicit
Public Sub Sample_1()
'Listのデータ列数(A列〜C列)
Const clngColumns As Long = 3
'分割位置と成る列位置(基準列からの列Offset:2列目=C列)
Const clngSplit As Long = 2
Dim i As Long
Dim lngRows As Long
Dim rngList As Range
Dim lngKeys() As Long
Dim strProm As String
'Listの先頭セル位置を基準とする(先頭列の列見出しのセル位置)
Set rngList = ActiveSheet.Range("A1")
'画面更新を停止
Application.ScreenUpdating = False
With rngList
'行数の取得
lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row + 1
If lngRows <= 1 And .Value = "" Then
strProm = "データが有りません"
GoTo Wayout
End If
'整列Keyを作成
ReDim lngKeys(1 To lngRows, 1 To 1)
For i = 1 To lngRows
lngKeys(i, 1) = i
Next i
'Listの分割列以降をB列最終行の下にCut&Paste
.Offset(, clngSplit).Resize(lngRows, clngColumns - clngSplit).Cut _
Destination:=.Offset(lngRows, clngSplit - 1)
'現在の最終列の後ろ(C列)に連番を付加
.Offset(, clngSplit).Resize(lngRows).Value = lngKeys
.Offset(lngRows, clngSplit).Resize(lngRows).Value = lngKeys
'連番をKeyにListを整列
.Resize(lngRows * 2, clngColumns - clngSplit + 2).Sort _
Key1:=.Offset(, clngSplit), Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom, SortMethod:=xlStroke
'連番を消去
.Offset(, clngSplit).EntireColumn.ClearContents
'A列をMerge
For i = 1 To lngRows * 2 Step 2
.Cells(i, 1).Resize(2).Merge
Next i
End With
strProm = "処理が完了しました"
Wayout:
'画面更新を再開
Application.ScreenUpdating = True
Set rngList = Nothing
MsgBox strProm, vbInformation
End Sub
|
|