【Excel・VBA】自動見積「通常・特別価格」任意の(顧客別の)価格データを自動挿入
仕事をしていて、御見積の作成はよくある事。
さらに、お客さんによっては価格が異なる事も大いにあります。
例えば、
A社に対しては通常価格
B社に対しては通常価格の10%引き
C社に対しては通常価格の20%引き…等
今回は異なる価格帯のデータを瞬時に引っ張ってくるVBAの1例を
サンプルコードと共に記載していきます。
これを閲覧されている方の
「痒い所に手が届く」内容であれば幸いです。
「通常・特別価格」任意の(顧客別の)価格データを自動挿入する
例えば、↑の画像のExcel
①【C4】のお客様No.によって異なる単価を
②【D列】に挿入する
そして、そのお客様の単価は、例題では仮に下記のようにする
となると
まずは以下の手順で下準備をしてください。
1.簡単な単価表をお客様毎にExcelで作成。(下記画面参照)
2.ExcelのBook名は上記の「お客様No.」にする。(下記画面参照)
3.作成したBookを1つのフォルダ内に格納する。(下記画面参照)
4.保存したBookを[右クリック] → [プロパティ] → [全般]の【場所】の部分をコピーして(控えて)おく
5.単価データを挿入するBook『御見積書』に「お客様No.」を記入するセルを設ける
※例題だとセル【C4】にNo.を入れる
作成例
上記の手順で作成したファイル・フォルダの一例です。
あとで記すコードも下記の一例の内容に沿っています。
これで下準備は完了です。
続いては【サンプルコード】と【簡単な解説】です。
サンプルコード
サンプルコードを記載する前に
下記のコードは前提条件として
以下の事があげられ、それに基づき実行されます。
※該当品に特別価格が無い場合は通常単価を挿入する
※【C4】に記載されたお客様No.と
合致する単価表ファイルが無い場合は、
通常単価(No.1000)が記載される
Option Explicit
Sub Sample()
'画面更新STOP
Application.ScreenUpdating = False
Dim mySht1 As Worksheet
Dim A, B, myPath As String
A = "Sheet1"
Set mySht1 = ThisWorkbook.Worksheets(A)
B = mySht1.Range("C4")
myPath = "★★★★★★"
'「★★★★★★」の箇所に [プロパティ]→[全般]→[場所] をコピペ。必ず最後に「¥」を1つ追記して下さい。
Dim myBook1, myBook2 As Workbook
Dim myRng1, myRng2, myRng3, myRng4 As Range
Dim result As Variant
Dim EndLine1, i As Long
Set myBook1 = Workbooks.Open(myPath & "1000" & ".xlsx") '通常単価No.1000
Set myRng1 = myBook1.Sheets("List").Range("A:A") '商品名
Set myRng2 = myBook1.Sheets("List").Range("B:B") '単価①
EndLine1 = mySht1.Cells(Rows.Count, 3).End(xlUp).Row '最終行取得
'///①「お客様No.」が1000の場合
If mySht1.Range("C7") <> "" And B = "1000" Then
For i = 7 To EndLine1
result = Application.XLookup(mySht1.Cells(i, 3), myRng1, myRng2, "", 0, 1)
If Not IsError(result) Then
mySht1.Cells(i, 4) = result
End If
Next i
myBook1.Close
'①「お客様No.」が1000の場合///
'///②-1「お客様No.」が未記載ではない場合
ElseIf mySht1.Range("C7") <> "" And B <> "" Then
'///②-2エラーになった場合は「myError」まで飛ぶ
On Error GoTo myError
Set myBook2 = Workbooks.Open(myPath & B & ".xlsx")
Set myRng3 = myBook2.Sheets("List").Range("A:A") '商品名
Set myRng4 = myBook2.Sheets("List").Range("B:B") '単価②
For i = 7 To EndLine1
result = Application.XLookup(mySht1.Cells(i, 3), myRng3, myRng4, "", 0, 1)
If Not IsError(result) Then
mySht1.Cells(i, 4) = result
End If
'///②-3「お客様No.」の特別単価には該当する商品名がない場合
If mySht1.Cells(i, 4) = "" Then
result = Application.XLookup(mySht1.Cells(i, 3), myRng1, myRng2, "", 0, 1)
mySht1.Cells(i, 4) = result
End If
'②-3「お客様No.」の特別単価には該当する商品名がない場合///
Next i
myBook1.Close
myBook2.Close
'②-1「お客様No.」が未記載ではない場合///
'///③「お客様No.」が未記載の場合
ElseIf mySht1.Range("C7") <> "" And B = "" Then
For i = 7 To EndLine1
result = Application.XLookup(mySht1.Cells(i, 3), myRng1, myRng2, "", 0, 1)
If Not IsError(result) Then
mySht1.Cells(i, 4) = result
End If
Next i
myBook1.Close
End If
'③「お客様No.」が未記載の場合///
Exit Sub
'エラーが無ければここで処理は終了///
'///②-2エラーが有った場合、以下の処理を実行する
myError:
MsgBox "No." & B & "は存在しません" & vbCrLf & "No.1000を記載します", vbExclamation
For i = 7 To EndLine1
result = Application.XLookup(mySht1.Cells(i, 3), myRng1, myRng2, "", 0, 1)
If Not IsError(result) Then
mySht1.Cells(i, 4) = result
End If
Next i
myBook1.Close
End Sub
コード作成時の注意点
下準備の内容をご理解頂いた上で
↑のコードを活用して、手順4でコピーした
「プロパティ→場所」の内容を上記のサンプルコードの「★」部分に
コピーし、最後に「¥」マークを加えて下さい。これでOKです。
例題に従えば、
プロパティの【場所】に表示された「C:¥Desktop¥PriceList」をコピペ
「¥」を「PriceList」の後ろに1つ付け足してます。
つまり、その一行の内容は
myPath = ” C:¥Desktop¥PriceList¥”
となります。
コードの簡単な解説
単価データを挿入する『御見積書』のセル【C4】に記載された
お客様No.を読取って
◆「お客様No.」が「1000」(通常単価)の場合は
指定のフォルダ内からファイル名『1000』を探して開き、単価挿入
◆「お客様No.」が未記載ではない(記載されいている)場合は
【C4】に書かれた文字列と同じファイル名をフォルダ内から探す
・「お客様No.」の特別単価には該当する商品名が無い場合は、
その商品のみ通常単価が挿入される。
例題の場合は、
商品名『スイカ』は1001~1003の単価データには無く、
したがって、『スイカ』は1001~1003のお客様No.でも割引なしの
1,000円が挿入される事になっています。
・記載されていた「お客様No.」のファイルが見つからない場合は
「記載のNo.は見つからなかった」というメッセージと共に
「通常単価を記入する」ようになっている
◆「お客様No.」が未記載の場合は
【C4】が空白の場合は、通常単価が自動で挿入されるようになっている。
それぞれサンプルコード内に注記ナンバーと共に記しました。
該当する箇所の処理・解説は以上になります。
いかがでしたでしょうか?
日常の業務にお役に立てれば幸いです。