Страницы: 1
RSS
Может ли один Макрос на разных компьютерах отрабатываться по разному?
 
Всем привет!
Возникла такая проблема. Есть Excel-файл, который собирает Word-документ из разных файлов шаблонов. Т. е., в зависимости от введенных в Excel данных он выбирает титульный лист (docx-файл), сохраняет его в новом файле, открывает и вставляет в него данные. Затем выбирает файл-содержание (docx-файл) и вставляет данные в него. После чего, вставляет второй файл в первый и закрывает второй файл без сохранения. Затем выбирает файл-окончание (docx-файл) и снова вставляет его в первый файл. После чего, сохраняет получившийся файл.
Все работает у меня и у коллег на немецкой Windows 10 и Office 2013.
Отправил файл со всеми шаблонами в наш филиал. Русский Windows 10 и Office 2016.
Некоторые файлы создаются, некоторые - нет. Ошибка возникает в момент сохранения файла-результата. Причем, при открытии файла результата, ворд открывает правильно заполненную "восстановленную копию", которую можно сохранить уже средствами Word'а.
Беру шаблон файла-содержания, с которым была ошибка, переписываю его в шаблон файла-содержания, с которым ошибки не было (структура у всех файлов одинаковая), переименовываю - и все работает. То есть какие-то элементы форматирования файла-шаблона, в зависимости от версии Офисов позволяет или не позволяет макросу сохранить документ. Как такое может быть?

ПС. На всякий случай код Макроса:
Код
Sub main2(macros_date_row%)

Dim wa As Object
Dim wd1 As Object
Dim wd2 As Object
Dim wd3 As Object 
Dim aTitel(10) As String 
Dim aTitel_TMP(10) As String 
Dim aText(23) As String 
    
'macros_date_row% = 5 
device_name$ = Sheets("Anlagen").Cells(macros_date_row%, 2).Value 
firma_name$ = Sheets("Anlagen").Cells(macros_date_row%, 3).Value 
bm1_num% = Sheets("Anlagen").Cells(macros_date_row%, 15).Value 
file1_name$ = Sheets("Anlagen").Cells(macros_date_row%, 16).Value  
bm2_num% = Sheets("Anlagen").Cells(macros_date_row%, 41).Value 
file2_name$ = Sheets("Anlagen").Cells(macros_date_row%, 42).Value
file3_name$ = Sheets("Anlagen").Cells(macros_date_row%, 43).Value
bm1_name$ = Sheets("Anlagen").Cells(macros_date_row%, 44).Value
bm2_name$ = Sheets("Anlagen").Cells(macros_date_row%, 45).Value
wd_visible$ = Sheets("Main").Cells(26, 4).Value 
    
For i = 0 To UBound(aTitel_TMP)
  aTitel_TMP(i) = Sheets("Anlagen").Cells(macros_date_row%, i + 4).Text
Next i

n = 0
For j = 0 To UBound(aTitel_TMP)
  If aTitel_TMP(j) <> "" Then
    aTitel(n) = aTitel_TMP(j)
    n = n + 1
  End If
Next

For i = 0 To bm2_num% - 1
  aText(i) = Sheets("Anlagen").Cells(macros_date_row%, i + 17).Text
Next i

h = Date: y$ = Year(h): m$ = Format(Month(h), "00"): d$ = Format(Day(h), "00")
t = Time():  ht$ = Format(Hour(t), "00"): mt$ = Format(Minute(t), "00"): st$ = Format(Second(t), "00")
fileRes_name$ = "\" + y$ + "-" + m$ + "-" + d$ + " Angebot. " + Split(device_name$, "/")(0) + " [" + firma_name$ + "-" + ht$ + mt$ + st$ + "].docx"

HomeDir$ = ThisWorkbook.Path
Set wa = CreateObject("Word.Application")
If wd_visible$ <> vbNullString Then wa.Visible = True

FileCopy HomeDir$ + "\Doc\" + file1_name$, HomeDir$ + fileRes_name$
FileCopy HomeDir$ + "\Doc\" + file2_name$, HomeDir$ + "\Doc\Result2.docx" 
FileCopy HomeDir$ + "\Doc\" + file3_name$, HomeDir$ + "\Doc\Result3.docx" 

Set wd1 = wa.Documents.Open(HomeDir$ + fileRes_name$)  
For ii = 0 To bm1_num% - 1 
  marker = "tm_" & ii + 1 
  wd1.Bookmarks.Item(marker).Range.Text = aTitel(ii)
Next ii

Set wd2 = wa.Documents.Open(HomeDir$ + "\Doc\Result2.docx") 
For iii = 0 To bm2_num% - 1 
  marker = "tm_" & iii + 1                                             
  wd2.Bookmarks.Item(marker).Range.Text = aText(iii)
Next iii

wd2.Save                                                               
wd2.Range.Copy                                                   
wd1.Bookmarks.Item(bm1_name$).Range.Paste                                
wd2.Close                                                           

Set wd3 = wa.Documents.Open(HomeDir$ + "\Doc\Result3.docx")
wd3.Range.Copy                                                            
wd1.Bookmarks.Item(bm2_name$).Range.Paste                                 
wd3.Close False                                                            

wd1.Range(wd1.Range.End - 1, wd1.Range.End).Delete 1, 2

wd1.Close True  
wa.Quit                                   
Set wa = Nothing
  
MsgBox "Document is created."
End Sub

Ошибка Automation error возникает на строке wd1.Close True.

Add
Заменил эту строчку на wd1.Save: wd1.Close - на моем компьютере срабатывает, а у коллег - Runtime error:  Method 'Save' of object '_Document' failed
Изменено: vadi61 - 04.02.2016 23:38:47
 
С кодом, вроде, всё нормально
В формате DOCX должен успешно сохраняться любой контент (нет чего-то такого, что нельзя было сохранить в этом формате, но можно сохранить в другом)
Вопрос лучше было бы задать на форуме по Word, - там лучше разбираются в нюансах работы с этим приложением.

Я бы попробовал выполнить все описанные действия ВРУЧНУЮ на компе в русском филиале

Если SAVE не проходит, - может, файл открыт в другой копии приложения Word, или доступен только для чтения?
PS: Странное решение - несколько FileCopy
Я обычно открываю шаблон, редактирую, и результат сохраняю под другим именем ( doc.SaveAs ..., doc.Close False) - и всегда все работает
 
Цитата
Игорь написал:
Если SAVE не проходит, - может, файл открыт в другой копии приложения Word, или доступен только для чтения
Спасибо за ответ. Из 98 файлов ошибка происходит на 31 файле, так что вряд ли все они по какой-то причине открываются только для чтения.
Цитата
Игорь написал:
Я обычно открываю шаблон, редактирую, и результат сохраняю под другим именем
Я тоже так делаю в макросе. Строки 47 - 49.

Я проверил на  Windows 7 с Word 2007 - все работает. На Windows 10 с Word 2013 - работает, a Word 2016 - ошибка. Причем вылетает системное окно с сообщением, что
произошла ошибка и Word будет закрыт.

Я просто подумал, что если бы я отлаживал макрос на Word'e 2016 и получал такую ошибку... Я бы в жизни не подумал на Word-документ и искал бы причину в макросе. Так же с ума сойти можно.
 
Цитата
произошла ошибка и Word будет закрыт
это однозначно косяк самого Word
ваш макрос тут не виноват
можно подумать, как обойти ошибку (не допустить её появления), - но не исправить её (в коде ошибок нет)

Office 2016 - еще не очень стабильный (тут недавно пользовался Excel 2016 - он временами зависает)
Пользуйтесь проверенными (более древними) версиями Office, - и проблем не будет
 
Цитата
Игорь написал:
Пользуйтесь проверенными (более древними) версиями Office, - и проблем не будет
Ох. Согласен с Вами на 100%, но зависит, к сожалению, не от меня. А проблему решать мне :)
 
Не только Word в 2016 косячит. Я тут в одной компании на днях столкнулся с примерно таким же феноменом в Excel: до определенного момента все файлы обрабатываются нормально, а потом этот файл открывается по какой-то причине в скрытом режиме и работа кода невозможна. Принудительное отображение файла не спасает - сам Excel его ни в какую видеть не хочет. При этом файлы Excel выбирает по одному ему ведомому принципу...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Связались с Техподдержкой MS. Те попробовали сохранить файлы (уже без макроса - через кнопку Сохранить... и Сохранить как... и еще другими способами) - не получилось. Как решение предложили купить Office 365  :evil:
 
Цитата
vadi61 написал: Как решение предложили купить Office 365
прикольно. Косяк их, а покупать новое ПО другие должны...Не солидно как-то, не ожидал.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Попробуйте в строке кода: wd1.Range(wd1.Range.End - 1, wd1.Range.End).Delete 1, 2
вместо двойки поставить единицу: wd1.Range(wd1.Range.End - 1, wd1.Range.End).Delete 1, 1
 
ZVI, в понедельник попробую. О результатах сообщу.
 
ZVI, к сожалению не помогло
Страницы: 1
Читают тему
Наверх