Vídeo recomendado
https://youtu.be/diWPPPhW-9E
https://youtu.be/diWPPPhW-9E
excel vba e word
excel vba e word
Boa noite, queridos. Construi um banco de dados no Excel que é alimentado por uma useform, especificamente um cadastro de clientes. No microsoft Word tenho um documento que usa alguns dos dados do banco de dados (ficha cadastral que é impressa), gostaria de saber como faço para que alguns dados do banco preecham os campos, tipo colocar um botão gerar ficha cadastral no meu form e ele abrir o documento do Word já preenchido com os dados selecionados, tipo nome; endereço etc. Atualmente uso o recurso de mala direta para fazer isso, diretamente no word, onde indico o número do cliente e ele gera uma nova carta, mas gostaria que isso se fizesse diretamento do meu form.
- joseA
- Jedi
- Mensagens: 1048
- Registrado em: Qui Out 22, 2009 7:22 am
- Localização: Cel. Fabriciano - MG
Re: excel vba e word
Uma solução bem simples seria o colar especial com vinculo. Mas tem outras soluções mais elaboradas.
Mostra um exemplinho.
Mostra um exemplinho.
-
- Acabou de chegar
- Mensagens: 8
- Registrado em: Qua Abr 08, 2015 8:04 pm
Re: excel vba e word
OLá Danny,
Tudo bem com você?
Com base no que você falou criei uma aplicação muito simples, mas que pode lhe dar alguma luz.
Ao invés de trocar o texto do Word, eu inserir labels no arquivo Word e troco o Caption dessas labels.
Basta abrir o arquivo Excel, rodar a macro e você verá que surgiram os arquivos na pasta com os dados alterados. Qualquer dúvida estou a disposição,
Abraços
http://www.excelparaestagiarios.com.br
Tudo bem com você?
Com base no que você falou criei uma aplicação muito simples, mas que pode lhe dar alguma luz.
Ao invés de trocar o texto do Word, eu inserir labels no arquivo Word e troco o Caption dessas labels.
Basta abrir o arquivo Excel, rodar a macro e você verá que surgiram os arquivos na pasta com os dados alterados. Qualquer dúvida estou a disposição,
Abraços
http://www.excelparaestagiarios.com.br
Re: excel vba e word
Obrigado pela atenção e as soluções são bem interessantes. Mas eu fiz o seguinte mantive o meu documento base no word "fichacadastral" nele vinculei a lista do arquivo do excel como mala direta. No form VBA coloque o seguinte botão "gerar ficha cadastral" e inseri o seguinte código: (que deu erro no local indicado)
Private Sub botão_ficha_Click()
Dim wd As Object
Dim wdocSource As Object
Dim strWorkbookName As String
On Error Resume Next
Set wd = GetObject(, "Word.Application")
If wd Is Nothing Then
Set wd = CreateObject("Word.Application")
End If
On Error GoTo 0
Set wdocSource = wd.Documents.Open("C:\Users\Daniel\Documents\ficha.docx")
strWorkbookName = ThisWorkbook.Path & "\" & ThisWorkbook.Name
wdocSource.MailMerge.MainDocumentType = wdFormLetters
o erro ocorre aqui - wdocSource.MailMerge.OpenDataSource _
Name:=strWorkbookName, _
AddToRecentFiles:=False, _
Revert:=False, _
Format:=wdOpenFormatAuto, _
Connection:="Data Source=" & strWorkbookName & ";Mode=Read", _
SQLStatement:="SELECT * FROM `_registros_$`"
With wdocSource.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Execute Pause:=False
End With
wd.Visible = True
wdocSource.Close SaveChanges:=False
Set wdocSource = Nothing
Set wd = Nothing
End Sub
Private Sub botão_ficha_Click()
Dim wd As Object
Dim wdocSource As Object
Dim strWorkbookName As String
On Error Resume Next
Set wd = GetObject(, "Word.Application")
If wd Is Nothing Then
Set wd = CreateObject("Word.Application")
End If
On Error GoTo 0
Set wdocSource = wd.Documents.Open("C:\Users\Daniel\Documents\ficha.docx")
strWorkbookName = ThisWorkbook.Path & "\" & ThisWorkbook.Name
wdocSource.MailMerge.MainDocumentType = wdFormLetters
o erro ocorre aqui - wdocSource.MailMerge.OpenDataSource _
Name:=strWorkbookName, _
AddToRecentFiles:=False, _
Revert:=False, _
Format:=wdOpenFormatAuto, _
Connection:="Data Source=" & strWorkbookName & ";Mode=Read", _
SQLStatement:="SELECT * FROM `_registros_$`"
With wdocSource.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Execute Pause:=False
End With
wd.Visible = True
wdocSource.Close SaveChanges:=False
Set wdocSource = Nothing
Set wd = Nothing
End Sub
Re: excel vba e word
Bom dia e obrigado a todos que me deram uma resposta. Solucionei integralmente meu problema, a seguir vou passar um resumo para quem queria saber da solução.
Tenho os seguintes componentes: um useform que alimenta uma planilha no excel que contém duas folhas- _registros_ e uma segunda; uma séria de documentos que eram preenchidos com os dados dessa planilha _registros_ (campos: nº cliente, nome, etc). No word, usando o recurso mala direta, usei como fonte de dados a minha planilha, em seguida inseri os campos a serem mesclados (tudo com os comandos da mala direta do word mesmo), assim um comando SQL foi inserido no meu arquivo do word (tipo - ficha cadastral é um deles), em seguida criei no forma um botão com o nome do documento a ser preenchido; no meu projeto VBA Excel fui em ferramenta\suplementos e selecionei microsoft word 14.0 object library; no documento do word (ex. ficha cadastral) também na tela do VBA ferramenta\suplementos e selecionei microsoft excel 14.0 object library (nenhum outro código é digitado no VBA do Word). Depois foi só programar o botão ficha cadastral com o seguinte código:
Private Sub botão_fichacadastral_Click()
' o form deve estar exibindo um cliente, no caso indico o número e os dados são preenchidos no form para conferir a quem será gerado a ficha, se estiver em branco ele sai da rotina com a mensagem
If txt_a_numerocliente = "" Then
MsgBox "você deve selecionar um cliente para emitir a cadastral"
Else
'o código para mesclar começa mesmo aqui
Dim wd As Object
Dim wdocSource As Object
Dim strWorkbookName As String
On Error Resume Next
Set wd = GetObject(, "Word.Application")
If wd Is Nothing Then
Set wd = CreateObject("Word.Application")
End If
On Error GoTo 0
Set wdocSource = wd.Documents.Open("D:\ESCRITÓRIO\ficha cadastral.docx")
strWorkbookName = ThisWorkbook.Path & "\" & ThisWorkbook.Name
wdocSource.MailMerge.MainDocumentType = wdFormLetters
wdocSource.MailMerge.OpenDataSource _
Name:=strWorkbookName, _
AddToRecentFiles:=False, _
Revert:=False, _
Format:=wdOpenFormatAuto, _
Connection:="Data Source=" & strWorkbookName & ";Mode=Read", _
SQLStatement:="SELECT * FROM `_registros_$`"
With wdocSource.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
' aqui eu limito para quem será gerada a ficha, no caso somente para o cliente selecionado, pois, do contrário ele sempre gerará para todos os clientes da planilha
.FirstRecord = txt_a_numerocliente ' este é o nome da textbox onde fica o número do cliente
.LastRecord = txt_a_numerocliente
'' .FirstRecord = wdDefaultFirstRecord
' .LastRecord = wdDefaultLastRecord
End With
.Execute Pause:=False
End With
wd.Visible = True
wdocSource.Close SaveChanges:=False
Set wdocSource = Nothing
Set wd = Nothing
End If
End Sub
O resultado é ótimo, tenho um programa com interface própria, e posso preencher vários documentos padrões em um click, no meu caso entre 4 e 8 docs, dependo do caso. Os documentos bases nunca perdem a vinculção SQL, pois, são fechados assim que o documento preenchido é aberto. Ufa!!!!
Ai vocês vão dizer que eu mesmo perguntei e eu mesmo respondi, rs. Sim. Afinal eu achei que ia ser um bicho de 7 cabeças fazer isso, mas foi muito fácil, logo resolvi compartilhar.
Tenho os seguintes componentes: um useform que alimenta uma planilha no excel que contém duas folhas- _registros_ e uma segunda; uma séria de documentos que eram preenchidos com os dados dessa planilha _registros_ (campos: nº cliente, nome, etc). No word, usando o recurso mala direta, usei como fonte de dados a minha planilha, em seguida inseri os campos a serem mesclados (tudo com os comandos da mala direta do word mesmo), assim um comando SQL foi inserido no meu arquivo do word (tipo - ficha cadastral é um deles), em seguida criei no forma um botão com o nome do documento a ser preenchido; no meu projeto VBA Excel fui em ferramenta\suplementos e selecionei microsoft word 14.0 object library; no documento do word (ex. ficha cadastral) também na tela do VBA ferramenta\suplementos e selecionei microsoft excel 14.0 object library (nenhum outro código é digitado no VBA do Word). Depois foi só programar o botão ficha cadastral com o seguinte código:
Private Sub botão_fichacadastral_Click()
' o form deve estar exibindo um cliente, no caso indico o número e os dados são preenchidos no form para conferir a quem será gerado a ficha, se estiver em branco ele sai da rotina com a mensagem
If txt_a_numerocliente = "" Then
MsgBox "você deve selecionar um cliente para emitir a cadastral"
Else
'o código para mesclar começa mesmo aqui
Dim wd As Object
Dim wdocSource As Object
Dim strWorkbookName As String
On Error Resume Next
Set wd = GetObject(, "Word.Application")
If wd Is Nothing Then
Set wd = CreateObject("Word.Application")
End If
On Error GoTo 0
Set wdocSource = wd.Documents.Open("D:\ESCRITÓRIO\ficha cadastral.docx")
strWorkbookName = ThisWorkbook.Path & "\" & ThisWorkbook.Name
wdocSource.MailMerge.MainDocumentType = wdFormLetters
wdocSource.MailMerge.OpenDataSource _
Name:=strWorkbookName, _
AddToRecentFiles:=False, _
Revert:=False, _
Format:=wdOpenFormatAuto, _
Connection:="Data Source=" & strWorkbookName & ";Mode=Read", _
SQLStatement:="SELECT * FROM `_registros_$`"
With wdocSource.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
' aqui eu limito para quem será gerada a ficha, no caso somente para o cliente selecionado, pois, do contrário ele sempre gerará para todos os clientes da planilha
.FirstRecord = txt_a_numerocliente ' este é o nome da textbox onde fica o número do cliente
.LastRecord = txt_a_numerocliente
'' .FirstRecord = wdDefaultFirstRecord
' .LastRecord = wdDefaultLastRecord
End With
.Execute Pause:=False
End With
wd.Visible = True
wdocSource.Close SaveChanges:=False
Set wdocSource = Nothing
Set wd = Nothing
End If
End Sub
O resultado é ótimo, tenho um programa com interface própria, e posso preencher vários documentos padrões em um click, no meu caso entre 4 e 8 docs, dependo do caso. Os documentos bases nunca perdem a vinculção SQL, pois, são fechados assim que o documento preenchido é aberto. Ufa!!!!
Ai vocês vão dizer que eu mesmo perguntei e eu mesmo respondi, rs. Sim. Afinal eu achei que ia ser um bicho de 7 cabeças fazer isso, mas foi muito fácil, logo resolvi compartilhar.
-
- Acabou de chegar
- Mensagens: 1
- Registrado em: Sex Set 25, 2015 2:04 am
Re: excel vba e word
Boa noite danny.
Olha, eu tenho o mesmo problema que você e parece que conseguiu resolver o seu!
Teria como me ajudar com o meu problema?
Tentei utilizar o seu código na minha planilha que também tem a função de abrir uma macro no Word, e selecionar o cliente que eu escolhi dentro do sistema do Excel, porém, ele abre o word depois que clico no botão abrir, apenas depois que eu vou para uma janela para selecionar a Tabela e então, depois de selecionar, ele abre o Word mas dá erro aqui:
wdocSource.MailMerge.OpenDataSource _
Name:=strWorkbookName, _
AddToRecentFiles:=False, _
Revert:=False, _
Format:=wdOpenFormatAuto, _
Connection:="Data Source=" & strWorkbookName & ";Mode=Read", _
SQLStatement:="SELECT * FROM `_registros_$`"
No mesmo lugar que dava no seu, dizendo que o Word não pode abrira fonte de dados.
Consegue me ajudar?
Olha, eu tenho o mesmo problema que você e parece que conseguiu resolver o seu!
Teria como me ajudar com o meu problema?
Tentei utilizar o seu código na minha planilha que também tem a função de abrir uma macro no Word, e selecionar o cliente que eu escolhi dentro do sistema do Excel, porém, ele abre o word depois que clico no botão abrir, apenas depois que eu vou para uma janela para selecionar a Tabela e então, depois de selecionar, ele abre o Word mas dá erro aqui:
wdocSource.MailMerge.OpenDataSource _
Name:=strWorkbookName, _
AddToRecentFiles:=False, _
Revert:=False, _
Format:=wdOpenFormatAuto, _
Connection:="Data Source=" & strWorkbookName & ";Mode=Read", _
SQLStatement:="SELECT * FROM `_registros_$`"
No mesmo lugar que dava no seu, dizendo que o Word não pode abrira fonte de dados.
Consegue me ajudar?
Re: excel vba e word
Olá Dannythex!
Poderia enviar um exemplo de como ficou o seu modelo final?
Abs
Helio
Poderia enviar um exemplo de como ficou o seu modelo final?
Abs
Helio