|
レスが付かないみたいですね?
どうやって広告1とか広告2とかの位置を探すのか?
Sheet1、Sheet2に列見出しが有るのか?、Sheet1は昇順に並んでいるのか等
イマイチ、説明が不足なので、勝手に考えて見ました
参考ぐらいには成るかな?
勝手に考えたレイアウトは以下の様に想定しています
Sheet1
A B C D E F G H I J
1 コード 商品1 商品2 商品3 広告1 広告2 広告3 広告4 広告5 広告6
2 1 A1 B1 C1
3 2 A2 B2 C2
4 3 A3 B3 C3
5 4 A4 B4 C4
6 5 A5 B5 C5
Sheet2
A B C
1 コード 広告 タイトル
2 1 広告1 Title1
3 5 広告3 Title3
4 2 広告4 Title4
5 1 広告6 Title5
Sheet1結果
A B C D E F G H I J
1 コード 商品1 商品2 商品3 広告1 広告2 広告3 広告4 広告5 広告6
2 1 A1 B1 C1 Title1 Title6
3 2 A2 B2 C2 Title4
4 3 A3 B3 C3
5 4 A4 B4 C4
6 5 A5 B5 C5 Title3
以下を標準モジュールに記述して下さい
Option Explicit
'シートの最終行位置を定数として宣言
Const clngSheetEnd As Long = 65536
Public Sub Classification()
'Sheet1のList先頭行位置を定数として宣言
Const clngRowTop As Long = 1
'Sheet1の広告列見出しの先頭列位置を定数宣言
Const clngColTop As Long = 5
'Sheet2のList先頭行位置を定数として宣言
Const clngDataTop As Long = 1
Dim i As Long
Dim lngDataEnd As Long
Dim dicCode As Object
Dim dicTitle As Object
Dim vntData As Variant
Dim wksData As Worksheet
Dim wksResult As Worksheet
Dim rngData As Range
Dim lngRow As Long
'画面更新を停止
' Application.ScreenUpdating = False
'コードのIndexをDictionaryとして取得
Set dicCode _
= CreateObject("Scripting.Dictionary")
'広告のIndexをDictionaryとして取得
Set dicTitle _
= CreateObject("Scripting.Dictionary")
'Sheet1の参照を格納
Set wksResult = Worksheets("Sheet1")
'Sheet1に就いて
With wksResult
'コード列を取得
Set rngData = Range(.Cells(clngRowTop + 1, "A"), _
.Cells(clngSheetEnd, "A").End(xlUp))
'コードのIndexを作成
If Not MakeIndex(dicCode, rngData, clngRowTop + 1) Then
GoTo ExitHandler
End If
'広告列見出しを取得
Set rngData = Range(.Cells(clngRowTop, clngColTop), _
.Cells(clngRowTop, 256).End(xlToLeft))
'広告のIndexを作成
If Not MakeIndex(dicTitle, rngData, clngColTop) Then
GoTo ExitHandler
End If
End With
'Sheet2の参照を格納
Set wksData = Worksheets("Sheet2")
'データの有るシートに就いて
With wksData
'データの最終行を取得
lngDataEnd = .Cells(clngSheetEnd, "A").End(xlUp).Row
End With
'データの有る先頭行〜最終行まで繰り返し
For i = clngDataTop + 1 To lngDataEnd
'配列にi行のA、B、C列を取得
vntData = wksData.Cells(i, "A").Resize(, 3).Value
With dicCode
'もし、コードのIndexにこのコードが有るなら
If .Exists(vntData(1, 1)) Then
'コードの行位置を取得
lngRow = .Item(vntData(1, 1))
'日付が無いなら
Else
'コードの行位置を-1に
lngRow = -1
End If
End With
If lngRow <> -1 Then
With dicTitle
'広告Indexにi行A列の値が有るなら
If .Exists(vntData(1, 2)) Then
'広告の列位置を取得し、
'コードの行位置との交点にタイトルを記入
wksResult.Cells(lngRow, _
.Item(vntData(1, 2))).Value _
= vntData(1, 3)
End If
End With
End If
Next i
ExitHandler:
'画面更新を再開
' Application.ScreenUpdating = True
'Dictionaryを破棄
Set dicCode = Nothing
Set dicTitle = Nothing
Set rngData = Nothing
Set wksData = Nothing
Set wksResult = Nothing
Beep
MsgBox "処理が完了しました"
End Sub
Private Function MakeIndex(dicIndex As Object, _
rngData As Range, _
lngTop As Long) As Boolean
' Indexを作成
Dim i As Long
'Indexに就いて
With dicIndex
'Listの先頭から終りまで繰り返し
For i = 1 To rngData.Count
'コードのIndexにこのコードが有る場合
If .Exists(rngData(i).Value) Then
Beep
MsgBox "同一のKeyが有ります"
Exit Function
'コードが無い場合
Else
'Indexにこのコードと行位置を追加
.Add rngData(i).Value, i + lngTop - 1
End If
Next i
End With
MakeIndex = True
End Function
|
|