Ir ao conteúdo

Posts recomendados

Postado

Cara, eu testei aqui e funcionou... Eu só retirei uma linha do código:

 

Sub Botão1_Clique()

'Abrir documento do word pronto
Dim wdApp As Word.Application, wdDoc As Word.Document

On Error Resume Next
Set wdApp = GetObject(, "Word.Application")
If Err.Number <> 0 Then 'Word isn't already running
    Set wdApp = CreateObject("Word.Application")
End If
On Error GoTo 0

Set wdDoc = wdApp.Documents.Open("D:\Users\charley_r\Downloads\TESTE_Liberação_word.docm")

wdApp.Visible = True

E é claro que eu alterei o endereço da planilha também...

Estou anexando o arquivo do Word preenchido pela sua macro.

TESTE_Liberação_word.rar

Postado

Boa Tarde Charley,

 

Sim, ta funcionando, mas não ta inserindo os dados de Paulo na tabela do word, apenas de maria. E o que eu quero é que conforme eu cadastre os funcionários no excel, apareçam todos no Word

adicionado 3 minutos depois

Se possível, manda o documento normal pf, aqui não abre RAR

adicionado 4 minutos depois

Preciso acertar isso com urgência amigos,

 

 

Alguém sabe o que posso fazer para que insira todas as pessoas que eu colocar no excel para a tabela do word?

Postado

Bom dia Rafael. Consegui resolver seu problema (pelo menos eu acho).

 

Basicamente, você tinha colocado sua iteração do tipo For no lugar errado. Na verdade, quando eu peguei seu código pra olhar eu achei que aquilo era resquício de algum código que você tinha apagado. Dá uma olhada como ficou agora e veja a maneira correta de se usar o For.

 

Mas mesmo que estivesse no lugar certo, não iria funcionar porque você não estava usando o "i" da iteração em lugar nenhum. Para que o For funcione, você precisa colocar parâmetros em função de "i", como você verá no código.

 

Finalmente, eu coloquei um código para adicionar linhas à sua tabela à medida que ele for preenchendo. Para tanto, eu editei o arquivo do Word para que as tabelas inicialmente contenham apenas o cabeçalho, e as linhas vão sendo inseridas à medida que ele vai escrevendo.

 

Sub Botão1_Clique()

'Abrir documento do word pronto
Dim wdApp As Word.Application, wdDoc As Word.Document

On Error Resume Next
Set wdApp = GetObject(, "Word.Application")
If Err.Number <> 0 Then 'Word isn't already running
    Set wdApp = CreateObject("Word.Application")
End If
On Error GoTo 0

Set wdDoc = wdApp.Documents.Open("D:\Users\charley_r\Downloads\TESTE_Liberação_word.docm")

wdApp.Visible = True


For i = 2 To 3

'Passando para a primeira tabela do Word
wdDoc.Tables(1).Rows.Add 'Adicionando 1 linha à tabela

ThisWorkbook.Sheets("Plan1").Range("A" & i & ": D" & i).Copy
  
  wdDoc.Range(wdDoc.Tables(1).Cell(i, 1).Range.Start, wdDoc.Tables(1).Cell(i, 4).Range.End).PasteAndFormat (22)
  
'Passando para a segunda tabela do Word
    wdDoc.Tables(2).Rows.Add 'Adicionando 1 linha à tabela
 
ThisWorkbook.Sheets("Plan1").Range("A" & i).Copy

  wdDoc.Range(wdDoc.Tables(2).Cell(i, 1).Range.Start, wdDoc.Tables(2).Cell(i, 1).Range.End).PasteAndFormat (22)

  'Passando para a segunda tabela do Word
  
ThisWorkbook.Sheets("Plan1").Range("E" & i & ":H" & i).Copy
  wdDoc.Range(wdDoc.Tables(2).Cell(i, 2).Range.Start, wdDoc.Tables(2).Cell(i, 5).Range.End).PasteAndFormat (22)
  
 'Passando para a terceira tabela do Word
 wdDoc.Tables(3).Rows.Add 'Adicionando 1 linha à tabela
 
ThisWorkbook.Sheets("Plan1").Range("I" & i).Copy
  wdDoc.Range(wdDoc.Tables(3).Cell(i, 1).Range.Start, wdDoc.Tables(3).Cell(i, 1).Range.End).PasteAndFormat (22)
  
 'Passando para a quarta tabela do Word
 wdDoc.Tables(4).Rows.Add 'Adicionando 1 linha à tabela
  
ThisWorkbook.Sheets("Plan1").Range("J" & i & ":L" & i).Copy
  wdDoc.Range(wdDoc.Tables(4).Cell(i, 1).Range.Start, wdDoc.Tables(4).Cell(i, 3).Range.End).PasteAndFormat (22)
  
  'Passando para a quinta tabela do Word
  wdDoc.Tables(5).Rows.Add 'Adicionando 1 linha à tabela
    
ThisWorkbook.Sheets("Plan1").Range("M" & i & ":O" & i).Copy
  wdDoc.Range(wdDoc.Tables(5).Cell(i, 1).Range.Start, wdDoc.Tables(5).Cell(i, 3).Range.End).PasteAndFormat (22)
  
Next
  
  
  
  Set wordapp = Nothing
  Set wdDoc = Nothing

Repare que o For está configurado para apenas 2 linhas, que são as que estão preenchidas. É só configurar o For para a quantidade de linhas que você quiser de acordo com sua necessidade.

 

Lembre-se de alterar novamente o endereço do seu arquivo Word.

 

Veja se é isso mesmo que você queria.

 

 

Há Braços.

TESTE_Liberação.zip

TESTE_Liberação_word.zip

Postado

Bom dia Charley,

 

Estamos quase lá... Mas eu preciso que não se repita : Solicitação/ Gerente? ID/ Ramal/ Supervisor/ ID/ Ramal ( porque sempre serão os mesmos...

 

Exemplificando:  vou adicionar o funcionário : João carlos, vou colocar os dados dele lá no excel, ai vou colocar a solicitação, o gerente e o supervisor.

Quando eu for adicionar o segundo, Maria dos Santos, já não preciso que a solicitação, o gerente e o supervisor vão para o word, porque é os mesmos dados do primeiro ( João Carlos).

 

Deu para entender?

 

adicionado 12 minutos depois

E outra dúvida Charley, não sei se você irá conseguir me ajudar.

Você colocou para dois, pois na tabela o qual te passei tinham dois, mas na vdd eu não vou conseguir ficar ajustando porque nem sempre eu que irei fazer, você sabe se tem algum código que vê quantas linhas foram criadas no excel e adiciona lá no word?

Postado

Então, agora só falta fazer os ajustes finos...

 

Citação
50 minutos atrás, Rafael Borges P. disse:

Exemplificando:  vou adicionar o funcionário : João carlos, vou colocar os dados dele lá no excel, ai vou colocar a solicitação, o gerente e o supervisor.

Quando eu for adicionar o segundo, Maria dos Santos, já não preciso que a solicitação, o gerente e o supervisor vão para o word, porque é os mesmos dados do primeiro ( João Carlos).

 

 

É só retirar a parte do código que adiciona esses dados de dentro da iteração For. Assim, ele vai preencher primeiro a tabela 1 com todos os nomes, e quando terminar ele preenche as demais tabelas.

 

51 minutos atrás, Rafael Borges P. disse:

E outra dúvida Charley, não sei se você irá conseguir me ajudar.

Você colocou para dois, pois na tabela o qual te passei tinham dois, mas na vdd eu não vou conseguir ficar ajustando porque nem sempre eu que irei fazer, você sabe se tem algum código que vê quantas linhas foram criadas no excel e adiciona lá no word?

 

Essa parte eu imaginei que você ia precisar. Até pensei em já mandar com isso feito, mas talvez seja bom pro seu aprendizado você quebrar a cabeça um pouquinho com isso. Mas aqui vão algumas sugestões:

 

1. Tente usar uma fórmula do próprio Excel para contar quantas linhas estão preenchidas e armazenar em uma célula. Daí você coloca a iteração do FOR de 2 até o valor que estiver contido lá;

 

2. No próprio código do VBA você pode colocá-lo para contar as células preenchidas. Você pode usar uma iteração DO WHILE, por exemplo. Tipo:

Do While Cell(i , 2).text <> ""    'o loop vai ser executado até encontrar uma célula vazia

	celulasocupadas = celulasocupadas + 1 'Conta quantas células estão preenchidas
	i = i + 1

Loop

Enfim... existem muitas maneiras de fazer o que você quer, mas a parte mais difícil do código já está pronta.

 

 

Há Braços

Postado

Ok, muito obrigado!

Me ajudou bastante.

 

Abraços.

adicionado 18 minutos depois

Charley,

só não faço ideia de como aplicar esse código na macro, sou novato em macro, pretendo correr para um curso presencial de VBA.

Postado

Dim total As Variant

Range("A1").Select
total = (Cells(Rows.Count, 1).End(xlUp).Row) - 1

 

Usei esse código, ai ele faz a contagem, até ai beleza, mas como eu faço para colocar isso no " For i = 2 To 4"

 

algo do tipo For i = 2 To (total = (Cells(Rows.Count, 1).End(xlUp).Row) - 1)?????

 

Postado

Não mano... é mais simples do que você pensa:

 

1. Evite usar variável do tipo "variant". Isso pode acarretar um erro de cálculo no seu código que vai ser bem difícil de rastrear. Nesse caso, como o número de linhas ocupadas vai ser sempre inteiro, use uma variável do tipo "Integer";

 

2. Já que você atribuiu o número de linhas ocupadas à variável "total", basta fazer For i = 2 to total. Simples assim.

Postado

Bom dia Charley,

 

Muito obrigado, resolvido...

 

Sucesso para nós, até uma próxima!!

 

Abraços.

adicionado 11 minutos depois

Charley,

 

Perdão, só mais uma dúvida,

e como eu faço para que na parte da Solicitação/ Gerente/ ID/ Ramal/ Supervisor/ ID/ Ramal eu só escreva na primeira linha e o botão mesmo copie os dados da primeira linha e preencha para as linhas que forem sendo feitas (isso para ficar bonitinho no excel) por que como você já me ensinou, pro word só será passado a primeira linha, pois Solicitação/ Gerente/ ID/ Ramal/ Supervisor/ ID/ Ramal será sempre os mesmos dados para todos os funcionários cadastrados.

 

 

Lembrando que eu não sei quantos linhas serão feitas, então preciso de um código que selecione as colunas I2:O2 copie elas e cole em (X) linhas

Postado

Eu não sei se entendi muito bem o que você quer não, mas se for o que eu entendi é só colocar dentro do For uma instrução para copiar o conteúdo dessas células da primeira linha para as mesmas células de índice "i" logo abaixo. Ficaria algo do tipo:

 

ThisWorkbook.Sheets("Plan1").Range("I" & i) = ThisWorkbook.Sheets("Plan1").Range("I2").Text

Aí você coloca uma linha similar dessa pra cada célula.

Postado

Charley,

 

Não é isso...

 

 

 

adicionado 6 minutos depois

Exemplo:

 

 

João dos Santos      7842100   JKW7  RH    Técnicas de recrutamento  20/09/18 - 20/09/18  4H  Senac- Irajá   (Solicitação) ...

Maria     8794211  MDC4   RH    Técnicas de recrutamento  20/09/18 - 20/09/18  4H  Senac  ( a mesma solicitação do João) ....

 

Vê se conseguiu entender melhor. A ideia é eu não escrever novamente os dados (Solicitação/ Gerente/ ID/ Ramal/ Supervisor/ ID/ Ramal) pois já escrevi nas colunas I2:O2 ( do João), queria que a macro copiasse as colunas I2:O2 e cole nas linhas que foram preenchidas (lembrando que não sei quantas linhas serão feitas)

adicionado 35 minutos depois

image.thumb.png.5acb5a8384aa14581b3d77ee5290a59d.pngTipo essa ia

Postado

Pois é cara... o código que eu te passei faz exatamente isso. Talvez você esteja sentindo falta de um "copiar e colar" no código, mas lê o texto da célula "I2" como exemplo e cola na "I" com índice "i", ou seja, "I3", "I4" etc...

Postado

image.thumb.png.130ed4c5b83a77035e8fb01a8e709478.pngimage.thumb.png.cf6564f09088588fdf39af46b6a82573.png

adicionado 2 minutos depois

mas ai eu coloco o código em qual posição?

adicionado 6 minutos depois

Ao invés de copiar e colar em outros lugares, ta excluindo.

adicionado 18 minutos depois

Sheets("CADASTRO").Select
    Range("I2").Select
    Selection.Copy
    Range("I3:I6").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False

 

 

 

Charley, to usando assim, mais não adianta muito, porque o que eu quero não é bem isso. Eu não sei quantas linhas eu terei, lembra? então preciso que ele calcule e cole. no lugar de "I3:I6" eu posso colocar to = total?

Postado

Bom, eu devia ter postado o código pra você ontem, mas eu estava meio sem tempo. Agora que você já trabalhou no seu próprio código, o que é louvável, novamente falta só um retoque:

 

Sheets("CADASTRO").Select
    Range("I2").Select
    Selection.Copy
    Range("I3:I" & total).Select
    ActiveSheet.Paste
    Application.CutCopyMode = False

Dessa forma deve funcionar.

Postado

Bom dia Charley,

 

Não funcionou.

 

Sheets("CADASTRO").Select
    Range("I2").Select
    Selection.Copy
    Range("I3:I" & total).Select
    ActiveSheet.Paste
    Application.CutCopyMode = False

Dim total As Integer

Range("A1").Select
total = (Cells(Rows.Count, 1).End(xlUp).Row)


'Abrir documento do word pronto
Dim wdApp As Word.Application, wdDoc As Word.Document

On Error Resume Next
Set wdApp = GetObject(, "Word.Application")
If Err.Number <> 0 Then 'Word isn't already running
    Set wdApp = CreateObject("Word.Application")
End If
On Error GoTo 0

Set wdDoc = wdApp.Documents.Open("documento")

wdApp.Visible = True

For i = 2 To total


'Passando para a primeira tabela do Word
wdDoc.Tables(1).Rows.Add 'Adicionando 1 linha à tabela

ThisWorkbook.Sheets("CADASTRO").Range("A" & i & ": D" & i).Copy
  wdDoc.Range(wdDoc.Tables(1).Cell(i, 1).Range.Start, wdDoc.Tables(1).Cell(i, 4).Range.End).PasteAndFormat (22)

 

 

 

Ta assim o código, quando aperto o botão aparece a mensagem: Declaração Duplicata no Escopo Atual, e marca o DIM TOTAL AS INTEGER

Postado

Rafael, você está com dificuldade de entender alguns conceitos de programação, que valem para qualquer linguagem, inclusive VBA.

 

1. A declaração de variável deve vir antes de você usar a variável. Exemplo:

 

Dim minha_variavel as Integer

minha_variavel = 2

2. Só se declara uma variável uma única vez. Se você tentar declará-la de novo em alguma parte do código vai dar esse erro que você colocou.

 

3. Preste atenção nos valores que suas variáveis vão recebendo. No código que você postou aí você está usando a variável "total" antes de dizer para o VBA o valor que essa variável deve adquirir. O correto é primeiro você atribui o valor a ela e então você usa a variável no seu código.

 

4. Resumo:

 

Dim minha_variavel as Integer 'Declarei a variável. Por enquanto ela não tem valor nenhum!

minha_variavel = 2 'Agora o VBA sabe que a variável vale 2

MsgBox minha_variavel 'Só então posso executar algum código com essa variável

 

Siga esses passos no seu código e daqui pra frente e vai te poupar bastante tempo e dor de cabeça.

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...