【Excel・VBA】自動見積「通常・特別価格」任意の(顧客別の)価格データを自動挿入

仕事をしていて、御見積の作成はよくある事。
さらに、お客さんによっては価格が異なる事も大いにあります。

例えば、
A社に対しては通常価格
B社に対しては通常価格の10%引き
C社に対しては通常価格の20%引き…等

今回は異なる価格帯のデータを瞬時に引っ張ってくるVBAの1例を
サンプルコードと共に記載していきます。

これを閲覧されている方の
「痒い所に手が届く」内容であれば幸いです。
 

広告

「通常・特別価格」任意の(顧客別の)価格データを自動挿入する

Excel_VBA_通常単価_特別価格_自動御見積_1

例えば、↑の画像のExcel
【C4】のお客様No.によって異なる単価を
【D列】に挿入する
そして、そのお客様の単価は、例題では仮に下記のようにする
 

Excel_VBA_通常単価_特別価格_自動御見積_2

となると
まずは以下の手順で下準備をしてください。

1.簡単な単価表をお客様毎にExcelで作成。(下記画面参照)
2.ExcelのBook名は上記の「お客様No.」にする。(下記画面参照)
3.作成したBookを1つのフォルダ内に格納する。(下記画面参照)
4.保存したBookを[右クリック] → [プロパティ] → [全般]の【場所】の部分をコピーして(控えて)おく
5.単価データを挿入するBook『御見積書』に「お客様No.」を記入するセルを設ける
 ※例題だとセル【C4】にNo.を入れる

 

作成例

上記の手順で作成したファイル・フォルダの一例です。
あとで記すコードも下記の一例の内容に沿っています。

Excel_VBA_通常単価_特別価格_自動御見積_3
1.簡単な単価表をお客様毎にExcelで作成。テスト用なので商品名と単価のみで各単価表を作成しました
Excel_VBA_通常単価_特別価格_自動御見積_4
2.Book名は「1000」等のお客様No.にする。後程サンプルコード書きますが、このBook名をキーワードにしてファイルを特定します。
3.作成したBookを1つのフォルダ内に格納する。どこか1つのファイル内に価格表をまとめておく。
Excel_VBA_通常単価_特別価格_自動御見積_5
4.作成し、保存したBookをどれでも良いので、
[右クリック] → [プロパティ] → [全般] →【場所】の部分
これをコピーして(控えて)おく。コード作成の際に使用します。
Excel_VBA_通常単価_特別価格_自動御見積_6
5.「お客様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】が空白の場合は、通常単価が自動で挿入されるようになっている。

それぞれサンプルコード内に注記ナンバーと共に記しました。
該当する箇所の処理・解説は以上になります。

 
いかがでしたでしょうか?
日常の業務にお役に立てれば幸いです。

広告