回答No.3の続きです。
With DataSheet
'元データが入力されているシートにおけるデータが入力されている最終行を取得
LastRowD = WorksheetFunction.Max(.Range(CompanyColumnD & .Rows.Count). _
End(xlUp).Row, .Range("B" & .Rows.Count).End(xlUp).Row)
If LastRowD <= ItemRowD Then
MsgBox "参照すべき元データがありません。" & vbCrLf _
& "マクロを終了します。", vbExclamation, "データ無し"
GoTo labelE
End If
With .Range(ProductColumnD & ItemRowD + 1 & ":" & ProductColumnD & LastRowD)
'「会社名」と「製造番号のパターン」が共に空欄の場合は何も表示せず、
'どちらか一方のみが空欄の場合はChr(7)の記号を表示し、
'両方ともに値が入力されている場合には、「『会社名』+Chr(7)の記号+『製造番号のパターン』」
'という形式の値を表示するワークシート関数を入力
.FormulaR1C1 = _
"=IF(OR(RC" & Columns(CompanyColumnD).Column & "="""",RC" _
& Columns(SerialColumnD).Column & "=""""),IF(AND(RC" & Columns(CompanyColumnD). _
Column & "="""",RC" & Columns(SerialColumnD).Column & "=""""),"""",CHAR(7)),RC" _
& Columns(CompanyColumnD).Column & "&CHAR(7)&RC" & Columns(SerialColumnD).Column & ")"
.Calculate '指定されたセル範囲のみ再計算を実行
.Value = .Value '指定されたセル範囲の値を(ワークシート関数によらずに)セルに入っている値とする(値のみコピー&貼り付けと同様の結果が得られる)
End With
End With
With PatternSheet
'
For i = ItemRowP + 1 To LastRowP '製造番号のパターンの一覧表におけるデータが入力されている行に対して繰り返し処理を行う
If .Range(CompanyColumnP & i).Value <> "" And .Range(SerialColumnP & i).Value <> "" Then 'もし「会社名」と「製造番号のパターン」に値が入力されている場合
'元データシートの製品名欄の列に対して、製造番号のパターンと一致する値を、それに対応する製品名に置換する
DataSheet.Range(ProductColumnD & ItemRowD + 1 & ":" & ProductColumnD & LastRowD).Replace _
What:=.Range(CompanyColumnP & i).Value & Chr(7) & .Range(SerialColumnP & i).Value, _
Replacement:=.Range(ProductColumnP & i).Value, LookAt:=xlWhole, SearchOrder:=xlByRows, _
MatchCase:=True, MatchByte:=False, SearchFormat:=False, ReplaceFormat:=False
End If
Next i
'製造番号のパターンの一覧表に入力されているパターンと一致しない値を「(データ無し)」という文字列に置換し、
'該当するセルを黄色で塗り潰す
Application.ReplaceFormat.Clear
Application.ReplaceFormat.Interior.Color = 65535
DataSheet.Range(ProductColumnD & ItemRowD + 1 & ":" & ProductColumnD & LastRowD).Replace _
What:="*" & Chr(7) & "*", Replacement:="(データ無し)", LookAt:=xlWhole, MatchCase:=False, _
ReplaceFormat:=True
End With
labelE:
With Application
'置換機能のオプション設定をデフォルトに戻す
With .ReplaceFormat.Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
.ReplaceFormat.Clear
ActiveSheet.Cells(1, 1).Replace _
What:="", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, _
MatchCase:=False, MatchByte:=False, SearchFormat:=False, ReplaceFormat:=False
.Calculation = xlAutomatic '計算モードを自動に切り替え
.ScreenUpdating = False 'モニター表示の更新を行う
End With
End Sub
因みに、もしも元データの中に、製造番号のパターンの一覧表上に対応するパターンが無いものがあった場合には、Sheet1のC列上の該当するセルに「(データ無し)」と書き込んだ上で、目立たせるためにセルを黄色で塗り潰す様になっております。
お礼
ばっちりできました。本当に、本当に、心から感謝しております。 大変ありがとうございました。今後もアドバイスよろしくお願いします。