Как выбрать «Да» в запросах SQL для MailMerge?

Я пытался «обойти» предупреждение Select From Sheet1$, которое появляется, когда вы выполняете слияние документа Word с документом Excel.

Я попытался сохранить каждый документ «без прикрепленного источника данных, но изменил код VBA в каждом документе, чтобы сделать соответствующий OpenDataSource», как указано в Excel VBA для автоматического выбора Да при запросе во время слияния

Но все же Word запрашивает выбор Sheet1$.

Кроме того, DisplayAlerts=0 у меня не работает. Я предполагаю, что так же, как @Ashton Sheets: «У меня проблема с размещением. Когда я установил wdDoc.DisplayAlerts = 0 ДО того, как я установил wdDoc = GetObject(wdInputName, "Word.document"), это, очевидно, не работает, потому что wdDoc не установлено. Но если я поставлю его сразу после строка слишком поздно, потому что слово открывается только ТОГДА, и именно тогда появляется сообщение, поэтому «слишком поздно», как указано в Как использовать VBA, чтобы сказать "Да" любым запросам SQL в word?

Идея этого кода состоит в том, чтобы избежать любых возможных ошибок со стороны пользователей. Поэтому необходимо минимальное количество «кликов» от оператора. Включая MsgBoxс...

Также важно отметить, что для программирования я использую Office 2007. И HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Word\Options не вариант из-за нескольких пользователей и компьютеров, которые будут использовать код.

Вот пример Кодекса:

Option Explicit  
Sub wrd()  

Dim name As String  
Dim wrdapp As Word.Application  
Dim wrddoc As Word.Document  

Set wrdapp = CreateObject("word.application")  
wrdapp.Visible = True  
'wrdapp.DisplayAlerts = False                                                                  

Word.Application.DisplayAlerts = False  
Set wrddoc = wrdapp.Documents.Open("C:\............\3.2_CTO. A.FIN..docx")  

With wrddoc          
   '.Application.DisplayAlerts = wdAlertsNone                                        

    .MailMerge.OpenDataSource ("C:\.......\3.1_Base de datos_FIN.xlsx")      
    .MailMerge.HighlightMergeFields = True  
    .MailMerge.ViewMailMergeFieldCodes = False  
    .MailMerge.DataSource.ActiveRecord = wdLastDataSourceRecord  
name = Hoja14.Range("a2")  
.SaveAs ("C:\...........\Clientes\Persona Física\Cto. " & (tipo) & "# " & (name) + ".docx")  
       wrdapp.Quit  
       Set wrddoc = Nothing  
       Set wrdapp = Nothing  

Application.DisplayAlerts = True  
End With  

End Sub 

person Sergio Mendez    schedule 25.11.2016    source источник


Ответы (3)


Я согласен, что

.DisplayAlerts = False

легче читать, чем

.DisplayAlerts = 0

но оба означают одно и то же

person Storax    schedule 25.11.2016

.DisplayAlerts = False

DisplayAlerts — это логическое выражение, а не номер один. Кроме того, если вы предоставите фрагмент своего кода, это поможет всем нам лучше устранять неполадки в SO.

Вы также можете попробовать .EnableEvents = False. Обычно это работает для приглашения «Сохранить изменения», но также может работать и в вашей ситуации. Опять же, в этой ситуации поможет ссылка на код.

РЕДАКТИРОВАТЬ: увидев ваш код, я бы попробовал добавить этот SQLStatement к вашему объекту .MailMerge.OpenDataSource:

SQLStatement:="SELECT * FROM Sheet1$"

Пример:

.MailMerge.OpenDataSource "C:\.......\3.1_Base de datos_FIN.xlsx",_
      SQLStatement:="SELECT * FROM 'Sheet1$'"

Укажите, где должно быть указано.

person SalvadorVayshun    schedule 25.11.2016
comment
@SergioMendez См. мое предложенное решение выше. Я полагаю, это потому, что вы не указываете, откуда вы хотите извлечь данные в открытом документе. - person SalvadorVayshun; 02.12.2016
comment
Я внес предложенное вами изменение. Теперь в Word есть предупреждение, в котором указано Error in the conection with the ODBC Excel control о том, что оно открыто в монопольном режиме другим пользователем или что ему требуется разрешение на просмотр своих данных или запись в них. - person Sergio Mendez; 02.12.2016
comment
Запустите диспетчер задач и обязательно закройте Word. Убедитесь, что WINWORD.EXE и EXCEL.EXE отсутствуют на вкладке Processes. Иногда я получаю эту ошибку при создании скриптов и не делаю Application.Quit или что-то в этом роде в конце. Это будет держать ваше приложение открытым и особенно сложно при использовании Application.Visible = False. - person SalvadorVayshun; 02.12.2016
comment
Скорее всего, это как-то связано с папкой, в которой хранится каждый документ. Просто запустил код с другим документом, ссылаясь на совершенно другой адрес, и это сработало. Хотя оба имеют атрибут ReadOnly... - person Sergio Mendez; 02.12.2016
comment
Хммм... Тогда я не знаю, что у меня на уме. Вы также можете попробовать добавить параметр Connection:="Data Source={Specify DB book};" к параметру .MailMerge.OpenDataSource, но я не думаю, что это что-то даст. Я бы предположил, что достаточно один раз объявить источник данных. - person SalvadorVayshun; 02.12.2016

Наконец сделал это.

Код закончился так:

'After defining variables and opening word app and word doc:

.MailMerge.OpenDataSource "C:\...\3.1_Base de        datos.xlsx",_     
LinkToSource:=True, _          
SQLStatement:="SELECT * FROM `Sheet1$`"

.MailMerge.ViewMailMergeFieldCodes = False
.MailMerge.DataSource.ActiveRecord = wdLastDataSourceRecord    
.MailMerge.MainDocumentType = wdNotAMergeDocument

.SaveAs ("E:\_...\Cto. " & (tipo) & "# " & (name) + ".docx")
.Close
 wrdapp.Quit
 Set wrddoc = Nothing
 Set wrdapp = Nothing
'Remember that you need to establish in the VisualBasic Editos
' /Tools/References/Microsoft Word Object Library in order to access
'Word VBA's references.

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

Я надеюсь, что это может оказаться полезным.

Спасибо @SalvadorVayshun за вашу помощь.

person Sergio Mendez    schedule 07.12.2016