VBA - AJUSTAR PLANILHA
Pessoal boa tarde!
Recebo aqui no trabalho uma planilha e preciso mudar ela para um formato que o SAP aceite mas não sei consigo pensar na lógica
para criar essa macro.
A coluna A2 contém o código do aparelho, a primeira linha contém os códigos das lojas e em baixo de cada coluna da loja tem a quantidade de cada aparelho que a loja precisa.
Preciso que seja [Ô]consolidado[Ô] o que cada loja precisa e colocasse tudo junto na coluna A, na coluna B preciso do código do aparelho e na coluna C preciso da quantidade que a loja informou.
Segue em anexo um print de como recebo a planilha e como preciso que ela fique
Para facilitar o entendimento.
Recebo aqui no trabalho uma planilha e preciso mudar ela para um formato que o SAP aceite mas não sei consigo pensar na lógica
para criar essa macro.
A coluna A2 contém o código do aparelho, a primeira linha contém os códigos das lojas e em baixo de cada coluna da loja tem a quantidade de cada aparelho que a loja precisa.
Preciso que seja [Ô]consolidado[Ô] o que cada loja precisa e colocasse tudo junto na coluna A, na coluna B preciso do código do aparelho e na coluna C preciso da quantidade que a loja informou.
Segue em anexo um print de como recebo a planilha e como preciso que ela fique
Para facilitar o entendimento.
A ideia é bem simples. Posta uma planilha de exemplo que eu te ajudo na macro.
Boa tarde,
Uma tabela dinâmica resolve seu problema se a necessidade de macro.
Uma tabela dinâmica resolve seu problema se a necessidade de macro.
Boa noite pessoal!!
MITSUEDA,
eu tentei por tabela dinâmica, mas não deu certo..não consegui deixar nesse mesmo [Ô]layout[Ô]
ASHKATCHUP,
Segue uma planilha de exemplo
lembrando que não preciso do campo descrição...ok?
MITSUEDA,
eu tentei por tabela dinâmica, mas não deu certo..não consegui deixar nesse mesmo [Ô]layout[Ô]
ASHKATCHUP,
Segue uma planilha de exemplo
lembrando que não preciso do campo descrição...ok?
Buenas.
Public Const Coluna_Lojas As Integer = 3 [ô]Coluna da primeira loja. A = 1
Public Const Coluna_Produtos As Integer = 2 [ô]Coluna que guarda o código dos produtos
Public Const Linha_Lojas As Integer = 1 [ô]Linha do codigo das lojas. Excel começa linhas em 1
[ô]
Public Type DadosRelatorio
Loja As String
Produto As Integer
Quantidade As Integer
End Type
Public Function GerarRelatorio()
Dim lLinha As Long
Dim lColuna As Long
[ô]
Dim vResultados() As DadosRelatorio
Dim lIndice As Long
[ô]
Dim lTemp As Long
[ô]
[ô]Começa na primeira linha de produtos
lLinha = Linha_Lojas + 1
[ô]Começa na primeira loja
lColuna = Coluna_Lojas
[ô]
[ô]Indice do Vetor
lIndice = 0
[ô]
Do While True [ô]Colunas
[ô]
Do While True [ô]Linhas
[ô]
[ô]Le a quantidade
lTemp = Val(Plan1.Cells(lLinha, lColuna))
[ô]
[ô]Se há algum produtop para esta loja, adiciona
If lTemp > 0 Then
[ô]
[ô]Aumenta o vetor preservado os dados que já existe
ReDim Preserve vResultados(Tamanho(vResultados()) + 1)
lIndice = Tamanho(vResultados)
[ô]
[ô]Guarda os valores
vResultados(lIndice).Loja = Plan1.Cells(Linha_Lojas, lColuna)
vResultados(lIndice).Produto = Plan1.Cells(lLinha, Coluna_Produtos)
vResultados(lIndice).Quantidade = lTemp
[ô]
End If
[ô]
[ô]Pula para a próxima linha
lLinha = lLinha + 1
[ô]
[ô]Se não tiver nada escrito, chegamos na última linha desta loja
If Plan1.Cells(lLinha, Coluna_Produtos) = [Ô][Ô] Then
Exit Do
End If
[ô]
Loop
[ô]
[ô]Entao, deveremos ir para a próxima coluna
lColuna = lColuna + 1
[ô]
[ô]Se foi para a próxima coluna, tem que voltar para a primeira linha
lLinha = Linha_Lojas + 1
[ô]
[ô]Se não há nada escrito, não há mais lojas
If Plan1.Cells(lLinha, lColuna) = [Ô][Ô] Then
Exit Do
End If
[ô]
Loop
[ô]
[ô]Limpa a Planilha 2
Plan2.Cells.ClearContents
[ô]Adiciona o cabeçalho
Plan2.Cells(1, 1) = [Ô]Cliente[Ô]
Plan2.Cells(1, 2) = [Ô]Material[Ô]
Plan2.Cells(1, 3) = [Ô]Quantidade[Ô]
[ô]
For lIndice = 0 To Tamanho(vResultados())
[ô]Essa gambiarrado +2 é assim pq o vetor começa na posição 0 (zero)
[ô]mas a planilha deve ser escrita da linha 2 em diante
Plan2.Cells(lIndice + 2, 1) = vResultados(lIndice).Loja
Plan2.Cells(lIndice + 2, 2) = vResultados(lIndice).Produto
Plan2.Cells(lIndice + 2, 3) = vResultados(lIndice).Quantidade
Next
[ô]
End Function
[ô]Função para calcular o tamanho de um vetor, mesmo que vazio
Public Function Tamanho(vArray() As DadosRelatorio) As Long
On Error GoTo FIm:
[ô]
Tamanho = UBound(vArray())
Exit Function
[ô]
FIm:
Tamanho = -1
[ô]
End Function
eita..é muito maior do que eu pensava...
apresentou o seguinte erro:
O tipo definido pelo usuário não foi definido.
Na linha:
apresentou o seguinte erro:
O tipo definido pelo usuário não foi definido.
Na linha:
[ô]Função para calcular o tamanho de um vetor, mesmo que vazio
Public Function Tamanho(vArray() As DadosRelatorio) As Long
Até daria para criar funções recursivas para ser feito em menos linhas de código, mas não tem sentido.
A tua planilha tem a declaração do tipo [Ô]DADOS RELATORIO[Ô]?
A tua planilha tem a declaração do tipo [Ô]DADOS RELATORIO[Ô]?
Public Type DadosRelatorio
Loja As String
Produto As Integer
Quantidade As Integer
End Type
Funcionou!!!
Obrigado!!!
cara..como sou novo em VBA, tem algo que eu possa estudar pra entender melhor esse código?
pq sinceramente, achei que ia ser beeeeem menos linhas de código..kkk
Obrigado!!!
cara..como sou novo em VBA, tem algo que eu possa estudar pra entender melhor esse código?
pq sinceramente, achei que ia ser beeeeem menos linhas de código..kkk
O código faz abaixo a mesma coisa mas de uma maneira mais compacta (100 linhas no outro e 45 linhas neste)
Sub RelatorioExpresso()
[ô]
Dim lLinha As Integer
Dim lColuna As Integer
Dim lLinhaResultado As Integer
[ô]
lLinha = 2
lColuna = 3
lLinhaResultado = 1
[ô]
Plan3.Cells.ClearContents
[ô]
Do While True
[ô]
Do While True
[ô]
lTemp = Val(Plan1.Cells(lLinha, lColuna))
[ô]
If lTemp > 0 Then
[ô]
Plan3.Cells(lLinhaResultado, 1) = Plan1.Cells(1, lColuna)
Plan3.Cells(lLinhaResultado, 2) = Plan1.Cells(lLinha, 2)
Plan3.Cells(lLinhaResultado, 3) = Plan1.Cells(lLinha, lColuna)
[ô]
lLinhaResultado = lLinhaResultado + 1
End If
[ô]
lLinha = lLinha + 1
[ô]
If Plan1.Cells(lLinha, 2) = [Ô][Ô] Then
Exit Do
End If
[ô]
Loop
[ô]
lColuna = lColuna + 1
lLinha = 2
[ô]
If Plan1.Cells(1, lColuna) = [Ô][Ô] Then
Exit Do
End If
[ô]
Loop
[ô]
End Sub
O código acima (simplificado) basicamente contém as seguintes lógicas de programação:
Lendo, escrevendo e apagando planilhas
Funções para converter dados em números
Laços de repetição
Dá uma lida nesses três que tu vai ser capaz de entender
Plan3.Cells.ClearContents
Plan3.Cells(Linha,Coluna) = 1
x = Plan3.Cells(Linha,Coluna)
Val(Plan1.Cells(lLinha, lColuna))
Do While True
If 1 = 1 then
Exit Do
End If
Loop
Dá uma lida nesses três que tu vai ser capaz de entender
opa.. Muito obrigado!!!!!!!!!!
Ajudou bastante!!!!!!!!!!
Ajudou bastante!!!!!!!!!!
Tópico encerrado , respostas não são mais permitidas