Notifications
Clear all

[Resolvido] Integrar VBA Excel com Word e criar novo documento

10 Posts
3 Usuários
1 Reactions
1,780 Visualizações
(@buscheric)
Posts: 13
Eminent Member
Topic starter
 

Olá pessoal,

 

Estou iniciando no mundo VBA, pois preciso resolver um problema e estou apanhando bastante... Agradeço se puderem me ajudar....

Para facilitar o entendimento: minha esposa faz exames de ultrassom em animais e ela precisa fazer os laudos num documento do Word. Porém, a cada novo laudo, a gente preenche os dados em uma planilha e depois repete o preenchimento no cabeçalho do laudo.

O problema: Gostaria de fazer o preenchimento dos dados apenas uma vez, no Excel, e que apertando um botão, os dados já sejam passados automaticamente para o Word, criando um novo arquivo, com um novo nome.

Por partes, de como está a situação até agora:

1. Tenho uma planilha no Excel, que contém diversos dados, como nome do paciente, idade, sexo, clínica, proprietário, etc.

2. Já consegui fazer um VBA para colocar os dados, apertar "OK" e ele alimenta a planilha do Excel.

3. Descobri que tenho, no Word, que colocar no cabeçalho do laudo "palavras-chave" para conseguir fazer o programa entender onde quero cada informação. Por exemplo #nomepaciente, #idadepaciente, #sexopaciente, etc.

O que preciso de ajuda para fazer:

1. Fazer o Excel "chamar" o arquivo "modelo_laudo" para poder inserir as informações ali.

2. Jogar as informações necessárias no "modelo_laudo".

3. Renomear o arquivo para um nome diferente em cada caso.

OBS: O nome dos arquivos normalmente é sequenciado para cada clínica diferente, seguido do nome do paciente. Por exemplo: "ABC 001 - Tobi"; "CDE 012 - Pluto"; "XYZ 036 - Totó".

OBS2: O nome "ABC 001", "CDE 012" já é gerado automaticamente, conforme a quantidade de exames que foi feito em cada clínica (ver excel). Porém o nome do animal não. Preciso juntar essas duas informações para dar o nome correto ao arquivo.

 

Agradeço toda a ajuda que puderem me dar. Estou apanhando aqui faz algumas semanas, para tentar fazer isso funcionar, mas não vai.... Qualquer informação que precisarem, só avisar...

Obrigado e Abraços

 

Como está minha programação VBA até o momento (acabei de testar aqui, e o Excel não abriu a minha tela Userform. Não sei o que aconteceu. Copiei de um computador para o outro e acho que deve ter dado pau):

Private Sub Botao_Salvar_Click()

'COMANDO PARA INSERIR OS VALORES NA PLANILHA
linha = Sheets("2020").Range("C2").End(xlDown).Row + 1

Fixo_Laudo = Cells(linha, 2)
Cells(linha, 3) = Cx_Tipo.Value
Cells(linha, 5) = Cx_Local.Value
Cells(linha, 7) = Cx_Data.Value
Cells(linha, 9) = Cx_Nome.Value
Cells(linha, 10) = Cx_Especie.Value
Cells(linha, 12) = Cx_Raca.Value
If Op_Macho.Value = True Then
Cells(linha, 13) = "Macho"
Else
Cells(linha, 13) = "Fêmea"
End If

'COMANDO PARA ANOS, MESES E DIAS
'Se as tres caixas estiverem preenchidas
If Cx_Anos.Value <> "" And Cx_Meses.Value <> "" And Cx_Dias.Value <> "" Then
Cells(linha, 15) = Cx_Anos.Value & " Anos " & Cx_Meses.Value & " Meses " & Cx_Dias & " Dias"
'Se apeas a caixa anos e meses estiver preenchida
ElseIf Cx_Anos.Value <> "" And Cx_Meses.Value <> "" And Cx_Dias.Value = "" Then
Cells(linha, 15) = Cx_Anos.Value & " Anos " & Cx_Meses.Value & " Meses"
'Se apeas a caixa anos e dias estiver preenchida
ElseIf Cx_Anos.Value <> "" And Cx_Meses.Value = "" And Cx_Dias.Value <> "" Then
Cells(linha, 15) = Cx_Anos.Value & " Anos " & Cx_Dias & " Dias"
'Se apeas a caixa meses e dias estiver preenchida
ElseIf Cx_Anos.Value = "" And Cx_Meses.Value <> "" And Cx_Dias.Value <> "" Then
Cells(linha, 15) = Cx_Meses.Value & " Meses " & Cx_Dias & " Dias"
'Se Apenas a caixa anos estiver preenchida
ElseIf Cx_Anos.Value <> "" And Cx_Meses.Value = "" And Cx_Dias.Value = "" Then
Cells(linha, 15) = Cx_Anos.Value & " Anos"
'Se Apenas a caixa meses estiver preenchida
ElseIf Cx_Anos.Value = "" And Cx_Meses.Value <> "" And Cx_Dias.Value = "" Then
Cells(linha, 15) = Cx_Meses.Value & " Meses"
'Se Apenas a caixa dias estiver preenchida
ElseIf Cx_Anos.Value = "" And Cx_Meses.Value = "" And Cx_Dias.Value <> "" Then
Cells(linha, 15) = Cx_Dias & " Dias"
'Se nenhuma das 3 estiver preenchida estiver preenchida
Else
Cells(linha, 15) = "Desc."
End If

Cells(linha, 16) = CX_Prop.Value
Cells(linha, 17) = Cx_Vet.Value
Cells(linha, 22) = CX_Valor.Value
If Op_Sim.Value = True Then
Cells(linha, 23) = "Sim"
Else
Cells(linha, 23) = "Não"
End If
Fixo_Cidade = Cells(linha, 24)
Fixo_Laudo = Cells(linha, 2)

MsgBox ("Exame cadastrado com sucesso")

End Sub

Private Sub UserForm_Initialize()

ult_linhaA = Sheets("DadosVBA").Range("A2").End(xlDown).Row

Cx_Tipo.RowSource = "DadosVBA!A2:A" & ult_linhaA

ult_linhaB = Sheets("DadosVBA").Range("B2").End(xlDown).Row

Cx_Local.RowSource = "DadosVBA!B2:B" & ult_linhaB

ult_linhaC = Sheets("DadosVBA").Range("C2").End(xlDown).Row

Cx_Especie.RowSource = "DadosVBA!C2:C" & ult_linhaC

ult_linhaD = Sheets("DadosVBA").Range("D2").End(xlDown).Row

Cx_Raca.RowSource = "DadosVBA!D2:D" & ult_linhaD

ult_linhaE = Sheets("DadosVBA").Range("E2").End(xlDown).Row

Cx_Vet.RowSource = "DadosVBA!E2:E" & ult_linhaE

ult_linhaF = Sheets("DadosVBA").Range("F2").End(xlDown).Row

Cx_Clinica.RowSource = "DadosVBA!F2:F" & ult_linhaF

End Sub

Private Sub Botao_Cancelar_Click()

Unload Cadastro_exame

End Sub

 


Editado pela Moderação. Motivo: Procure utilizar o botão Código (< >) para inserir código VBA ou Fórmulas.

 
Postado : 02/08/2020 11:47 am
JSCOPA10
(@jscopa10)
Posts: 344
Reputable Member
 

buscheric, você conhece o recurso do Word chamado Mala Direta? ... Pelo que li e entendi, já existe o que você quer no Word!! ... Hoje não mais, mas no trabalho já confeccionei muuuuiiiiiitos ofícios (no seu caso laudos) com base em dados de uma planilha!!

.

É só ir lançando os dados nas linhas do Excel e depois mesclar (um a um, ou todos de uma vez) no Word!!

.

Veja ... https://www.youtube.com/watch?v=OdFNyL45wrA

 
Postado : 02/08/2020 12:43 pm
(@buscheric)
Posts: 13
Eminent Member
Topic starter
 

@jscopa10

Obrigado por me responder.

O recurso Mala direta não funciona legal para isso não... Como a tabela no Excel vai sendo alimentada constantemente, para a Mala direta funcionar, eu preciso toda hora ficar atualizando a base de dados da Mala Direta.

Além disso, a Mala Direta iria todas as vezes acabar gerando 300, 500, 1000 relatórios diferentes e eu só iria precisar de um (o último gerado)...

Acredito ainda que o ideal seria a programação em VBA mesmo....

 

Mas obrigado assim mesmo 😉 

 
Postado : 09/08/2020 8:32 pm
JSCOPA10
(@jscopa10)
Posts: 344
Reputable Member
 

buscheric, considerando o que você disse no início, e disse agora, vou insistir, MD resolve seu problema!! ...

.

"eu só iria precisar de um (o último gerado)..." .... então, como eu disse acima, você pode gerar só um laudo, o último, ou todos, você escolhe!!

.

MD é composta por 3 documentos (a planilha, o Word formatado - este é o modelo, e o Word mesclado - este último é o que vc gerou e salvou) ... ou seja, para gerar só a última linha é só ela colocar o cursor na última linha, abrir o modelo e clicar em visualizar - agora é só ela imprimir ou salvar!!!

 

 
Postado : 09/08/2020 9:10 pm
(@buscheric)
Posts: 13
Eminent Member
Topic starter
 

@jscopa10

Obrigado pela ajuda...

Consegui entender o seu raciocínio... 

A MD ainda me limita com algumas coisas que estou querendo aqui, pois a explicação que coloquei acima é apenas uma parte de todo meu processo de construção desse laudo, mas já vai ajudar bastante, por enquanto....

Quero fazer algumas formatações condicionais e inserção de alguns padrões conforme cada tipo de situação. Por isso que pensei no VBA... Justamente para que esse laudo saia "praticamente pronto"....

 

Mas  como disse, já vai ajudar bastante aqui...

Obrigadão...

 

PS: Se alguém ainda puder/ conseguir se arriscar a programar isso no VBA, agradeço

 
Postado : 09/08/2020 9:49 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

@buscheric, se possível anexe o modelo de laudo do Word que vc usará para gerar o documento.

Nesse documento, o ideal seria usar ou Indicadores (bookmarks) ou Campos de Formulário legados (FormFields) ou Controles de Conteúdo (Content Controls) nos locais onde vc vai inserir os valores. Fica mais estruturado do que usar captchas como #nomepaciente, por exemplo e tem a vantagem do VBA oferecer funcionalidades especiais para acessar e modificar esses campos.

 
Postado : 10/08/2020 2:02 am
(@buscheric)
Posts: 13
Eminent Member
Topic starter
 

@edsonbr

na verdade o #nomepaciente foi só uma alternativa... Mas o que acharem que fica melhor para trabalhar, nesta situação, estou topando.... kkkk

Não consigo anexar arquivo do Word aqui... Tentei várias vezes, mas não vai...

Estou mandando em imagem, pelo menos para ver como é o esquema...

O cabeçalho é bem simples... O difícil está sendo gerar automaticamente tudo o que quero...

 

 

 
Postado : 11/08/2020 10:26 am
(@buscheric)
Posts: 13
Eminent Member
Topic starter
 

Talvez fique mais fácil para visualizar agora, o que estou querendo fazer....

Acho que esse arquivo anexo vai elucidar bem...

 

Basicamente:

Planilha joga automaticamente informações para Word

Gera um novo arquivo Word

Renomeia para "Cód clínica - Nome paciente"

 
Postado : 11/08/2020 10:37 am
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Bom dia, @buscheric

  • Coloque o modelo do Word na pasta de modelos ou numa pasta fixa qualquer de seu PC;
  • No Módulo1, atualize o caminho + nome do arquivo do modelo (constante modeloUS);
  • Crie a pasta que vai receber os laudos e então atualize também a constante pastaLaudos (não esqueça a barra no final);
  • Selecione qualquer célula que está na linha do pet que vc deseja emitir o laudo e clique no botão.

Obs.:

  • no modelo do Word usei Indicadores (bookmarks) que são substituídos pela informação vinda do Excel. Se quiser visualizar onde estão, vá em Arquivo > Opções > Avançado > seção "Mostrar o conteúdo do documento" > Mostrar indicadores. Para inserir novos ou excluir os existentes, na guia Inserir > grupo Links > Indicadores.
  • Note que o modelo permanecerá intacto a cada novo laudo gerado. Serão criados documentos baseados nesse modelo. Portanto, elabore um bom layout para o modelo e use-o quando estiver na melhor e definitiva versão.

 
Postado : 13/08/2020 10:31 am
(@buscheric)
Posts: 13
Eminent Member
Topic starter
 

@edsonbr, muito obrigado!!!!

Ficou excelente!!!!

Agora que você me ajudou com a parte mais difícil, consigo dar aquela 'refinada' para o modelo aqui...

 

Muito obrigado mesmo 😉 🤩 

 
Postado : 15/08/2020 4:13 pm
EdsonBR reacted