■
1) 「通販管理」→「顧客管理」
顧客管理に転記元列を追加。
Sub MacroTuuhanTenki1() Application.ScreenUpdating = False '管理ブックのパスを環境に合わせてください Const myPath As String = "C:\管理" '顧客管理のブック名 Const wbName As String = "顧客管理.xls" '顧客名簿のワークシート名 Const wsName As String = "顧客名簿" Dim i As Integer Dim j As Integer Dim kokyaku_Last As Long '顧客名簿の最終行 Dim tuuhan_Last As Long '通販管理の最終行 Dim KOmidasi_name(12) As String '顧客名簿の見出の文字列 Dim Tmidasi_name(9) As String '通販管理の見出の文字列 Dim KOmidasi_column(12) As Integer '顧客名簿の見出の位置 Dim Tmidasi_column(9) As Integer '通販管理の見出の位置 Dim r As Range Dim fSelect As Boolean '名前が選択されているか Dim f As Boolean '登録済み顧客か Dim f2 As Boolean Dim myCount1 As Long '登録済み顧客の転記数 Dim myCount2 As Long '新規登録顧客の転記数 Dim f3 As Boolean Dim dstWS As Worksheet '顧客名簿シート Dim tuuWS As Worksheet '通販管理シート '顧客名簿の見出の文字列。シートを変更する場合はこちらも変更 KOmidasi_name(0) = "会員番号" KOmidasi_name(1) = "旧会員番号" KOmidasi_name(2) = "会員資格" KOmidasi_name(3) = "名前" KOmidasi_name(4) = "フリガナ" KOmidasi_name(5) = "郵便番号" KOmidasi_name(6) = "住所" KOmidasi_name(7) = "電話番号" KOmidasi_name(8) = "メール" KOmidasi_name(9) = "登録日" KOmidasi_name(10) = "修正日" KOmidasi_name(11) = "連番" KOmidasi_name(12) = "転記元" '通販管理の見出の文字列。シートを変更する場合はこちらも変更 Tmidasi_name(0) = "会員番号" Tmidasi_name(1) = "旧会員番号" Tmidasi_name(2) = "会員資格" Tmidasi_name(3) = "名前" Tmidasi_name(4) = "フリガナ" Tmidasi_name(5) = "郵便番号" Tmidasi_name(6) = "住所" Tmidasi_name(7) = "電話番号" Tmidasi_name(8) = "メール" Tmidasi_name(9) = "登録日" Const kokyaku_Midasi As Long = 1 '顧客名簿の見出の行 Const tuuhan_Midasi As Long = 1 '通販管理の見出の行 Set tuuWS = ActiveSheet '顧客管理を開く On Error GoTo err_Trp If bookCheck(myPath & "\" & wbName) Then Set dstWS = Workbooks(wbName).Worksheets(wsName) Else Set dstWS = Workbooks.Open(myPath & "\" & wbName).Worksheets(wsName) End If On Error GoTo 0 For j = 0 To 12 For i = 1 To 256 If dstWS.Cells(kokyaku_Midasi, i).Value = KOmidasi_name(j) Then KOmidasi_column(j) = i Exit For End If Next i Next j For i = 0 To 12 If KOmidasi_column(i) = 0 Then MsgBox "顧客名簿の見出を確認してください" Exit Sub End If Next i For j = 0 To 9 For i = 1 To 256 If tuuWS.Cells(tuuhan_Midasi, i).Value = Tmidasi_name(j) Then Tmidasi_column(j) = i Exit For End If Next i Next j For i = 0 To 9 If Tmidasi_column(i) = 0 Then MsgBox "通販管理の見出を確認してください" Exit Sub End If Next i kokyaku_Last = dstWS.Cells(Rows.count, KOmidasi_column(11)).End(xlUp).Row tuuhan_Last = tuuWS.Cells(Rows.count, Selection.Column).End(xlUp).Row If MsgBox("[はい]→選択したすべてのデータは未登録データのみを追加する。" & vbCrLf & _ "[いいえ]→選択したすべてのデータは上書きする。(上書きする場合は十分注意してください。)", vbQuestion + vbYesNo, _ "既存顧客に未登録データのみを追加しますか?") = vbYes Then f3 = True End If '転記部分 With dstWS For Each r In Selection If r.Column = Tmidasi_column(3) And r.Row > tuuhan_Midasi And r.Row <= tuuhan_Last Then fSelect = True f = False For i = kokyaku_Midasi + 1 To kokyaku_Last If Replace(.Cells(i, KOmidasi_column(3)).Value, " ", "", , , 1) = _ Replace(tuuWS.Cells(r.Row, Tmidasi_column(3)).Value, " ", "", , , 1) And _ .Cells(i, KOmidasi_column(8)).Value = tuuWS.Cells(r.Row, Tmidasi_column(8)).Value Then f2 = False f = True If f3 Then For j = 0 To 9 If .Cells(i, KOmidasi_column(j)).Value = "" And _ tuuWS.Cells(r.Row, Tmidasi_column(j)).Value <> "" Then Select Case j Case 3 Case 4 .Cells(i, KOmidasi_column(4)).Value = _ Replace(StrConv(tuuWS.Cells(r.Row, Tmidasi_column(4)), vbWide), " ", "", , , 1) f2 = True Case 5 .Cells(i, KOmidasi_column(5)).Value = _ Replace(Replace(tuuWS.Cells(r.Row, Tmidasi_column(5)), "-", "", , , 1), "ー", "", , , 1) f2 = True Case 8 Case Else .Cells(i, KOmidasi_column(j)).Value = tuuWS.Cells(r.Row, Tmidasi_column(j)).Value f2 = True End Select End If Next j If .Cells(i, KOmidasi_column(12)).Value = "" Then .Cells(i, KOmidasi_column(12)).Value = "通販" f2 = True End If Else For j = 0 To 9 If tuuWS.Cells(r.Row, Tmidasi_column(j)).Value <> "" Then Select Case j Case 3 Case 4 .Cells(i, KOmidasi_column(4)).Value = _ Replace(StrConv(tuuWS.Cells(r.Row, Tmidasi_column(4)), vbWide), " ", "", , , 1) f2 = True Case 5 .Cells(i, KOmidasi_column(5)).Value = _ Replace(Replace(tuuWS.Cells(r.Row, Tmidasi_column(5)), "-", "", , , 1), "ー", "", , , 1) f2 = True Case 8 Case Else .Cells(i, KOmidasi_column(j)).Value = tuuWS.Cells(r.Row, Tmidasi_column(j)).Value f2 = True End Select End If Next j .Cells(i, KOmidasi_column(12)).Value = "通販" End If .Cells(i, KOmidasi_column(3)).Value = _ Replace(tuuWS.Cells(r.Row, Tmidasi_column(3)).Value, " ", " ", , , vbBinaryCompare) If f2 Then myCount1 = myCount1 + 1 .Cells(i, KOmidasi_column(10)).Value = Date End If End If Next i '新規登録の場合 If f = False Then kokyaku_Last = kokyaku_Last + 1 For j = 0 To 9 .Cells(kokyaku_Last, KOmidasi_column(j)).Value = _ tuuWS.Cells(r.Row, Tmidasi_column(j)).Value Next j .Cells(kokyaku_Last, KOmidasi_column(3)).Value = _ Replace(tuuWS.Cells(r.Row, Tmidasi_column(3)).Value, " ", " ", , , vbBinaryCompare) .Cells(kokyaku_Last, KOmidasi_column(4)).Value = _ Replace(StrConv(tuuWS.Cells(r.Row, Tmidasi_column(4)), vbWide), " ", "", , , 1) .Cells(kokyaku_Last, KOmidasi_column(5)).Value = _ Replace(Replace(tuuWS.Cells(r.Row, Tmidasi_column(5)), "-", "", , , 1), "ー", "", , , 1) .Cells(kokyaku_Last, KOmidasi_column(10)).Value = Date .Cells(kokyaku_Last, KOmidasi_column(11)).Value = .Cells(kokyaku_Last - 1, KOmidasi_column(11)) + 1 .Cells(kokyaku_Last, KOmidasi_column(12)).Value = "通販" myCount2 = myCount2 + 1 End If End If Next r End With If fSelect Then If myCount1 = 0 And myCount2 = 0 Then MsgBox "追加・修正するデータはありませんでした" Else MsgBox "既存顧客を " & myCount1 & " 件修正しました" & vbCrLf & "新規顧客を " & myCount2 & " 件追加しました" End If Else MsgBox "操作が誤っています。通販管理で名前を選択してから実行してください" End If Application.ScreenUpdating = True Exit Sub err_Trp: Select Case Err.Number Case 1004 MsgBox "顧客管理をオープンできません。パスを確認してください。" Case 9 MsgBox "顧客管理の正しいブック名とシート名を指定してください。" Case Else MsgBox "顧客管理をオープンすることができませんでした。" End Select Application.ScreenUpdating = True End Sub 'ブックが開いているかをチェック Function bookCheck(myPath As String) As Boolean Dim f As Boolean Dim myBook As Workbook For Each myBook In Workbooks If myBook.Path & "\" & myBook.Name = myPath Then f = True Exit For End If Next bookCheck = f End Function
2)「通販管理」→「来店記録」
Sub MacroTuuhanTenki2() Application.ScreenUpdating = False '管理ブックのパスを環境に合わせてください Const myPath As String = "C:\管理" '顧客管理のブック名 Const wbName As String = "顧客管理.xls" '来店記録のワークシート名 Const wsName As String = "来店記録" Dim i As Integer Dim j As Integer Dim raiten_Last As Long '来店記録の最終行 Dim tuuhan_Last As Long '通販管理の最終行 Dim Rmidasi_name(13) As String '来店記録の見出の文字列 Dim Tmidasi_name(14) As String '通販管理の見出の文字列 Dim Rmidasi_column(13) As Integer '来店記録の見出の位置 Dim Tmidasi_column(14) As Integer '通販管理の見出の位置 Dim r As Range Dim err_Mes As String 'エラーメッセージ Dim strDate As String Dim myDate As Date Dim fSelect As Boolean '名前が選択されているか Dim myCount As Long '転記数 Dim fZumi As Boolean '済の行を転記しようとしたか Dim dstWS As Worksheet '来店記録シート Dim tuuWS As Worksheet '通販管理シート '来店記録の見出の文字列。シートを変更する場合はこちらも変更 Rmidasi_name(0) = "店舗" Rmidasi_name(1) = "会員番号" Rmidasi_name(2) = "旧会員番号" Rmidasi_name(3) = "会員資格" Rmidasi_name(4) = "名前" Rmidasi_name(5) = "フリガナ" Rmidasi_name(6) = "来店日" Rmidasi_name(7) = "売上" Rmidasi_name(8) = "ポイント" Rmidasi_name(9) = "バッグポイント" Rmidasi_name(10) = "累計P数" Rmidasi_name(11) = "コメント" Rmidasi_name(12) = "商品名" Rmidasi_name(13) = "商品番号" '通販管理の見出の文字列。シートを変更する場合はこちらも変更 Tmidasi_name(0) = "" Tmidasi_name(1) = "会員番号" Tmidasi_name(2) = "旧会員番号" Tmidasi_name(3) = "会員資格" Tmidasi_name(4) = "名前" Tmidasi_name(5) = "フリガナ" Tmidasi_name(6) = "注文番号" Tmidasi_name(7) = "売上" Tmidasi_name(8) = "ポイント" Tmidasi_name(9) = "バッグポイント" Tmidasi_name(10) = "累計ポイント" Tmidasi_name(11) = "コメント" Tmidasi_name(12) = "商品名" Tmidasi_name(13) = "商品番号" Tmidasi_name(14) = "来店記録チェック" Const raiten_Midasi As Long = 1 '来店記録の見出の行 Const tuuhan_Midasi As Long = 1 '通販管理の見出の行 Set tuuWS = ActiveSheet '顧客管理を開く On Error GoTo err_Trp If bookCheck(myPath & "\" & wbName) Then Set dstWS = Workbooks(wbName).Worksheets(wsName) Else Set dstWS = Workbooks.Open(myPath & "\" & wbName).Worksheets(wsName) End If On Error GoTo 0 For j = 0 To 13 For i = 1 To 256 If dstWS.Cells(raiten_Midasi, i).Value = Rmidasi_name(j) Then Rmidasi_column(j) = i Exit For End If Next i Next j For i = 0 To 13 If Rmidasi_column(i) = 0 Then MsgBox "来店記録の見出を確認してください" Exit Sub End If Next i For j = 1 To 14 For i = 1 To 256 If tuuWS.Cells(tuuhan_Midasi, i).Value = Tmidasi_name(j) Then Tmidasi_column(j) = i Exit For End If Next i Next j For i = 1 To 14 If Tmidasi_column(i) = 0 Then MsgBox "通販管理の見出を確認してください" Exit Sub End If Next i raiten_Last = dstWS.Cells(Rows.count, Rmidasi_column(0)).End(xlUp).Row tuuhan_Last = tuuWS.Cells(Rows.count, Selection.Column).End(xlUp).Row '在庫管理の日付のチェック With dstWS For i = raiten_Midasi + 1 To raiten_Last If IsDate(.Cells(i, Rmidasi_column(6))) Then If myDate > DateValue(.Cells(i, Rmidasi_column(6))) Then MsgBox "来店記録の来店日が日付順になっていません" Exit Sub Else myDate = DateValue(.Cells(i, Rmidasi_column(6))) End If Else MsgBox "在庫管理の来店日に日付以外が入力されています" Exit Sub End If Next i End With '転記部分 With tuuWS For Each r In Selection If r.Column = Tmidasi_column(4) And r.Row > tuuhan_Midasi And r.Row <= tuuhan_Last Then fSelect = True If .Cells(r.Row, Tmidasi_column(14)).Value <> "済" Then strDate = .Cells(r.Row, Tmidasi_column(6)).Value strDate = "20" & Left(strDate, 2) & "/" & Mid(strDate, 3, 2) & "/" & Mid(strDate, 5, 2) If IsDate(strDate) Then For i = raiten_Midasi + 1 To raiten_Last + 1 If DateValue(strDate) < dstWS.Cells(i, Rmidasi_column(6)).Value Or _ dstWS.Cells(i, Rmidasi_column(6)).Value = "" Then dstWS.Rows(i).EntireRow.Insert dstWS.Cells(i, Rmidasi_column(0)).Value = "通販" For j = 1 To 13 dstWS.Cells(i, Rmidasi_column(j)).Value = .Cells(r.Row, Tmidasi_column(j)).Value Next j dstWS.Cells(i, Rmidasi_column(6)).Value = DateValue(strDate) .Cells(r.Row, Tmidasi_column(14)).Value = "済" myCount = myCount + 1 raiten_Last = raiten_Last + 1 Exit For End If Next i Else err_Mes = err_Mes & r.Row & "行の日付が不正です" & vbCrLf End If Else fZumi = True End If End If Next r End With If fSelect Then MsgBox myCount & "件の転記を終了しました" Else MsgBox "通販管理シートで名前を選択してから実行してください" End If If err_Mes <> "" Then MsgBox err_Mes If fZumi Then MsgBox "転記済みのデータが含まれていました" Application.ScreenUpdating = True Exit Sub err_Trp: Select Case Err.Number Case 1004 MsgBox "顧客管理をオープンできません。パスを確認してください。" Case 9 MsgBox "顧客管理の正しいブック名とシート名を指定してください。" Case Else MsgBox "顧客管理をオープンすることができませんでした。" End Select Application.ScreenUpdating = True End Sub 'ブックが開いているかをチェック Function bookCheck(myPath As String) As Boolean Dim f As Boolean Dim myBook As Workbook For Each myBook In Workbooks If myBook.Path & "\" & myBook.Name = myPath Then f = True Exit For End If Next bookCheck = f End Function
3)「商品管理」から「来店記録」
商品管理の列の変更に対応。
Sub MacroSyouhinTenki() Application.ScreenUpdating = False '管理ブックのパスを環境に合わせてください Const myPath As String = "C:\管理" '商品管理のブック名 Const wbName As String = "商品管理.xls" '商品管理のワークシート名 Const wsName As String = "商品管理" Dim i As Integer Dim j As Long Dim k As Integer Dim l As Integer Dim sName As String Dim sNum As String Dim retu() As Integer Dim f As Boolean Dim rr As Integer Dim r As Range Dim sList As String Dim dstWS As Worksheet '商品管理シート Dim raiWS As Worksheet '来店記録シート Dim syouhinNum As Integer '商品管理の商品番号列 Dim syouhinName As Integer '商品管理の商品名列 Dim r1 As Range Dim r2 As Range Set raiWS = ActiveSheet '商品管理を開く On Error GoTo err_Trp If bookCheck(myPath & "\" & wbName) Then Set dstWS = Workbooks(wbName).Worksheets(wsName) Else Set dstWS = Workbooks.Open(myPath & "\" & wbName).Worksheets(wsName) End If On Error GoTo 0 Set r1 = dstWS.Rows(1).Find(what:="商品番号", lookat:=xlWhole) If r1 Is Nothing Then MsgBox "商品管理に商品番号の列がありません。" Exit Sub End If syouhinNum = r1.Column Set r2 = dstWS.Rows(1).Find(what:="商品名", lookat:=xlWhole) If r1 Is Nothing Then MsgBox "商品管理に商品名の列がありません。" Exit Sub End If syouhinName = r2.Column With raiWS '列に挿入されたることを考えて商品番号が何列目かを調べます i = 1 While .Cells(1, i).Value <> "商品番号" i = i + 1 Wend ReDim retu(0) As Integer For Each r In Selection rr = r.Row f = False For l = 0 To UBound(retu) If retu(l) = rr Then f = True Exit For End If Next l If f = False Then sName = "" sNum = "" k = i While .Cells(rr, k).Value <> "" j = 2 While dstWS.Cells(j, syouhinNum).Value <> .Cells(rr, k).Value And _ dstWS.Cells(j, syouhinNum).Value <> "" j = j + 1 Wend sList = dstWS.Cells(j, syouhinName).Value If sList = "" Then sList = "存在しない商品番号" End If If sName = "" Then sName = sList Else sName = sName & "," & sList End If If sNum = "" Then sNum = .Cells(rr, k).Value Else sNum = sNum & "," & .Cells(rr, k).Value End If .Cells(rr, k).Value = "" k = k + 1 Wend .Cells(rr, i - 1).Value = sName .Cells(rr, i).Value = sNum ReDim Preserve retu(UBound(retu) + 1) As Integer retu(UBound(retu)) = rr End If Next r End With Application.ScreenUpdating = True Exit Sub err_Trp: Select Case Err.Number Case 1004 MsgBox "商品管理をオープンできません。パスを確認してください。" Case 9 MsgBox "商品管理の正しいブック名とシート名を指定してください。" Case Else MsgBox "商品管理をオープンすることができませんでした。" End Select Application.ScreenUpdating = True End Sub 'ブックが開いているかをチェック Function bookCheck(myPath As String) As Boolean Dim f As Boolean Dim myBook As Workbook For Each myBook In Workbooks If myBook.Path & "\" & myBook.Name = myPath Then f = True Exit For End If Next bookCheck = f End Function