Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
  • Avatar do usuário
  • Avatar do usuário
#7033
Bom dia!

Acabei de chegar ao fórum e podem ver a minha apresentação aqui -> http://gurudoexcel.com/forum/viewtopic. ... =580#p7027 podendo ficar a conhecer-me melhor desde já :)

Bem, preciso de ajuda! :oops:

No meu trabalho, tive a iniciativa de criar um ficheiro EXCEL para pudermos controlar "automaticamente" quais os produtos expostos, e diariamente cruzar listagem de chegada de stock novo e quais produtos faltam expor, sem necessidade de manualmente todos os dias andarmos com papel e caneta a conferir um a um o produto exposto para excluir duplicação de artigos expostos.

Vou tentar fazer um esquema para ser fácil e rápido entenderem o ficheiro, resumindo o ficheiro:
- Folha "1" (ou planilha como vocês chamam) ARTIGOS EXPOSTOS
--- Coluna A - SKU (número único de cada artigo)
--- Coluna B - Descrição
--- Coluna C - PVP
--- Coluna etc etc etc.
- Folha "2" FICHART - LISTAGEM DE INVENTÁRIO DIARIO
--- Coluna A - SKU
--- Coluna B - Descrição
--- Coluna C - PVP
--- Coluna etc etc etc.
- Folha "3" COMPARADOR
--- Coluna C - Destino do LOOP - Deve colar aqui cada SKU que não consta da Folha"1".Coluna A, mas consta da Folha"2".Coluna A
--- Coluna D - Descrição (Index-match pela coluna A, pegando na folha "2" o valor)
--- Coluna E - PVP (Index-match pela coluna A, pegando na folha "2" o valor)
--- Coluna etc etc etc. (Index-match pela coluna A, pegando na folha "2" o valor)

-> Primeira abordagem, coloquei os dados em Tabela, gravei uma Macro em que copia [TABELAFolha1.ColunaA] para Folha3.ColunaB e [TABELAFolha2.ColunaA] para colar a seguir à última célula preenchida na Folha3.ColunaB. Usando depois a ferramenta do Excel RemoverDuplicados, e copiando os valores únicos a Folha3.Coluna C.
No meu ver isto é meio antiquado, e os meus conhecimentos de Excel pedem algo mais evoluído, também para dar um ambiente mais profissional ao ficheiro.
Foi aí que a semana passada meti-me no Google a tentar aprender VBA desde o início, conheci os Loops e para puder criar um código por mim próprio, mas não tem sido tarefa fácil... ainda estou a olhar para o código VBA e às vezes não entendo bem o que está a correr mal.

Contudo, eis que o meu código actual está assim:
Código: Selecionar todos
Sub CódigoDoLee()

Application.ScreenUpdating = False
 
         ' Declaração das variáveis e Arrays
        Dim Expostos() As String 'Array de Skus Expostos
        Dim Fichart() As String 'Array de Skus do Fichart
        Dim Ce As Integer 'Variável Contagem dos Skus Expostos
        Dim Cf As Integer 'Variável Contagem dos Skus Fichart
        Dim Ct As Integer
        Dim E As Variant
        Dim F As Variant
        Dim match As Boolean
        Dim rngDst As Range
                     
        Set rngDst = Sheets("COMPARADOR").Range("TAB_POREXPOR[SKU]")
                                                        
        rngDst.Value = ""
           
          ' Contagem do nº de SKU's para parametrizar as Arrays e re-parametrização
        Ce = Application.WorksheetFunction.Count(Range("Sku_expostos"))
        Cf = Application.WorksheetFunction.Count(Range("Sku_fichart"))
        
        ReDim Expostos(1 To Ce)
        ReDim Fichart(1 To Cf)
 
 
        ' Leitura dos Skus Expostos e Fichart para as Arrays
        Dim Ne As Integer
        Dim Nf As Integer
        For Ne = 1 To Ce
            Expostos(Ne) = Sheets("Expostos").Range("B4").Offset(Ne)
        Next Ne
        
        For Nf = 1 To Cf
            Fichart(Nf) = Sheets("Fichart").Range("C2").Offset(Nf)
        Next Nf
 
 
        For Each F In Fichart
            match = False
                
            For Each E In Expostos
                If F = E Then match = True
            Next E
                
            If Not match Then
                F = Sheets("COMPARADOR").Range("C7:C250") ---------------------- PROBLEMA
            End If
            
        Next F
        
Application.ScreenUpdating = True
End Sub
Ou seja, o loop está a correr bem, porque quando meto DEBUG.PRINT para Immediate Window, a listagem aparece correcta, mas estou com dificuldade em meter o Loop a exportar os valores para o Range das células da Folha3.Coluna C.
A única coisa que consigo, é que ele meta o mesmo valor em todas as células e não um em cada célula, visto que são pelo menos 100 valores diferentes para exportar...

Desde já as minhas desculpas pela extensão do tópico ser demasiada :\
Obrigado!
Editado pela última vez por laennder em 28 Jan 2016 às 10:11, em um total de 1 vez. Razão: Remover a palavra ajuda do título.
#7034
Amigo sei que o senhor que criar isso através de um VB script, mais não seria o caso de colocar na folha (3) os códigos de SKU e fazer o cálculo?

ex:
FOLHA 1 TENHO
SKU N° 1421
FOLHA 2
EX SKU N° 14514 ( Precisa ser exposto)
Na folha 3
Colocar todos os códigos SKU que precise fazer a reposição
Uma coluna para quantidade e exposição outra coluna para quantidade estoque ? Sendo assim você tem resultado se a contagem estoque for >0 e se(é.não.disp(procv ......)

Caso queira fazer somente com VB vou tentar analisar .
#7036
Veja se isso lhe atende.
Código: Selecionar todos
Option Explicit

Sub CódigoDoLee()

Application.ScreenUpdating = False
 
         ' Declaração das variáveis e Arrays
        Dim Expostos() As String 'Array de Skus Expostos
        Dim Fichart() As String 'Array de Skus do Fichart
        Dim Ce As Integer 'Variável Contagem dos Skus Expostos
        Dim Cf As Integer 'Variável Contagem dos Skus Fichart
        Dim Ct As Integer
        Dim E As Variant
        Dim F As Variant
        Dim l As Variant
        Dim match As Boolean
        Dim rngDst As Range
                     
        Set rngDst = Sheets("COMPARADOR").Range("TAB_POREXPOR[SKU]")
                                                        
        rngDst.Value = ""
           
          ' Contagem do nº de SKU's para parametrizar as Arrays e re-parametrização
        Ce = Application.WorksheetFunction.Count(Range("Sku_expostos"))
        Cf = Application.WorksheetFunction.Count(Range("Sku_fichart"))
        
        ReDim Expostos(1 To Ce)
        ReDim Fichart(1 To Cf)
 
 
        ' Leitura dos Skus Expostos e Fichart para as Arrays
        Dim Ne As Integer
        Dim Nf As Integer
        For Ne = 1 To Ce
            Expostos(Ne) = Sheets("Expostos").Range("B4").Offset(Ne)
        Next Ne
        
        For Nf = 1 To Cf
            Fichart(Nf) = Sheets("Fichart").Range("C2").Offset(Nf)
        Next Nf
 
 
        For Each F In Fichart
            match = False
            
            l = 7 'Defina aqui a primeira linha que será preenchida na coluna C de COMPARADOR
            For Each E In Expostos
                If F = E Then match = True
                
                If Not match Then
                    Sheets("COMPARADOR").Range("C" & l) = E
                    l = l + 1
                End If
            
            Next E
            
        Next F
        
Application.ScreenUpdating = True
End Sub
#7037
Antes de mais, obrigado pela rápida resposta fernandoazevedo ;)

Penso que entendi direito o que você disse, por isso lhe digo que isso não funciona na situação dos artigos do meu ficheiro, porque:
- Artigo 1421 tem 5 unidades em Stock "estoque", mas só preciso expor 1 unidade de cada artigo.
- a Folha "2" é gerada por um programa de gestão de stocks da empresa, e ao gerar ela vem logo apenas com os artigos que tem Stock na loja.

A minha intenção era mesmo solucionar via VBA, para aprender mais também e puder usar mais conhecimentos em outras áreas do meu trabalho como na "planilha" de vendas por colaborador que também tenho no trabalho por exemplo.
#7039
laennder escreveu:Veja se isso lhe atende.
110% funcionando! Realmente, quem sabe, sabe!
Muito obrigado Laennder! :P

Já agora aproveitando o tópico, há alguma coisa que eu poderia mudar no meu código para "otimizar" ?
#7042
Existe sim. Mas acho que pra esse caso, seria melhor abrir outro tópico.

Lembrando, quando um tópico resolver a sua dúvida, clique no botão MARCAR RESOLVIDO.
#7152
Preciso de ajuda novamente. Pensei que o código estava a funcionar direito, mas hoje quando cheguei ao trabalho e levei o ficheiro novo, e carreguei novamente a listagem da Folha 2 e executei o VBA, os valores que passam para a folha 3 são os mesmos da folha 1.

Deve estar algo rodando mal no código que enviou Laennder :\

Vou mostrar com cores o que preciso, para ser mais fácil entender:

FOLHA 1
A1 - 4938804
A2 -5336742
A3 -5336755
A4 - 5336773


FOLHA 2
A1 - 4938804
A2 - 5336742
A3 - 5336755
A4 - 5336773

A5 - 5382033
A6 - 5389199
A7 - 5407558
A8 - 5424018


FOLHA 3
5382033
5389199
5407558
5424018


Se facilitar assim para entender, preciso que o código verifique se o SKU da folha 2 está presente na folha 1, se não estiver é para ele ser colocado na folha 3.
#7153
Vou reescrever seu código todo novamente, tem problema?
#7170
Continuo sem conseguir, passei bastante tempo ontem de volta do código e modificando parte apenas consigo que ele dê resultado como abaixo, apenas um código:

FOLHA 3
5382033
5382033
5382033
5382033
5382033
5382033
5382033
5382033
#7171
Minhas considerações: como não conheço a planlha, fiz conforme acreditei ser a planilha
Código: Selecionar todos
Option Explicit

Sub CódigoDoLee()
    Dim F As Variant
    Dim l As Variant
    Dim rngDst As Range
    Dim rngFichart As Range
    Dim rngExposto As Range
                 
    Application.ScreenUpdating = False
                 
    Set rngDst = Sheets("COMPARADOR").Range("TAB_POREXPOR[SKU]")
    Set rngFichart = Sheets("Ficharts").Range("SUBSTITUIR INTERVALO AQUI")
    Set rngExposto = Sheets("Expostos").Range("SUBSTITUIR INTERVALO AQUI")
    
    rngDst.Value = ""
    
    l = 1 'PRIMEIRA LINHA QUE DEVE SER PREENCHIDA NA FOLHA 3
    
    For Each F In rngFichart
        If WorksheetFunction.CountIf(rngExposto, F) = 0 Then
            Sheets("COMPARADOR").Range("c" & l) = F
            l = l + 1
        End If
    Next F
    
    Application.ScreenUpdating = True
End Sub
#7175
Está a funcionar! Era assim tão simples?
Vou tentar entender o seu código e o que ele faz...

Permita-me só que altere o nome da macro para "CódigoDoLaennder" :oops:
Obrigado mais uma vez! Quando chegar no trabalho e se amanhã ele estiver funcionando direito com as novas listagens, coloco RESOLVIDO novamente!
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord