前提・実現したいこと
ExcelファイルからExcelファイルへの転記マクロ作成(条件付き)
以下目的を達成する方法をご教示いただきたいです
エンジニアではないため、プログラミングへの理解が至らない部分もありますが、宜しくお願い致します
【前提】
顧客からの問い合わせをExcelファイルで管理しています(問い合わせ1件につき、ファイル1つ)
問い合わせファイル内には、問い合わせ内容・日時、対応内容・日時などを記載しており、
ファイルは問い合わせへの対応のステータス毎(「未対応」、「対応中」、「対応済み」)
にフォルダに分けています(手作業)
【現状】
これら全てのファイルを一覧にするマクロを作成しました(問い合わせ1件を1レコードとして一覧に転記)
【目的】
問い合わせファイルが増え、マクロの実行に時間がかかるようになったため、
一覧ファイルの特定のカラム(対応日時)が埋まっている場合は転記せず、
空白の場合のみ、問い合わせファイルから転記するようプログラムを修正したいです
【問題】
条件を追加したところ、条件を反映されておらず、【
現状】同様、問い合わせファイル全件が一覧ファイルに転記されてしまいます
【前提条件】
・一覧ファイルは、問い合わせファイルを格納するステータス毎のフォルダと同フォルダです
・一覧ファイルへの転記は、12行目から行います
発生している問題・エラーメッセージ
エラーメッセージはなく、マクロ自体は正常に終了します
該当のソースコード
VBA
1'※コメントアウトしている箇所は一部伏せさせていただいております 2 3 '変数宣言 4 Dim strDefPath As String 5 Dim strActiveSheet As String 6 Dim strMyBook As String 7 Dim fileName As String 8 Dim ctrlNum, ny_ctrlNum As String 9 10 '定数宣言 11 Const strInSheet As String = "お客様問い合わせファイル" 12 Const strDefFlID As String = "問い合わせ" 13 Const strTAIOUZUMI = "\30 対応済み" 14 Const strTAIOUCHU = "\20 対応中" 15 Const strMITAIOU = "\10 未対応" 16 17Public Sub 一覧作成() 18 19 Dim fs As FileSearch 20 Dim fso As Object 21 Dim file, folder As Variant 22 Dim intRet, i, row As Integer 23 Dim lngi As Long 24 Dim lngOutRow As Long 25 Dim cell As Variant 26 27 '一覧作成の実行確認 28 intRet = MsgBox("表を最新の状態にします。よろしいですか?", vbOKCancel, "確認") 29 If intRet <> vbOK Then 30 Exit Sub 31 End If 32 33 '自動更新しないように設定 34 With Application 35 .Calculation = xlCalculationAutomatic 36 .MaxChange = 0.001 37 End With 38 ActiveWorkbook.PrecisionAsDisplayed = False 39 40 'シートの非表示行を表示する 41 Cells.Select 42 Selection.EntireColumn.Hidden = False 43 44 '画面の更新を止める 45 Application.ScreenUpdating = False 46 47 '★今回の条件追加のために、取得 48 '対応完了日(AQ列)が空白の行の管理NOを取得する 49 '対応完了日(AQ列)が空白でない行の管理NOを取得する 50 51 For Each cell In Range("AQ12:AQ3000") 52 53If cell = "" Then 54 ny_ctrlNum = cell.Offset(0, -39) 55 ElseIf cell <> "" Then 56 ctrlNum = cell.Offset(0, -39) 57 End If 58 Next 59 60 '★今回の条件追加のために以下のように変更 61 '変更前:12行目以降すべてクリア 62 '変更後:対応完了日が空白の行のみクリア 63 '対応完了日(AQ列)が空白の行の値をクリアする 64 For Each cell In Range("AQ12:AQ3000") 65 If cell = "" Then 66 row = Range("AQ12").row 67 Rows(row).ClearContents 68 End If 69 Next 70 71 'ファイルのパスを取得する' 72 strMyBook = ActiveWorkbook.Name 73 strActiveSheet = ActiveSheet.Name 74 Set fso = CreateObject("Scripting.FileSystemObject") 75 76 lngOutRow = 11 77 78 '対応済みフォルダ内の検索 79 strDefPath = ActiveWorkbook.Path & strTAIOUZUMI 80 For Each file In fso.GetFolder(strDefPath).Files 81 lngOutRow = lngOutRow + 1 82 intRet = SHEET_PROC(file.Path, strMyBook, lngOutRow) 83 If intRet = 1 Then 84 lngOutRow = lngOutRow - 1 85 ElseIf intRet = 9 Then 86 MsgBox "エラーのため強制終了します。" 87 End If 88 Next 89 90 '対応中フォルダ内の検索 91 strDefPath = ActiveWorkbook.Path & strTAIOUCHU 92 For Each file In fso.GetFolder(strDefPath).Files 93 lngOutRow = lngOutRow + 1 94 intRet = SHEET_PROC(file.Path, strMyBook, lngOutRow) 95 If intRet = 1 Then 96 lngOutRow = lngOutRow - 1 97 ElseIf intRet = 9 Then 98 MsgBox "エラーのため強制終了します。" 99 End If 100 Next 101 102 '未対応フォルダ内の検索 103 strDefPath = ActiveWorkbook.Path & strMITAIOU 104 For Each file In fso.GetFolder(strDefPath).Files 105 lngOutRow = lngOutRow + 1 106 intRet = SHEET_PROC(file.Path, strMyBook, lngOutRow) 107 If intRet = 1 Then 108 lngOutRow = lngOutRow - 1 109 ElseIf intRet = 9 Then 110 MsgBox "エラーのため強制終了します。" 111 End If 112 Next 113 114 Call set_num 115 116 Range("A3").Select 117 118 MsgBox "一覧作成しました。" 119 120 '画面描画を再開 121 Application.ScreenUpdating = True 122 123 Exit Sub 124 125End Sub 126 127 128Function SHEET_PROC(strInFl As String, strOutBook As String, lngRowOut As Long) As Integer 129 130 Dim strWk As String 131 Dim strInBook As String 132 Dim intPos As Integer 133 Dim wbIn As Workbook 134 135 SHEET_PROC = 9 136 137 'リンクを更新せずにファイルを開く 138 Set wbIn = Workbooks.Open(strInFl, 0) 139 140 intPos = InStr(strInFl, strDefFlID) 141 142 strInBook = Mid(strInFl, intPos) 143 144 '★今回の条件追加のために、IF文を追加 145 If strInBook <> ctrlNum Then 146 147 ' 148 ' 149 Workbooks(strOutBook).Worksheets(strActiveSheet).Cells(lngRowOut, 2).Value = wbIn.Worksheets(strInSheet).Cells(10, 33).Value 150 Workbooks(strOutBook).Worksheets(strActiveSheet).Cells(lngRowOut, 3).Value = wbIn.Worksheets(strInSheet).Cells(10, 34).Value 151 ' 152 '※質問の文字数の都合上略します 153 '(略) 154 Workbooks(strOutBook).Worksheets(strActiveSheet).Cells(lngRowOut, 69).Value = wbIn.Worksheets(strInSheet).Cells(2, 46).Value 155 156 'ファイルを保存せずに閉じる 157 wbIn.Close SaveChanges:=False 158 SHEET_PROC = 0 159 End If 160 161Exit Function 162 163End Function 164 165 166Sub set_num() 167 168 Dim WBook As String 169 Dim ASheet As String 170 Dim L As Integer 171 Dim n As Integer 172 173 'ソート 174 Rows("11:3000").Select 175 Selection.Sort Key1:=Range("D12"), Order1:=xlAscending, _ 176 Key2:=Range("E12"), Order2:=xlAscending, Header:=xlYes, _ 177 OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin 178 179 'Rif番号付け 180 L = 12 181 n = 1 182 183 WBook = ActiveWorkbook.Name 184 ASheet = ActiveSheet.Name 185 186 While Workbooks(WBook).Worksheets(ASheet).Cells(L, 4).Value <> "" 187 Workbooks(WBook).Worksheets(ASheet).Cells(L, 1).Value = n 188 L = L + 1 189 n = n + 1 190 Wend 191 192End Sub 193
### 試したこと Gotoステートメントの利用など試したのですが、いずれも想定通りの結果にはなりませんでした。 ### 補足情報(FW/ツールのバージョンなど) Excel2016
回答2件
あなたの回答
tips
プレビュー