前回の続きで今回は実際にマクロを書いていきます。
前> 【社内DX案件紹介】架電内容ごとの情報振り分け-1-
今回作るマクロ
前回のおさらいですが、
依頼内容は
データベースの情報を条件ごとに振り分ける
という話をしました。
実際の処理としてはシンプルで
1.シート「抽出データ」のデータを取得する
2.取得したデータを条件に合ったシートへ転記する
の2点。
ただこの「条件」の作り方が今回のポイントでIF文ではなく、各カラムの情報①~④を繋げて判定する方法で行きたいと思います。
まずは全体像です。
本当はデータベースからデータをとって分類し、最後エクセルのファイルで出力するのですが、今回はシート「抽出データ」にある架電内容のデータを各シート「パターンA」~「パターンL」に情報を転記するマクロとしました。
次にマクロの全体です。
Sub Sample2() Dim intSheet As Integer '/--シート番号--/' Dim strSheetName As String '/--シート名--/' Dim lngMaxY As Long '/--シート「抽出データ」の最大行数--/' Dim lngY As Long '/--行周回用カウンタ--/' Dim lngMaxY2 As Long '/--転記先シートの最大行数--/' Dim intMaxX As Integer '/--シート「抽出データ」の最大列数--/' Dim intX As Integer '/--列周回用カウンタ--/' Dim strKaden As String '/--架電理由--/' Dim strKoutei As String '/--工程名称--/' Dim strNAT As String '/--NAT--/' Dim strIshi As String '/--意思確認--/' Dim strHantei As String '/--条件判定--/' '/--シート「抽出データ」の最大行数・最大列数を取得--/' lngMaxY = Sheets("抽出データ").Cells(Rows.Count, 1).End(xlUp).Row intMaxX = Sheets("抽出データ").Cells(1, Columns.Count).End(xlToLeft).Column '/--カラム名を各シートに転記--/' For intSheet = 2 To ActiveWorkbook.Sheets.Count For intX = 1 To intMaxX Sheets(intSheet).Cells(1, intX).Value = Sheets("抽出データ").Cells(1, intX).Value Next intX Next intSheet '/--シート「抽出データ」の最大行数分周回--/' For lngY = 2 To lngMaxY strSheetName = "" strKaden = "0" strKoutei = "0" strNAT = "0" strIshi = "0" strHantei = "0000" strKaden = Sheets("抽出データ").Cells(lngY, 1).Value strKoutei = Sheets("抽出データ").Cells(lngY, 15).Value strNAT = Sheets("抽出データ").Cells(lngY, 19).Value strIshi = Sheets("抽出データ").Cells(lngY, 20).Value '/--架電理由の条件格納--/' Select Case strKaden Case "自動更新" strKaden = "1" Case "OB対象外" strKaden = "1" Case "審査" strKaden = "1" Case "電話・資料請求" strKaden = "2" Case "窓口(新規)" strKaden = "3" Case "不明" strKaden = "4" Case "乗換" strKaden = "4" Case "利用率高" strKaden = "4" Case "未成年" strKaden = "4" Case "ハイクラス" strKaden = "5" Case Else strKaden = "9" End Select '/--工程名称の条件格納--/' Select Case strKoutei Case "電話・本人宛NAT" strKoutei = "1" Case "電話・事前不備有" strKoutei = "2" Case "電話・本人宛不備" strKoutei = "3" Case "電話・同意" strKoutei = "4" Case "電話・資料請求" strKoutei = "5" Case Else strKoutei = "9" End Select '/--NATの条件格納--/' If strNAT = "" Then strNAT = "1" Else strNAT = "9" End If '/--意思確認の条件格納--/' If strIshi = "1" Then strIshi = "1" Else strIshi = "9" End If '/--各条件を結合--/' strHantei = strKaden & strKoutei & strNAT & strIshi '/--条件によるパターン判定--/' Select Case Left(strHantei, 2) Case "11" Select Case strHantei Case "1111" strSheetName = "パターンA" Case Else strSheetName = "パターンL" End Select Case "12" strSheetName = "パターンB" Case "13" strSheetName = "パターンC" Case "14" strSheetName = "パターンD" Case "15" strSheetName = "パターンE" Case "21" strSheetName = "パターンG" Case "22" strSheetName = "パターンH" Case "23" strSheetName = "パターンF" Case Else Select Case Left(strHantei, 1) Case "3" strSheetName = "パターンI" Case "4" strSheetName = "パターンJ" Case "5" strSheetName = "パターンK" Case Else strSheetName = "パターンL" End Select End Select '/--転記先シートの最大行数を取得--/' lngMaxY2 = Sheets(strSheetName).Cells(Rows.Count, 1).End(xlUp).Row + 1 '/--転記先シートへデータを転記--/' For intX = 1 To intMaxX Sheets(strSheetName).Cells(lngMaxY2, intX).Value = Sheets("抽出データ").Cells(lngY, intX).Value Next intX Next lngY End Sub
それぞれのパートで説明すると
'/--シート「抽出データ」の最大行数・最大列数を取得--/' lngMaxY = Sheets("抽出データ").Cells(Rows.Count, 1).End(xlUp).Row intMaxX = Sheets("抽出データ").Cells(1, Columns.Count).End(xlToLeft).Column
ここはシート「抽出データ」の1列目の値がある最終行と1行目の値がある最終列を取得しています。
まず
.Cells(Rows.Count, 1).End(xlUp).Row
ですが、
Row.Count:Excelの最後の行(1048576)
1 :1列目
.End(xlUp):最後の行から上方向に
.Row :値のある行番号をとる
こんな意味となります。
.Cells(1, Columns.Count).End(xlToLeft).Column
ここもほとんど同じで
Columns.Count:Excelの最後の列(16384)
.End(xlToLeft) :最後の列から左方向に
.Column :値のある列番号をとる
こんな意味となります。
'/--架電理由の条件格納--/' Select Case strKaden Case "自動更新" strKaden = "1" Case "OB対象外" strKaden = "1" Case "審査" strKaden = "1" Case "電話・資料請求" strKaden = "2" Case "窓口(新規)" strKaden = "3" Case "不明" strKaden = "4" Case "乗換" strKaden = "4" Case "利用率高" strKaden = "4" Case "未成年" strKaden = "4" Case "ハイクラス" strKaden = "5" Case Else strKaden = "9" End Select
ここは①架電理由を1~5、9で分類してstrKadenに入れています。
同様にstrKoutei(工程名称)、strNAT(NAT)、strIshi(意思確認)も下図の条件に合わせて分類していきます。
'/--各条件を結合--/' strHantei = strKaden & strKoutei & strNAT & strIshi '/--条件によるパターン判定--/' Select Case Left(strHantei, 2) Case "11" Select Case strHantei Case "1111" strSheetName = "パターンA" Case Else strSheetName = "パターンL" End Select Case "12" strSheetName = "パターンB" Case "13" strSheetName = "パターンC" Case "14" strSheetName = "パターンD" Case "15" strSheetName = "パターンE" Case "21" strSheetName = "パターンG" Case "22" strSheetName = "パターンH" Case "23" strSheetName = "パターンF" Case Else Select Case Left(strHantei 1) Case "3" strSheetName = "パターンI" Case "4" strSheetName = "パターンJ" Case "5" strSheetName = "パターンK" Case Else strSheetName = "パターンL" End Select End Select
ここからは実際にA~Lのパターン分けになります
①②③④を繋げたstrHanteiがどうだったか?をSelect文で分類していますが、
①②③④の値が
1111・・・パターンA
12xx・・・パターンB(xはどの値でもよい)
13xx・・・パターンC
14xx・・・パターンD
15xx・・・パターンE
23xx・・・パターンF
21xx・・・パターンG
22xx・・・パターンH
3xxx・・・パターンI
4xxx・・・パターンJ
5xxx・・・パターンK
それ以外・・パターンL
となります。
ここでポイントですが、パターンA、I~K以外は①②で判定できる。という点です。
なので基本は
Select Case Left(strHantei, 2)
で左2文字分で判定し、
Left(strHantei, 2)の値が”11”の時は
Select Case strHantei Case "1111" strSheetName = "パターンA" Case Else strSheetName = "パターンL" End Select
で4文字全てを条件とし、逆にLeft(strHantei 2)の値が”23”以降であれば
Select Case Left(strHantei, 1) Case "3" strSheetName = "パターンI" Case "4" strSheetName = "パターンJ" Case "5" strSheetName = "パターンK" Case Else strSheetName = "パターンL" End Select
で左1文字だけで判定することでパターンA~Lの全てを分類できるようになります。
'/--転記先シートの最大行数を取得--/' lngMaxY2 = Sheets(strSheetName).Cells(Rows.Count, 1).End(xlUp).Row + 1 '/--転記先シートへデータを転記--/' For intX = 1 To intMaxX Sheets(strSheetName).Cells(lngMaxY2, intX).Value = Sheets("抽出データ").Cells(lngY, intX).Value Next intX
で最後は転記先のシートの最大行数を取得して、その1つ下(+1)したところに、その行の値を転記して1行分が終了します。
あとはそれをシート「抽出データ」の全レコードで実施して終了になります。
これで案件2の紹介は終了します。
↓よろしければクリックをお願いします!
0 件のコメント:
コメントを投稿