none
Tabela Excel RRS feed

  • Pergunta

  • Eu tenho uma tabela em exel aonde a primeira aba é dados cliente e a outra é testes.

    Na aba testes possui uma coluna com nomes de produtos e outra com quantidade.

    Eu gostaria que quando eu mudasse a quantidade de um produto ele automaticamente aparecesse na aba dados cliente.

    Mas quando a quantidade do produto na aba testes for 0 não apareça esse produto na aba dados cliente.

    Preciso de uma formula para isso e não estou encontrando.

    quarta-feira, 13 de março de 2013 16:42

Respostas

  • Nas duas planilhas:

    • Coluna A: Descrição dos produtos
    • Coluna B: Quantidade dos produtos

    Cole o código abaixo na classe da planilha Testes:

    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim lLin As Long
        Dim wsClientes As Worksheet
        
        If Intersect(Target, Columns("A:B")) Is Nothing Then Exit Sub
        
        Set wsClientes = ThisWorkbook.Sheets("Clientes")
        lLin = flMatch(Cells(Target.Row, "A"), wsClientes.Columns("A"))
        If lLin = 0 Then
            If Cells(Target.Row, "B") <> 0 Then
                lLin = flRowLast(wsClientes.Columns("A")) + 1
                wsClientes.Cells(lLin, "A") = Cells(Target.Row, "A")
                wsClientes.Cells(lLin, "B") = Cells(Target.Row, "B")
            End If
        Else
            If Cells(Target.Row, "B") = 0 Then
                wsClientes.Rows(lLin).Delete
            Else
                wsClientes.Cells(lLin, "B") = Cells(Target.Row, "B")
            End If
        End If
    End Sub
    
    Function flMatch(ByVal vTermo As Variant, ByVal vVetor As Variant) As Long
        'Se vVetor for um objeto Range, retorna o número da linha ou coluna
        'de uma célula com conteúdo vTermo numa linha ou coluna.
        'Se vVetor for um vetor, retorna o índice do elemento vTermo no vetor.
        'Caso não seja encontrada nenhuma ocorrência, é retornado 0.
        
        Dim Temp 'As Long
        
        On Error Resume Next
        Temp = WorksheetFunction.Match(CStr(vTermo), vVetor, 0)
        If Temp = 0 Then Temp = WorksheetFunction.Match(vTermo + 0, vVetor, 0)
        On Error GoTo 0
        
        If Temp > 0 Then
            Select Case TypeName(vVetor)
                Case "Range"
                    If vVetor.Columns.Count = 1 Then
                        'vVetor é uma coluna
                        Temp = Temp + vVetor.Row - 1
                    ElseIf vVetor.Rows.Count = 1 Then
                        'vVetor é uma linha
                        Temp = Temp + vVetor.Column - 1
                    End If
            End Select
        End If
        
        flMatch = Temp
    End Function
    
    Function flRowLast(rng As Range) As Long
        'Retorna o número da última linha povoada do intervalo rng
        Dim Temp
        
        With rng
            On Error Resume Next
            Temp = .Find(What:="*" _
            , After:=.Cells(1) _
            , SearchDirection:=xlPrevious _
            , SearchOrder:=xlByColumns _
            , LookIn:=xlFormulas).Row
            If Temp = 0 Then Temp = rng.Cells(1).Row
        End With
        
        flRowLast = Temp
    End Function


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br


    sábado, 16 de março de 2013 14:12