2015-12-29 9 views
0

Я смотрел и не мог найти ответ на это конкретно. В приведенном ниже коде предлагается пользователю указать, открыт или нет конкретный файл. Если пользователь нажимает «нет», субконцы. Если они нажимают «да», суб-продолжение продолжается. Я тестировал это с открытым файлом, и все отлично работает. Но потом я забыл открыть файл и нажал да в ответ на запрос и получил следующее сообщение об ошибке:Проверка наличия файла для предотвращения ошибки

Ошибка выполнения «9»:

Подстрочный из диапазона

Для этой строки в коде:

с Workbooks («Поворотный - Master - декабрь 2015.xlsm»). Sheets («Поворот»)

Я понимаю, почему я получаю эту ошибку, но как я могу проверить, если «да» ответ от пользователь прав, чтобы предотвратить эту ошибку?

Вот полный код:

Sub Extract_Sort_1512_December() 
' 
' 
    Dim ANS As String 
    ANS = MsgBox("Is the December 2015 Swivel Master File checked out of SharePoint and currently open on this desktop?", vbYesNo + vbQuestion + vbDefaultButton1, "Master File Open") 
    If ANS = vbNo Then 
     MsgBox "This procedure will now terminate.", vbOKOnly + vbExclamation, "Terminate Procedure" 
     Exit Sub 
    End If 

Application.ScreenUpdating = False 

    ' This line renames the worksheet to "Extract" 
    ActiveSheet.Name = "Extract" 

    ' This line autofits the columns C, D, O, and P 
    Range("C:C,D:D,O:O,P:P").Columns.AutoFit 

    ' This unhides any hidden rows 
    Cells.EntireRow.Hidden = False 

Dim LR As Long 

    For LR = Range("B" & Rows.Count).End(xlUp).Row To 2 Step -1 
     If Range("B" & LR).Value <> "12" Then 
      Rows(LR).EntireRow.Delete 
     End If 
    Next LR 

With ActiveWorkbook.Worksheets("Extract").Sort 
    With .SortFields 
     .Clear 
     .Add Key:=Range("B2:B2000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
     .Add Key:=Range("D2:D2000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
     .Add Key:=Range("O2:O2000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
     .Add Key:=Range("J2:J2000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
     .Add Key:=Range("K2:K2000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
     .Add Key:=Range("L2:L2000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
    End With 
    .SetRange Range("A2:Z2000") 
    .Apply 
End With 
Cells.WrapText = False 
Sheets("Extract").Range("A2").Select 

    Dim LastRow As Integer, i As Integer, erow As Integer 

    LastRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row 
    For i = 2 To LastRow 
     If Cells(i, 2) = "12" Then 

      ' As opposed to selecting the cells, this will copy them directly 
      Range(Cells(i, 1), Cells(i, 26)).Copy 

      ' As opposed to "Activating" the workbook, and selecting the sheet, this will paste the cells directly 
      With Workbooks("Swivel - Master - December 2015.xlsm").Sheets("Swivel") 
       erow = .Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0).Row 
       .Cells(erow, 1).PasteSpecial xlPasteAll 
      End With 
      Application.CutCopyMode = False 
     End If 
    Next i 

Application.ScreenUpdating = True 
End Sub 

Я работал через много ошибок в этом коде в течение последних двух дней, и я немного жареным, поэтому любая помощь приветствуется.

Вот мой обновленный IF заявление, чтобы проверить состояние рабочей книги, необходимой для продолжения:

Dim ANS As String 

    ANS = MsgBox("Is the November 2015 Swivel Master File checked out of SharePoint and currently open on this desktop?", vbYesNo + vbQuestion + vbDefaultButton1, "Master File Open") 
    If ANS = vbNo Then 
     MsgBox "This procedure will now terminate.", vbOKOnly + vbExclamation, "Terminate Procedure" 
     Exit Sub 
     ElseIf IsWBOpen("Swivel - Master - November 2015") Then 
    End If 
+0

Хмм ваш, если выше тест должен работать. Почему оставить его пользователю? Откройте его с помощью кода. – findwindow

+0

Все это работает, если файл открыт. Я получаю ошибку, когда файл не открыт, и пользователь нажимает «Да». Затем, когда макрос продолжается и пытается скопировать данные в файл, то есть когда я получаю ошибку. Я также провел исследование о том, как проверить и открыть файл из SharePoint, но я не могу заставить его работать для меня. Я думаю, что это связано с внутренней безопасностью, но пока не подтверждено. Вот почему я иду по маршруту MsgBox. –

+2

Ah sharepoint. Запустите цикл как 'для каждого bk в application.workbooks | if bk.name = Swivel - Master - December 2015.xlsm then flag = "open" else flag = "not open" ', а затем выполнить тест на' flag' и сделать 'exit sub', если flag = not open. Имеет смысл? Изменить: 'bk.name' может дать весь путь, поэтому проверьте соответствующим образом. – findwindow

ответ

1

Используйте эту функцию, чтобы проверить, если требуемая рабочая книга открыта:

Function IsWBOpen(WorkbookName As String) As Boolean 
' check if WorkbookName is already opened; WorkbookName is without path or extension! 
' comparison is case insensitive 
' 2015-12-30 

    Dim wb As Variant 
    Dim name As String, searchfor As String 
    Dim pos as Integer 

    searchfor = LCase(WorkbookName) 
    For Each wb In Workbooks 
     pos = InStrRev(wb.name, ".") 
     If pos = 0 Then       ' new wb, no extension 
      name = LCase(wb.name) 
     Else 
      name = LCase(Left(wb.name, pos - 1)) ' strip extension 
     End If 
     If name = searchfor Then 
      IsWBOpen = True 
      Exit Function 
     End If 
    Next wb 
    IsWBOpen = False 
End Function 

Он смотрит список (открытых) книг и сравнивает имя с его аргументом. Расширение отключено, нет пути, и сравнение не учитывает регистр.
Использование:
If IsWbOpen("Swivel - Master - December 2015") then '... proceed Else Exit Sub End If

+0

Итак, я понятен в понимании (все еще довольно новый для VBA и быстро развивающийся благодаря SO), я не называю книгу в функции, как раз в инструкции If? Если это так, то я могу использовать этот оператор If в других подобных слоях, где название книги немного отличается (например, «Swivel - Master - November 2015»)? Итак, вот глупый вопрос, нужна ли функция в своем собственном модуле? –

+1

Ваше первое предположение на 100% правильное, с использованием параметра этой функции вы можете использовать его повсеместно. Во-вторых, ну, функция должна быть в модуле, но не обязательно в нем. Если вы поместите его в модуль в свой PERSONL.XLS, вы можете использовать его из любой книги. – user1016274

+0

Небольшой сбой (я уверен, что это ошибка пользователя (user = me)). Я отредактировал исходный вопрос выше, чтобы показать оператор IF, который я использую, с предоставленной вами функцией.Я не внес изменения в инструкцию функции. Но когда я запускаю код, я получаю следующую ошибку, если рабочая книга не открыта и пользователь нажимает «Да»: ошибка времени выполнения «5»: неверный вызов или аргумент процедуры. И отладчик указывает на эту строку в функции: name = LCase (Left (wb.name, InStrRev (wb.name, ".") - 1)) 'расширение полосы. Что я делаю не так? –

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