2016-03-21 10 views
-1

У меня есть код в VBA, который копирует листы с одним и тем же именем из разных книг в одну книгу. Книги, которые извлекаются из кода, находятся в одной папке. Код отлично работает в Excel 2010, но когда я запускаю его в Excel 2013, я получаю следующее сообщение об ошибке 1004: «Извините, мы не смогли найти .... xlsx. Возможно ли, что он был перемещен, переименован или удален. " Я не уверен, где начать поиск и устранение неисправностей. Кто-нибудь сталкивается с этой проблемой или имеет какие-либо идеи, почему она отлично работает в Excel 2010, а не в Excel 2013? Спасибо.Код VBA работает в Excel 2010, но не Excel 2013

Sub CombineSheets() 

Application.ScreenUpdating = False 
Application.DisplayAlerts = False 

Dim sPath As String 
Dim sFname As String 
Dim wBk As Workbook 
Dim wSht As Variant 

Application.EnableEvents = False 
Application.ScreenUpdating = False 
sPath = "PathName\Inputs" 
ChDir sPath 
sFname = "*" 
sFname = Dir(sPath & "\" & sFname & ".xlsx*", vbNormal) <Code bombs here> 
wSht = ("Risks") 
Do Until sFname = "" 
    Set wBk = Workbooks.Open(sFname) 
    Windows(sFname).Activate 
    Sheets(wSht).Copy Before:=ThisWorkbook.Sheets(1) 
    wBk.Close False 
    sFname = Dir() 
Loop 
ActiveWorkbook.Save 
Application.EnableEvents = True 
Application.ScreenUpdating = True 
+0

Вы уверены, что файл, он пытается ссылаться все еще существует, в том же месте? –

+0

Если вы нажмете на указанную вами линию, вероятно, что у вас нет папки с именем 'Pathname' в качестве подкаталога текущего каталога или что' PathName' не имеет подкаталога с именем 'Inputs' , Вы подтвердили, что оба на самом деле существуют? Обратите внимание, что вы создали 'PathName' относительный каталог (то есть он должен существовать в той же папке, в которой выполняется ваш код). –

+0

Я уверен, что ссылка все еще существует, и ничего не изменилось с тех пор, как я ее последний раз запускал в Excel 2010. Код будет использоваться в 2013 году, поэтому я пытаюсь выяснить, какая разница. Есть ли другая настройка, которую мне нужно изменить? – AMol

ответ

0

Вы уверены, что этот код работал?

Если это так, то путь к файлу по умолчанию, вероятно, изменился. Вы можете проверить это с помощью Debug.Print Application.DefaultFilePath. В любом случае вам было бы лучше не указывать полный путь к вашей переменной sPath.

Если вы хотите забрать устаревшие документы Excel, то строка в вашей функции Dir может быть просто «* .xls *» (но это также будет собирать книги с поддержкой макросов). Интересно, было ли это изначально предназначено для астерикса в вашем коде.

Нет необходимости активировать окно, но вам может понадобиться строка обработки ошибок, чтобы проверить, существует ли лист «Риски» в книге.

Там также некоторая избыточность в вашем коде, так что все должно работать нормально, как указано ниже:

Sub CombineSheets() 

    Application.ScreenUpdating = False 
    Application.DisplayAlerts = False 

    Dim sPath As String 
    Dim sFname As String 
    Dim wBk As Workbook 
    Dim wSht As Worksheet 

    Application.EnableEvents = False 
    Application.ScreenUpdating = False 
    sPath = "PathName\Inputs" 'make this a full path eg "C:\..." 
    sFname = Dir(sPath & "\" & "*.xls*", vbNormal) 
    Do Until sFname = "" 

     'skip if it's this workbook 
     If sFname <> ThisWorkbook.Name Then 
      Set wBk = Workbooks.Open(sPath & "\" & sFname) 

      'check a "Risks" sheet exists 
      Set wSht = Nothing 
      On Error Resume Next 
      Set wSht = wBk.Sheets("Risks") 
      On Error GoTo 0 

      If Not wSht Is Nothing Then 
       wSht.Copy Before:=ThisWorkbook.Sheets(1) 
      End If 

      wBk.Close False 

     End If 

     sFname = Dir() 
    Loop 
    ActiveWorkbook.Save 
    Application.EnableEvents = True 
    Application.ScreenUpdating = True 

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