VBA - AJUSTAR PLANILHA

F4B1NH0 08/06/2015 13:07:06
#447510
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.
ASHKATCHUP 09/06/2015 11:33:34
#447544
A ideia é bem simples. Posta uma planilha de exemplo que eu te ajudo na macro.
MITSUEDA 09/06/2015 13:03:02
#447547
Boa tarde,

Uma tabela dinâmica resolve seu problema se a necessidade de macro.

F4B1NH0 12/06/2015 18:22:16
#447674
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?
ASHKATCHUP 14/06/2015 16:45:37
#447685
Resposta escolhida

Buenas.

  • Habilite a guia
  • [Ô]Desenvolvedor[Ô]
  • Nesta guia, vá em
  • [Ô]Inserir[Ô] e coloque um BOTÃO na planilha
  • No campo
  • [Ô]Nome da Macro[Ô], escreva [Ô]GerarRelatorio[Ô] e clique em [Ô]NOVO[Ô]
  • Cole o código abaixo (todo ele)
  • Planilha de exemplo anexa

      
  • [ô]
    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
    F4B1NH0 15/06/2015 13:06:32
    #447728
    eita..é muito maior do que eu pensava...

    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
    ASHKATCHUP 15/06/2015 13:55:23
    #447733
    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[Ô]?

      Public Type DadosRelatorio
    Loja As String
    Produto As Integer
    Quantidade As Integer
    End Type
    F4B1NH0 15/06/2015 15:01:45
    #447736
    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
    ASHKATCHUP 15/06/2015 15:28:46
    #447737
    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

    ASHKATCHUP 15/06/2015 15:33:08
    #447738
    O código acima (simplificado) basicamente contém as seguintes lógicas de programação:

  • Lendo, escrevendo e apagando planilhas
    Plan3.Cells.ClearContents
    Plan3.Cells(Linha,Coluna) = 1
    x = Plan3.Cells(Linha,Coluna)


  • Funções para converter dados em números
    Val(Plan1.Cells(lLinha, lColuna))


  • Laços de repetição

    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
  • F4B1NH0 15/06/2015 17:10:41
    #447741
    opa.. Muito obrigado!!!!!!!!!!

    Ajudou bastante!!!!!!!!!!
    Tópico encerrado , respostas não são mais permitidas