2015-12-14 9 views
1

Следующий код VBA не сохранит открытый документ в подпапке под активной папкой «Мои документы». Код вызывается из App_DocumentBeforeClose и выполняется без сброса флага ошибки или уведомления об ошибке процесса. Весь код и сохранение строкового строя строятся так, как предполагалось, - открытый документ просто не сохраняется в подпапку «Мои документы». Сам файл является рабочей копией, хранящейся на чипе SDHC, - может ли это быть проблемой? Я проверил права на папку и отключил атрибут «Только для чтения» подпапки.MS Word 2013 VBA Macro Function

Public Sub SaveToTwoLocations() 
Dim Res 
Dim oDoc As Document, SourceFile As String, DestinationFile As String 
Dim strBackUpPath As String, fDialog As FileDialog, Reps, DocName As String 

If Right(ActiveWindow.Caption, 4) = "ode]" Then 
    DocName = Left(ActiveWindow.Caption, Len(ActiveWindow.Caption) - 21) 
ElseIf Right(ActiveWindow.Caption, 5) = ".docx" Then 
    DocName = Left(ActiveWindow.Caption, Len(ActiveWindow.Caption) - 5) 
End If 

On Error GoTo CanceledByUser 

Res = MsgBox("Save Source File?", vbQuestion + vbYesNo, "Save Original Prior to Back-Up Interrogative") 
If Res = vbYes Then 
    Application.ActiveDocument.Save 
End If 

If GetSetting("My_Books", DocName, "Save_2") = "" Then 
    Set fDialog = Application.FileDialog(msoFileDialogFolderPicker) 
    With fDialog 
     .Title = "Select Folder to Save The Copy To & Click Ok" 
     .AllowMultiSelect = False 
     .InitialView = msoFileDialogViewList 
     If .Show <> -1 Then 
      MsgBox "Canceled By user", , "Save To Two Locatiions" 
      Exit Sub 
     End If 
     strBackUpPath = fDialog.SelectedItems.Item(1) & "\" 
     Res = MsgBox("Save File To Selected 'SaveTo' Location?", vbQuestion + vbYesNo, "'SaveTo' Interrogative") 
     If Res = vbYes Then 
      SaveSetting "My_Books", DocName, "Save_2", strBackUpPath 
      strBackUpPath = strBackUpPath & DocName & ".docx" 
      Application.ActiveDocument.SaveAs2 (strBackUpPath) 
     Else 
      Exit Sub 
     End If 
    End With 

Else 

    strBackUpPath = GetSetting("My_Books", DocName, "Save_2") 
    Res = MsgBox("Save This Document To: " & strBackUpPath & "?", vbQuestion + vbYesNo, "Two Location Save Interrogative") 
    If Res = vbYes Then 
     If Right(ActiveDocument.Name, 1) = "x" Then 
      Application.ActiveDocument.SaveAs2 (strBackUpPath = strBackUpPath & DocName & ".docx") 
     Else 
      MsgBox "Non-docx Doument File Save Error", vbCritical, "2nd Location File Save Error" 
      GoTo CanceledByUser 
     End If 
    Else 
     Set fDialog = Application.FileDialog(msoFileDialogSaveAs) 
     With fDialog 
      .Title = "Select Folder to Save The Copy To & Click Ok" 
      .AllowMultiSelect = False 
      .InitialView = msoFileDialogViewList 
      If .Show <> -1 Then 
       MsgBox "File Save Canceled By User", , "Save To Two Locatiions Canceled" 
       Exit Sub 
      End If 
     End With 
    End If 

End If 

CanceledByUser: 
End Sub 
+1

Эта строка выглядит неправильно (с попыткой присвоения в списке параметров): Application.ActiveDocument.SaveAs2 (strBackUpPath = strBackUpPath & DocName & ".docx") –

+0

Тим Уильямс - Процесс построения строки должен учитывать тот факт, что имя документа было усечено в [ElseIf Right (ActiveWindow.Caption, 5) = ".docx" Then], чтобы разрешить сопоставление ключа реестра, идентифицирующего ранее сохраненное сохранение в местоположении, - это позволяет мне различать несколько документов, которые в настоящее время обрабатываются , – RockyFaher

+0

Возникает ли проблема для документов «.doc» и «.docx» или только для первого? Поскольку способ сохранения документа «.doc» (в случае отсутствия предыдущих настроек) явно ошибочен. (В случае, когда есть предыдущая настройка, исправьте код в соответствии с @bibadia) –

ответ

2
Application.ActiveDocument.SaveAs2 (strBackUpPath = strBackUpPath & DocName & ".docx") 

должен быть

Application.ActiveDocument.SaveAs2 strBackUpPath 
+0

Код должен был быть: Application.ActiveDocument.SaveAs2 (strBackUpPath & DocName & ".docx") В моей защите я скажу, что Microsoft часто является ее собственным злейшим врагом по причинам, достаточно задокументированным в другом месте - как для кода, так и для изначально написанный, он работал бы в стандартном VB6, НО VBA не был VB6. Тиму Уильямсу я выражаю свою благодарность - в то время как технически некорректный, вы меня на правильном ответе, И возможно, что конкатенация, как написано, была неверно истолкована компилятором. Но конкатенация, которая была переписана, по-прежнему требовалась по соображениям эффективности. Благодаря! – RockyFaher

+0

О, и теперь он отлично работает, когда я исправил свою ошибку! – RockyFaher

0

Код должен быть: Application.ActiveDocument.SaveAs2 (strBackUpPath & DOCNAME & ".docx") В мою защиту, я буду говорить, что Microsoft часто является ее собственным злейшим врагом по причинам, достаточно задокументированным в других местах. Что касается кода, который изначально был написан, он работал бы в стандартном VB6, НО VBA не был VB6. Тиму Уильямсу я выражаю свою благодарность - в то время как технически некорректный, вы меня на правильном ответе, И возможно, что конкатенация, как написано, была неверно истолкована компилятором. Но конкатенация, которая была переписана, по-прежнему требовалась по соображениям эффективности и компактности. О, и теперь он отлично работает, когда я исправил свою ошибку! Спасибо всем!

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