|
列見出しを付けるついでに、「シートB」の結果を消去する様にしました
Option Explicit
Public Sub Sample2()
'◆Listデータ列数(A列〜G列)
Const clngColumns As Long = 7
'PDの始まる列位置を指定(基準位置からの列Offsetで指定:C列)
Const clngPD As Long = 2
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 vntResult As Variant
Dim lngWrite As Long
Dim vntPD As Variant
Dim strProm As String
'◆Listの先頭セル位置を基準とする(A列の列見出しのセル位置)
Set rngList = Worksheets("シートA").Cells(1, "A")
'◆結果の先頭セル位置を基準とする(A列の列見出しのセル位置)
Set rngResult = Worksheets("シートB").Cells(1, "A")
With rngResult
'行数の取得
lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row
If lngRows > 0 Then
.Parent.UsedRange.ClearContents
End If
.Resize(, 4).Value = Array("CD", "NAME", "PD", "MB")
End With
With rngList
'行数の取得
lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row
If lngRows <= 0 Then
strProm = "データが有りません"
GoTo Wayout
End If
' lngRows = lngRows - 1 '★削除(無くても構わなかった)
'PDを配列に取得
vntPD = .Resize(, clngColumns).Value
'基準位置を1つ下に変更
' Set rngList = .Offset(1) '★削除(無くても構わなかった)
End With
'結果用配列を確保
ReDim vntResult(1 To 4)
'画面更新を停止
Application.ScreenUpdating = False
For i = 1 To lngRows
'Listから1行分を配列に取得
vntData = rngList.Offset(i).Resize(, clngColumns).Value
'先頭2列を結果配列に転記
For j = 1 To 2
vntResult(j) = vntData(1, j)
Next j
'3列目から後ろ見て行く
For j = clngPD + 1 To clngColumns
If vntData(1, j) <> "" Then
'PD、MBを転記
vntResult(3) = vntPD(1, j)
vntResult(4) = vntData(1, j)
'"シートB"に転記
lngWrite = lngWrite + 1
rngResult.Offset(lngWrite).Resize(, UBound(vntResult)).Value = vntResult
End If
Next j
Next i
strProm = "処理が完了しました"
Wayout:
'画面更新を再開
Application.ScreenUpdating = True
Set rngList = Nothing
Set rngResult = Nothing
MsgBox strProm, vbInformation
End Sub
|
|