実現したいこと、前提
エラーを解消し、デシクショナリーオブジェクトを利用して、重複データを意図通りに格納したい(下記に記載)
normalDic⇒重複しない、一意の社員番号(employeeNum)と給料(kyu)とインフラ手当(teate)を格納したい
myDic⇒normalDicに格納されており、重複している社員番号と給料とインフラ手当を格納したい
dupDic⇒normalDicに格納されており、重複している社員番号を格納したい
myDicは、今回のソースコードに記載のvalsを見て、normalDicにすでに格納されていれば、重複と認識し、myDicに格納する
dupDicは、今回のソースコードに記載のemployeeNumのみを見て、normalDicにすでに格納されていれば、重複と認識し、myDicに格納する
★myDicではじかれた重複の人は、dupDicに格納したくないです
⇒myDicの内容は、削除処理をいれても問題ないです
発生している問題・エラーメッセージ
プロシージャの呼び出し、または引数が不正です
該当のソースコード
vba
1 Dim normalDic, dupDic, myDic As Object 2 3Set normalDic = CreateObject("Scripting.Dictionary") 4 Set dupDic = CreateObject("Scripting.Dictionary") 5 Set myDic = CreateObject("Scripting.Dictionary") 6 7 'データ行まで読み飛ばし 8 Line Input #1, buf 'ヘッダー行1読込 9 Line Input #1, buf 'ヘッダー行2読込 10 Line Input #1, buf 'ヘッダー行3読込 11 Line Input #1, buf 'カラムID行読込 12 Do Until EOF(1) 13 Line Input #1, buf 14 tmp = Split(buf, ",") 15 16 employeeNum = tmp(11) 17 teate = tmp(45) 18 kyu = tmp(40) 19'配列なので、実際のcsvのカラムから-1のカラム番号 20 Dim vals As Variant 21 vals = Array(employeeNum, teate, kyu) 22 23 ' 正常辞書に社員番号が存在しない場合、追加 24 If Not normalDic.Exists(vals) Then 25 normalDic.Add employeeNum, vals 26 ' 正常辞書に社員番号が存在する場合、重複辞書に追加 27 ElseIf normalDic.Exists(vals) Then 28 myDic.Add employeeNum, vals 29 ElseIf normalDic.Exists(employeeNum) Then 30 dupDic.Add employeeNum, employeeNum 31 32 'Else 33 ' dupDic.Add employeeNum, employeeNum 34 End If 35 Loop 36 37 Close #1 38 39 40
該当のソースコードver2(修正後)
下記コードは、正常終了していますが、実現したいことに記載のある通りには機能しませんでした。
vba
1 employeeNum = tmp(11) 2 teate = tmp(45) 3 kyu = tmp(40) 4 Dim vals As Variant 5 vals = Array(employeeNum, shokusekiTeate, hyoukaKyu) 6 7 ' normalDicに社員番号が存在しない場合、追加 8 If Not normalDic.Exists(employeeNum) Then 9 normalDic.Add employeeNum, vals 10 ' normalDicに社員番号が存在する場合、重複辞書に追加 11 ElseIf normalDic.Exists(employeeNum) And myDic.Exists(employeeNum) = normalDic.Exists(employeeNum) Then 12 myDic.Add employeeNum, vals 13 ElseIf normalDic.Exists(employeeNum) And Not myDic.Exists(employeeNum) Then 14 dupDic.Add employeeNum, employeeNum
該当のソースコード(更新)
vba
1 Dim employeeNum, shokusekiTeate, hyoukaKyu, tanjikan As String 2 Dim normalDic, dupDic, myDic As Object 3 Dim vals As Variant 4 5 Set normalDic = CreateObject("Scripting.Dictionary") 6 Set dupDic = CreateObject("Scripting.Dictionary") 7 Set myDic = CreateObject("Scripting.Dictionary") 8 9 'データ行まで読み飛ばし 10 Line Input #1, buf 'ヘッダー行1読込 11 Line Input #1, buf 'ヘッダー行2読込 12 Line Input #1, buf 'ヘッダー行3読込 13 Line Input #1, buf 'カラムID行読込 14 Do Until EOF(1) 15 Line Input #1, buf 16 tmp = Split(buf, ",") 17 18 19 Select Case Val(ArySyoriSet(Pos_SyoriType)) 20 Case Inta, Intb 21 employeeNum = tmp(11) 22 teate = tmp(16) 23 24 vals = Array(employeeNum, teate) 25 'normalDicに社員番号が存在しない場合、追加 26 If Not normalDic.Exists(employeeNum) Then 27 normalDic.Add employeeNum, vals 28 Else 29 30 If Not myDic.Exists(employeeNum) Then 31 nvals = normalDic(employeeNum) 32 'normalDicの登録内容と全て一致するなら、追加 33 If vals(0) = nvals(0) And vals(1) = nvals(1) Then 34 myDic.Add employeeNum, vals 35 'dupDicに登録済みなら削除 36 If dupDic.Exists(employeeNum) Then 37 dupDic.Remove employeeNum 38 End If 39 End If 40 End If 41 'dupDic未登録かつmyDic未登録なら、追加 42 If Not dupDic.Exists(employeeNum) Then 43 If Not myDic.Exists(employeeNum) Then 44 dupDic.Add employeeNum, employeeNum 45 End If 46 End If 47 End If 48 49 Case Intc, Intd 50 employeeNum = tmp(11) 51 teate = tmp(45) 52 kyu = tmp(40) 53 54 vals = Array(employeeNum, shokusekiTeate, hyoukaKyu) 55 56 ' normalDicに社員番号が存在しない場合、追加 57 If Not normalDic.Exists(employeeNum) Then 58 normalDic.Add employeeNum, vals 59 Else 60 ' myDicに社員番号が存在せず、normalDicに社員番号、インフラ手当、給料が同一のデータが登録されていたらmyDicに追加 61 If Not myDic.Exists(employeeNum) Then 62 nvals = normalDic(employeeNum) 63 'normalDicの登録内容と全て一致するなら、追加 64 If vals(0) = nvals(0) And vals(1) = nvals(1) And vals(2) = nvals(2) Then 65 myDic.Add employeeNum, vals 66 'dupDicに登録済みなら削除 67 If dupDic.Exists(employeeNum) Then 68 dupDic.Remove employeeNum 69 End If 70 End If 71 End If 72 'dupDic未登録かつmyDic未登録なら、追加 73 If Not dupDic.Exists(employeeNum) Then 74 If Not myDic.Exists(employeeNum) Then 75 dupDic.Add employeeNum, employeeNum 76 End If 77 End If 78 End If 79 End Select 80 Loop 81 82 Close #1 83 84 85 wi = 0 86 87 'データ行まで読み飛ばし 88 Line Input #1, buf 'ヘッダー行1読込 89 Line Input #1, buf 'ヘッダー行2読込 90 Line Input #1, buf 'ヘッダー行3読込 91 Line Input #1, buf 'カラムID行読込 92 Do Until EOF(1) '縦方向ループ 93 Line Input #1, buf '1行読込 94 buf = "," & buf 'ダミー列を追加 95 tmp = Split(buf, ",") 96 97 Select Case Val(ArySyoriSet(Pos_SyoriType)) 98 Case Inta, Intb 99 100 employeeNum = tmp(12) 101 teate = tmp(17) 102 tanjikan = tmp(21) 103 104 If (tanjikan = "") And (teate = "") Or (teate = 0) And dupDic.Exists(employeeNum) Then 105 ’ご質問の箇所↓ 106 If Not myDic.Exists(employeeNum) Then 107 GoTo Continue 108 End If 109 End If 110 111 Case Intc, Intd 112 employeeNum = tmp(12) 113 teate = tmp(46) 114 kyu = tmp(41) 115 tanjikan = tmp(20) 116 117 ' インフラ手当が空白で、かつ社員番号が重複している場合、レコードをスキップする 118 If (teate = "") Or (teate = 0) And (kyu = "") Or (kyu = 0) And dupDic.Exists(employeeNum) Then 119 GoTo Continue 120 ElseIf (teate = "") Or (teate = 0) And dupDic.Exists(employeeNum) And (tanjikan = "") Then 121 GoTo Continue 122 End If 123 End Select 124 125 126 127 128### 試したこと 129 130 131 132### 補足情報(FW/ツールのバージョンなど) 133 134ここにより詳細な情報を記載してください。
