|
「 a店」に対する、対策ならそれでOkです
その他の物に対応する様にした場合は、以下の様に成ります
2つのプロシージャが大きく変わり、1つのプロシージャが追加に成ります
尚、転記先のセルの書式設定はコメントアウトして有りますので必要なら活かして下さい
ただし、セルの書式設定を活かすと遅く成る可能性が有ります
また、「支店」にも対応した積もりです
'★このプロシージャ変更
Public Sub Classification2()
'Sheet1のデータ先頭行を定数として宣言
Const clngDataTop As Long = 3
Dim i As Long
Dim lngDataEnd As Long
Dim dicSheets As Object
Dim dicStore As Object
Dim vntData As Variant
Dim lngSheetNo As Long
Dim lngStoreNo As Long
Dim blnCopy As Boolean
Dim j As Long '★追加
Dim vntResult As Variant '★追加
Dim wksData As Worksheet '★追加
Dim wksResult As Worksheet '★追加
'画面更新を停止
Application.ScreenUpdating = False
'シートのIndexをDictionaryとして取得
Set dicSheets _
= CreateObject("Scripting.Dictionary")
'店のIndexをDictionaryとして取得
Set dicStore _
= CreateObject("Scripting.Dictionary")
'シートのIndexを作成
If Not MakeSheetsIndex(dicSheets, lngSheetNo) Then
GoTo ExitHandler
End If
'店のIndexを作成
If Not MakeStoreIndex(dicStore, lngSheetNo) Then
GoTo ExitHandler
End If
'「集計表」シートの参照を格納
Set wksData = Worksheets("Sheet1")
'データの有るシートに就いて
With wksData
'データの最終行を取得
lngDataEnd = .Cells(clngSheetEnd, "A").End(xlUp).Row
End With
'データの有る先頭行〜最終行まで繰り返し
For i = clngDataTop To lngDataEnd
'配列にi行のA、B、C、D、E列を取得
vntData = wksData.Cells(i, "A").Resize(, 5).Value '★修正
'もし、i行B列のセル値が日付と認識されるなら
If DateCheck(vntData(1, 2)) Then
With dicSheets
'もし、シートのIndexにこの日付が有るなら
If .Exists(vntData(1, 2)) Then
'シートの番号を取得
lngSheetNo = CLng(.Item(vntData(1, 2)))
'転記先の参照を格納
Set wksResult = Worksheets(lngSheetNo)
'コピーフラグをTrueに
blnCopy = True
'日付が無いなら
Else
'当月分と認めず、このグループを無視
MsgBox vntData(1, 2) & "、他の月の分です。"
'コピーフラグをFalseに
blnCopy = False
End If
End With
'i行B列のセル値が日付と認識されないなら
Else
'コピーフラグがTrueなら
If blnCopy Then
'店舗名から「店」、「支店」、Spaceを削除
vntData(1, 1) = NameControl(vntData(1, 1)) '★追加
'店舗Indexにi行A列の値が有るなら
If dicStore.Exists(vntData(1, 1)) Then
'店舗の行位置を取得
lngStoreNo _
= CLng(dicStore.Item(vntData(1, 1)))
With wksResult.Cells(lngStoreNo, "Q").Resize(, 2)
'転記先の店舗の行位置Q、R列の値を取得
vntResult = .Value '★追加
'転記先Q、R列の値にデータを加算
For j = 1 To 2 '★追加
vntResult(1, j) _
= vntResult(1, j) _
+ vntData(1, 3 + j) '★追加
Next j '★追加
'転記先Q、R列の位置に代入
.Value = vntResult '★追加
'セルの書式設定
' .NumberFormatLocal = "#,##0_ " '★追加
End With
End If
End If
End If
Next i
Beep
MsgBox "処理が完了しました"
ExitHandler:
'画面更新を再開
Application.ScreenUpdating = True
'Dictionaryを破棄
Set dicSheets = Nothing
Set dicStore = Nothing
Set wksData = Nothing '★追加
Set wksResult = Nothing '★追加
End Sub
'★このプロシージャ変更
Private Function MakeStoreIndex(dicStore As Object, _
lngSheetNo As Long) As Boolean
' 店舗のIndexを作成
'店舗データの先頭行位置を定数宣言
Const clngDataTop As Long = 5
Dim i As Long
Dim vntData As Variant
'最初にIndexに追加されたシート番号に就いて
With Worksheets(lngSheetNo)
'店舗名を配列に取得
vntData = Range(.Cells(clngDataTop, "B"), _
.Cells(clngSheetEnd, "B").End(xlUp)).Value
End With
'店舗Indexに就いて
With dicStore
'店舗名の先頭から終まで繰り返し
For i = 1 To UBound(vntData, 1)
'配列に「合計」が出てきたらForを抜ける
If Trim(vntData(i, 1)) = "合計" Then
Exit For
End If
'店舗名から「店」、「支店」、Spaceを削除
vntData(i, 1) = NameControl(vntData(i, 1))
'Indexにi番目の店舗名が有るなら
If .Exists(vntData(i, 1)) Then
Beep
MsgBox "同一の店名が有ります"
Exit Function
'i番目の店舗名が無いなら
Else
'Indexに店舗名と行位置を追加
.Add vntData(i, 1), i + clngDataTop - 1
End If
Next i
End With
MakeStoreIndex = True
End Function
'★このプロシージャ新規追加
Private Function NameControl(ByVal vntValue As Variant) As Variant
Const cstrExtension1 As String = "支店"
Const cstrExtension2 As String = "店"
'Spaceを削除
vntValue = Trim(vntValue)
'右2文字が「支店」の場合
If Right(vntValue, 2) = cstrExtension1 Then
'「支店」を削除
NameControl = Left(vntValue, Len(vntValue) - 2)
Else
'右1文字が「店」の場合
If Right(vntValue, 1) = cstrExtension2 Then
'「店」を削除
NameControl = Left(vntValue, Len(vntValue) - 1)
Else
NameControl = vntValue
End If
End If
End Function
|
|