EXPORTAR DADOS PARA OUTRA PASTA DE TRABALHO

PABLOMOREIRAGV 08/09/2016 15:50:24
#466633
Olá pessoal,

Preciso exportar dados para outro arquivos de nomes específicos alimentando campos também específicos utilizando um botão de comando VBA. Estou deixando em anexo arquivos modelo e um link de um vídeo onde mostro com mais detalhe o que não estou conseguindo fazer.
Desde já agradeço.

vídeo explicativo: https://drive.google.com/file/d/0BznW01GdKw27S29WbXd6eVZ4VG8/view?usp=sharing
KERPLUNK 08/09/2016 16:44:13
#466638
Ok, vi os modelos e seu vídeo, e minha pergunta é: O que você não está conseguindo fazer?
PABLOMOREIRAGV 08/09/2016 19:29:41
#466648
Transferir as informações da tabela dinâmica para os arquivos respectivos nos campos mostrados no vídeo, de forma que ao clicar no botão de comando do arquivo da tabela dinâmica, alimente as informações necessárias nos outros arquivos externos automaticamente sem a necessidade de abri-los.
KERPLUNK 09/09/2016 16:43:01
#466672
Citação:

:
Transferir as informações da tabela dinâmica para os arquivos respectivos nos campos mostrados no vídeo, de forma que ao clicar no botão de comando do arquivo da tabela dinâmica, alimente as informações necessárias nos outros arquivos externos automaticamente sem a necessidade de abri-los.


Basicamente o que você sabe é adicionar o botão então...
PABLOMOREIRAGV 09/09/2016 17:53:14
#466680
Fiz alguns testes aqui, mas sem sucesso, preferi não deixá-los no exemplo, pois acredito que não acrescentaria muito de tanto erro que dava. E cheguei a conclusão que sim, pra esse caso, infelizmente eu só sei adicionar o botão. é evidente que meu conhecimento em VBA não chega nem perto do que maioria aqui é capaz de fazer. Por isso pedi ajuda, na qual, é uma das finalidades do fórum, ou seja, ajudar, compartilhar arquivos e idéias, etc...
Em anexo, segue um dos exemplos que tentei. Ele faz mais ou menos o que eu queria, porém, ele transfere os dados para outra aba de mesma pasta de trabalho e não para outra pasta de trabalho externa.
No mais, quem puder realmente me ajudar, eu desde já agradeço.

Obrigado...
KERPLUNK 09/09/2016 18:37:08
#466684
Ok, o que você precisa é entender o conceito básico do excel: Cada arquivo(que é chamado de WorkBook), contém N planilhas(que são chamadas WorkSheet), então, tudo que você precisa fazer é abrir o WorkBook e passar os dados na WorkSheet desejada:

[ô][ô][ô][ô][ô]Definindo objetos
Dim Alvo As Workbook [ô]A planilha no qual os dados serão colocados
Dim Fonte As Workbook [ô]A planilha no qual os dados estão
Dim Alvo_Path As String

[ô][ô][ô][ô][ô]Passando o caminho completo do arquivo na variável [Ô]Alvo_Path[Ô]
Alvo_Path = [Ô]D:\Pasta\SubPasta\Arquivo.xlsx[Ô]
Set Alvo = Workbooks.Open(Target_Path)
Set Fonte = ThisWorkbook

[ô][ô][ô][ô][ô]Agora é possível ler e gravar qualquer coisa, tanto no alvo, quanto no fonte, inclusive passando dados de um para outro

dados = Fonte.Sheets(1).Cells(1, 1) [ô]Sheets(1) se refere à primeira planilha, pode-se usar o nome dela também, se preferir. [Ô]Cells(1, 1)[Ô], se refere a coluna 1, linha 1
Alvo.Sheets(1).Cells(1, 1) = dados [ô]o mesmo caso acima, mas ao invés de atribuir o valor à uma variável, estou atribuindo o valor à célula


[ô][ô][ô][ô][ô]Fechando e salvando as planilhas
Alvo.Save
Fonte.Save

Set Alvo = Nothing


Aqui, entra mais uma vez, o conceito de OOP. Cada arquivo do excel é um objeto, que contém uma List<T> onde T é um objeto Workbook. Cada Workbook por sua vez, contém uma List<T>, onde T é um objeto Worksheet. Cada objeto Worksheet, contém uma List<T>, onde T é uma célula, indicada por coordenadas bi-dimensionais(linha e coluna. Então uma célula é Workbook(arquivo).Worksheet(planilha).Cells(linha, coluna). Cada célula contém várias propriedades, como fonte, valor, fórmula, cor de fundo, cor da fonte, formato de dados e muitas outras. Todas essas propriedades podem ser acessadas pelo VBA e é o que está acontecendo acima.

Eu reforço todas as vezes para que sempre estudem OOP, que entendam como funciona. é a única maneira de entender TUDO. Porque tudo é sempre OOP. C#, VB.NET, ASP.NET, VBA(não diretamente, mas o que ele trabalha é OOP), então é essa a chave do conhecimento. Muitos e muitos são os casos de coisas que vejo no fórum, uma situação que nunca passei, mas simplesmente por entender como funciona OOP, tenho sempre o caminho das pedras de como fazer. Não é poque eu já passei por todas essas coisas, ao contrário, a maioria não, mas por saber OOP, nada é mistério. Então, mais uma vez, estude e entenda OOP, é a chave de saber fazer qualquer coisa, aprender qualquer coisa, e trabalhar com qualquer coisa.
PABLOMOREIRAGV 09/09/2016 22:44:26
#466697
Coloquei o código aqui, mas, quando fui compilar ele não reconheceu o caminho.

Tenho outras dúvidas:
- Tenho que mandar os dados célula por célula? Como faço para o código entender qual é a última linha e preencher a coluna onde tiver dados?
- Como faço para o código reconhecer quais dados são referente aquele arquivo (cidade) para que o mesmo só copie os relativos àquela cidade?
- E reconhecendo o arquivo da cidade, como faço para as informações na coluna da aba [Ô]Aba para K[Ô] identifique os centros de custos começados com [Ô]1[Ô] e aba [Ô]Aba para F[Ô] entrar as informações centros de custos começados com [Ô]7[Ô] para que assim leve somente os dados restritos por cidade de tipo de centro de custos conforme falando anteriormente?

Obrigado
KERPLUNK 09/09/2016 23:51:49
#466698
[Ô]Não reconheceu o caminho[Ô], isso significa que ou o caminho está errado ou o nome da planilha(Arquivo)
Tenho que mandar os dados célula por célula?
- Não, você pode fazer algum loop para percorrer toda uma planilha.

Como faço para o código entender qual é a última linha e preencher a coluna onde tiver dados?
- Use o [Ô]if[Ô], se tiver dados ou não

Como faço para o código reconhecer quais dados são referente aquele arquivo (cidade) para que o mesmo só copie os relativos àquela cidade?
- Novamente, use um if

E reconhecendo o arquivo da cidade, como faço para as informações na coluna da aba [Ô]Aba para K[Ô] identifique os centros de custos começados com [Ô]1[Ô] e aba [Ô]Aba para F[Ô] entrar as informações centros de custos começados com [Ô]7[Ô] para que assim leve somente os dados restritos por cidade de tipo de centro de custos conforme falando anteriormente?
- Novamente, use um if

Vi outros tópicos seus, são na maioria relacionados à VBA e vários deles usam If. Você sabe fazer um condicional [Ô]if[Ô]?
KERPLUNK 09/09/2016 23:53:38
#466699
E outra coisa, não faça simplesmente copiar e colar código, não é assim que deve ser. Código aqui, são só para dar uma luz, uma idéia de como fazer. Não espere código prontinho.
ASHKATCHUP 10/09/2016 00:50:39
#466700
Pablo, como o Kerplunk falou, o teu problema é basicamente de lógica de programação.

Antes de qualquer coisa, tu precisa dividir o teu problema em vários passos menores. Esse passo é fundamental para resolver qualquer tarefa que venham a te passar na programação.

Se tu souber utilizar C# ou VB.NET, as coisas ficarão mais fáceis, pois as técnicas de programação orientada a objetos estão ai para facilitar nossa vida. Sugiro os vídeos do Kerplunk.

Eu também não sei o [Ô]quanto dinâmica[Ô] a planilha [Ô]exportar dados[Ô] é. A disposição das colunas é sempre a mesma? Os dados sempre começam na linha #6?

O primeiro passo é ler [Ô]todo[Ô] (a parte que te interessa) o conteúdo da planilha de leitura e armazenar em uma variável. Isso fará com que todo o processo se torne mais rápido.

Há inúmeras maneiras de fazer isso. Tudo depende de qual linguagem de programação tu está usando e qual o teu conhecimento.

Se puder utilizar uma linguagem que permita programação orientada a objetos, como VB.NET ou C#, teu código ficará bem mais lógico e de fácil compreensão, o que facilita muito a manutenção no futuro.

Mas, supondo que tu esteja usando somente o VBA, e não faça nenhuma questão de utilizar alguma outra, acho que um vetor pode lhe servir (me desculpe Kerplunk).

Vale a pena registrar que seria ideal o uso de Classes e Colections, principalmente para fazer leitura dos dados na hora de inseri-los nas outras planilhas. Mas veja tua necessidade e decida.

O código abaixo, feito em VBA, faz a leitura da planilha exportar dados.xlsm e armazena os dados em um vetor.

Assim, o passo seguinte seria a escrita desses dados nas outras planilhas.

[ô]Enumeracao que guarda os valores das colunas
Private Enum eColunas
Cidade = 1
Item = 2
NumeroServico = 3
Descricao = 4
CentroCusto = 5
SomaTotal = 6
End Enum

[ô]Type para lidar melhor com o vetor
Private Type tDados
Cidade As String
Item As String
NumeroServico As String
Descricao As String
CentroCusto As String
SomaTotal As String
End Type

[ô]Constante que indica a primeira linha que contem os dados que iremos iniciar
Private Const inicioDados = 6


Private Sub CommandButton1_Click()
Dim objWorkBook As Workbook
Dim objWorkSheet As Worksheet
Dim objRange As Range
[ô]
Dim vDados() As tDados
Dim iIndice As Integer
[ô]
Dim iLinhas As Integer
[ô]
iIndice = 0
[ô]
[ô]Workbook = arquivo do excel aberto
Set objWorkBook = Application.ActiveWorkbook
[ô]Worksheet = planilha selecionada dentro deste arquivo aberto
Set objWorkSheet = Application.ActiveSheet
[ô]UsedRange = intervalo que foi utilizado com dados.
[ô]é uma boa usar essa propriedade nativa em vez de ficar varrendo a planilha inteira
Set objRange = objWorkSheet.UsedRange
[ô]
[ô]Loop para varrer todas as linhas preenchidas
[ô]Lembrando que começa na linha [Ô]inicioDados[Ô]
For iLinhas = inicioDados To objRange.Rows.Count
[ô]
[ô]Aumenta o tamanho do nosso vetor
ReDim Preserve vDados(iIndice + 1)
[ô]
[ô]Preenche o vetor com os valores da planilha
vDados(iIndice).Cidade = objRange(iLinhas, eColunas.Cidade).Value
vDados(iIndice).Item = objRange(iLinhas, eColunas.Item).Value
vDados(iIndice).NumeroServico = objRange(iLinhas, eColunas.NumeroServico).Value
vDados(iIndice).Descricao = objRange(iLinhas, eColunas.Descricao).Value
vDados(iIndice).CentroCusto = objRange(iLinhas, eColunas.CentroCusto).Value
vDados(iIndice).SomaTotal = objRange(iLinhas, eColunas.SomaTotal).Value
[ô]
iIndice = iIndice + 1
[ô]
Next
[ô]
[ô]Sempre lembrando de liberar os objetos
Set objWorkBook = Nothing
Set objWorkSheet = Nothing
Set objRange = Nothing
[ô]
End Sub

PABLOMOREIRAGV 10/09/2016 02:20:32
#466701
Como aplico esse código. Coloquei-o mas, não tá alimentando. Estou postando o arquivo para análise se possível.

Eu também não sei o [Ô]quanto dinâmica[Ô] a planilha [Ô]exportar dados[Ô] é. A disposição das colunas é sempre a mesma? Os dados sempre começam na linha #6?

Sim, ela ficará assim mesmo, não muda. O que pode acontecer é um eventual aumento de linhas. Vou tentar explicar melhor o processo:

No código você identificou todas as colunas, que foi ótimo para eu saber como funciona para aplicações futuras.

Mas, a ideia é que a Coluna B (exportar dados) alimente a coluna A (arquivo Governador_Valadares, guia Aba para K e Aba para F)
Coluna I (exportar dados) alimente a coluna F (arquivo Governador_Valadares, guia Aba para K e Aba para F))
Coluna E (exportar dados) alimente a coluna E (arquivo Governador_Valadares, guia Aba para K e Aba para F))

Coluna B (exportar dados) alimente a coluna B (arquivo Governador_Valadares, guia Aba Geral, mas, ignorando os valores de itens duplicados, ou seja, somente um item exclusivo, dos relacionados nas outras duas guias)

Isso o código entendendo e buscando somente os valores referente a Governador Valadares, e também alimente o arquivo de Aimorés com seus respectivos valores

OBS:
- No arquivo Governador_Valadares a guia Aba para F deve conter as informações onde na coluna E da dinâmica comece com [Ô]7[Ô]
- No arquivo Governador_Valadares a guia Aba para K deve conter as informações onde na coluna E da dinâmica comece com [Ô]1[Ô]

A mesma coisa vale para o arquivo de Aimorés. Mandei os dois arquivos dessas cidades só mesmo pra saber como faço para acrescentar mais arquivos de outras cidades posteriormente, pois ao rodar o código ele alimentaria todos os arquivos de uma vez.

A inserção desses valores devem alimentar os arquivos fechados. No caso o código abriria o arquivo transferiria os dados, salva e fecha automaticamente.


Obrigado...
Página 1 de 2 [17 registro(s)]
Tópico encerrado , respostas não são mais permitidas