|
データシートの内容が殆ど解らないので上手く行くかは?だけど作って見ました
一応、A列、B列の1行目からデータが有る物としています
また、内訳が、列見出しに出力する物以外が出た場合、無視されます
Option Explicit
Public Sub Sample()
Dim i As Long
Dim lngRows As Long
Dim lngRow As Long
Dim lngColumn As Long
Dim rngList As Range
Dim vntData As Variant
Dim rngResult As Range
Dim vntColumns As Variant
Dim strProm As String
'結果出力Listの左上隅セル位置を基準として設定(見出しの「データ名」のセル位置)
Set rngResult = Worksheets("Sheet2").Cells(1, "A")
With rngResult
'行見だしを保持する配列を仮に確保
ReDim vntRows(0)
'列見だしを配列に取得(実際に含まれる文字列に修正する事)
vntColumns = Array("合計", "内訳1", "内訳2", "内訳3", "内訳4", "内訳5", "内訳6")
'列見だしを出力
.Value = "データ名"
.Offset(, 1).Resize(, UBound(vntColumns) + 1).Value = vntColumns
End With
'データListの左上隅セル位置を基準として設定
Set rngList = Worksheets("Sheet1").Cells(1, "A")
With rngList
'データ行数を取得
lngRows = .Offset(65536 - .Row).End(xlUp).Row - .Row + 1
'データが無い場合
If lngRows <= 1 And .Value = "" Then
strProm = "データが有りません"
GoTo Wayout
End If
'データを配列に取得
vntData = .Resize(lngRows, 2).Value
End With
'画面更新を停止
Application.ScreenUpdating = False
'集計
For i = 1 To lngRows
'A列の値に"データ名"が含まれる場合(実際にセルに書いて有る値に含まれる文字列にする事)
If InStr(1, vntData(i, 1), "データ名", vbTextCompare) > 0 Then
'出力行を更新
lngRow = lngRow + 1
'データ名を結果シートに出力
rngResult.Offset(lngRow).Value = vntData(i, 2)
Else
'A列の値が、どの内訳に当たるか探索
lngColumn = GetColumnPos(vntData(i, 1), vntColumns)
'該当する内訳が有った場合
If lngColumn > 0 Then
'結果シートにB列の値を書き込む
rngResult.Offset(lngRow, lngColumn).Value = vntData(i, 2)
End If
End If
Next i
strProm = "処理が完了しました"
Wayout:
'画面更新を再開
Application.ScreenUpdating = True
Set rngList = Nothing
Set rngResult = Nothing
MsgBox strProm, vbInformation
End Sub
Private Function GetColumnPos(vntKey As Variant, _
vntScope As Variant) As Long
Dim i As Long
Dim lngListEnd As Long
'行見出しの行数を取得
lngListEnd = UBound(vntScope, 1)
'範囲からKeyを探索
For i = 0 To lngListEnd
'もし、行見出しと探索Keyが合致したら戻り値として行位置を返す
If InStr(1, vntKey, vntScope(i), vbTextCompare) > 0 Then
GetColumnPos = i + 1
Exit Function
End If
Next i
End Function
|
|