2016-05-11 4 views
1

Код, который я сделал, предназначен для перехода вниз по двум столбцам в электронной таблице и создания папок в папках. Левый столбец имеет имя папки 1-го уровня, а второй столбец имеет папки в папке первого уровня.Вложенный при ошибке VBA

1st layer 2nd layer 
3508023  131392 
3508023  90701 - repeat 
3508023  115469 
3508023  358167 
3705584  90701 - repeat 
3705584  133214 
3705584  349453 

Мой код в настоящее время обрабатывает, если папка первого слоя уже существует, пропуская его, и идти к следующей итерации, но я не могу понять, как обрабатывать ошибку, если папка второго слоя уже существует с помощью вложенного сообщение об ошибке.

Вот код, у меня есть

Sub ProPlanner() 
    ' 
    ' ProPlanner Macro 
    ' 
    Dim strRout As String 
    Dim strTask As String 
    Dim strPath As String 

    Dim RoutCellCol As Integer 
    Dim TaskCellCol As Integer 

    Dim RoutCellRow As Integer 
    Dim TaskCellRow As Integer 

    Dim NewRoutPath As String 
    Dim NewTaskPath As String 

    'declare staring cells in spreadsheet 

    RoutCellCol = 2 
    RoutCellRow = 2 

    TaskCellCol = 6 
    TaskCellRow = 2 


    Do Until TaskCellRow > 72 'ending row 

    strRout = Cells(RoutCellRow, RoutCellCol).Value 

    On Error GoTo TaskInRoute 

    'create first layer folder in shared file 

    NewRoutPath = ("S:DEPT\IE\Employee Files\Chris\" & "Rout " & strRout) 
    MkDir (NewRoutPath) 

    'create the first 2nd layer folder within the 1st layer folder just created 

    strTask = Cells(TaskCellRow, TaskCellCol).Value 

    NewTaskPath = (NewRoutPath & "\" & strTask) 
    MkDir (NewTaskPath) 


IterationLoop: 

    RoutCellRow = RoutCellRow + 1 
    TaskCellRow = TaskCellRow + 1 

Loop 

Exit Sub 

'error handler if 1st layer folder already exists 

TaskInRoute: 


    strTask = Cells(TaskCellRow, TaskCellCol).Value 

    NewTaskPath = (NewRoutPath & "\" & strTask) 
    MkDir (NewTaskPath) 'error occurs here if 2nd layer folder already exists...nested on error statement? 



    Resume IterationLoop 


Exit Sub 

End Sub 
+1

'Sub ProPlanner()' - тот факт, что этот метод не начинается с глаголом говорит нам точно, что он делает, является признаком того, что он делает слишком много вещей. Разделите вещи, извлеките ответственность в отдельные функции и процедуры, каждый из которых отвечает за обработку собственного набора возможных ошибок. Я бы посоветовал вам поместить ваш код на [codereview.se] *, когда он будет работать так, как предполагалось *, если вы хотите получить экспертную оценку/отзывы по всем аспектам кода и советы по его очистке, более отказоустойчивости и как правило, легче поддерживать. –

+0

Этот макрос - всего лишь одно время, но если я сделаю макрос, который широко или часто используется, я буду использовать обзор кода. Спасибо – Chris

ответ

1

вы холодный добавить проверку, как следует

TaskInRoute: 

    strTask = Cells(TaskCellRow, TaskCellCol).Value 

    NewTaskPath = (NewRoutPath & "\" & strTask) 
    If Dir(NewRoutPath & "\" & strTask, vbDirectory) = "" Then 
     MkDir (NewTaskPath) 'error occurs here if 2nd layer folder already exists...nested on error statement? 
    Else 
     ' subfolder already exists 
     ' do other things 
    End If 

    Resume IterationLoop 
+0

++ Лучшая обработка ошибок - это проблемы с обработкой ошибок, прежде чем они превратятся в ошибку времени выполнения. –

+0

Я не знаю, почему я не думал об утверждении If then. Спасибо. – Chris

+0

приветствуются – user3598756

Смежные вопросы