|
こんにちは。かみちゃん です。
>> ようやく仕様が理解できましたので、検討します。
>> 少しお時間をいただければと思います。
>> できるだけkamabokoさんのコードをベースにします
>>
> 本当にお手間を取らせました。
kamabokoさんが提示されたコードをベースにしようとしましたが、
結果としてほとんど原型をとどめないものになってしまいました。
他にももっと効率のようものがあるとは思いますが、以下のような
感じで処理できると思います。
Option Explicit
Option Base 1
Sub 支店別シート統合()
Dim シート名 As Variant
Dim 開始セル As String
Dim i As Long
Dim WS1 As Worksheet, WS2 As Worksheet
Dim v1 As Variant, v2 As Variant
Dim ii As Long, jj As Long, kk As Long
Dim i_Max As Long
Dim m As Variant
シート名 = Array("札幌", "仙台", "新潟", "中央", "品川", "新宿", "世田谷", "港", "さいたま", "千葉", "横浜", "静岡", "名古屋", "京都", "大阪")
開始セル = "$A$3"
Set WS1 = Nothing
On Error Resume Next
Set WS1 = Sheets("一覧")
On Error GoTo 0
If WS1 Is Nothing Then
Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = "一覧"
End If
'---- 既存の一覧シートの値を取得
Sheets("一覧").Select
With Range(開始セル).CurrentRegion
v1 = .Resize(30 * 15, .Columns.Count + 1).Value
End With
jj = UBound(v1, 1)
kk = UBound(v1, 2)
For ii = 1 To jj
'B列とC列(C列〜F列の結合セル)の値をキーとして取得
v1(ii, kk) = v1(ii, 2) & "_" & v1(ii, 3)
If v1(ii, 2) = "" And v1(ii, 3) = "" Then
i_Max = ii
Exit For
End If
Next
'----
'---- 転記対象データの取得
For i = 1 To 15
Set WS2 = Nothing
On Error Resume Next
Set WS2 = Sheets(シート名(i))
On Error GoTo 0
If Not WS2 Is Nothing Then
WS2.Activate
Range(開始セル).CurrentRegion.Select
If Cells(Selection.Rows.Count + 1, 2).End(xlUp).Row > 3 Then
v2 = Range(開始セル).CurrentRegion.Value
jj = UBound(v2, 1)
For ii = 1 To jj
'B列かC列(C列〜F列の結合セル)のいずれかに値がある場合
If v2(ii, 2) <> "" Or v2(ii, 3) <> "" Then
'B列とC列(C列〜F列の結合セル)の組み合わせを一覧シートのキー(組み合わせ)から検索
m = Application.Match(v2(ii, 2) & "_" & v2(ii, 3), _
Application.WorksheetFunction.Index(v1, 0, kk), 0)
If Not IsNumeric(m) Then
v1(i_Max, 1) = v2(ii, 1)
v1(i_Max, 2) = v2(ii, 2)
v1(i_Max, 3) = v2(ii, 3)
v1(i_Max, 7) = v2(ii, 7)
v1(i_Max, 8) = v2(ii, 8)
v1(i_Max, 9) = v2(ii, 9)
v1(i_Max, kk) = v2(ii, 2) & "_" & v2(ii, 3)
i_Max = i_Max + 1
End If
End If
Next
Else
MsgBox WS2.Name & "シートにはデータがありません"
End If
End If
Next
'----
'---- 一覧シートの出力
Sheets("一覧").Activate
With Range(開始セル).CurrentRegion
.Resize(i_Max).Value = v1
End With
'----
End Sub
なお、一覧シートは、支店シートと同じフォーマットとし、
33行目より下にもデータが追加されていくものとしています。
そうではない場合、一覧シートのシートレイアウトを教えてください。
また、動作確認もしてありますので、必要であれば、確認ファイルを差し上げ
ることも可能です。
|
|