none
Problema com rotina with RRS feed

  • Pergunta

  • Boa tarde,

    Sou novo em vba e estou aprendendo na raça. Me interessei pois preciso disso para agilizar determinada rotina em trabalho.

    Galera, não vim sugar atividades prontas e ir embora, eu realmente preciso de ajuda e já procurei bastante no "pai dos burros" (google rs).

    Uma das coisas que preciso fazer é buscar determinada palavra em uma coluna de uma planilha especifica e colar o valor desta ocorrencia em outra planilha, isso deve se repetir para cada ocorrencia da busca.

    A rotina eu até consegui fazer, mas ela só executa pra primeira ocorrencia e depois da um erro: "A variável do objeto ou a variável do bloco 'with' não foi definida". Segue o código:

    Sub linha()
        Dim j, l As Integer
        Dim k As Long
        Dim aux As Variant
        Dim lin As Prop
        l = 5
        For j = 1 To 863
            With Worksheets("Base").Cells(j, 1)
                Set aux = .Find("NE:", LookIn:=xlValues)
                lin.ne = aux.Value           <------------------------------ERRO
                Worksheets("SFP").Cells(l, 1).Value = lin.ne
                l = l + 1
            End With
        Next j
    End Sub

    Acredito que o problema seja eu ter setado a variavel aux, porem sem o set, nem o primeiro loop ocorre.

    Desde já agradeço a imensa ajuda.

    Abraços

    segunda-feira, 3 de dezembro de 2012 19:29

Respostas

  • Experimente o código abaixo:

    Sub linha()
        Dim j As Long
        Dim l As Long
        l = 5
        For j = 1 To 863
            With Sheets("Base").Cells(j, "A")
                If InStr(.Value, "NE:") > 0 Then
                    Sheets("SFP").Cells(l, "A") = .Value
                    l = l + 1
                End If
            End With
        Next j
    End Sub

    'Atenção:
    Dim j, l As Integer
    'é diferente de:
    Dim j As Integer
    Dim l As Integer
    'Você tem que especificar claramente o tipo de dados que uma variável
    'representa quando separa-as por vírgula:
    Dim j As Integer, l As Integer
    'Da forma como declarou inicialmente, 'j' está declarada como tipo Variant
    'e l como Integer.
    
    'Outra observação sobre essas declarações: no VBA, na maioria das vezes,
    'não declare variáveis como Integer. Prefira declarar como Long. Além
    'de variáveis tipo Long conseguirem representar qualquer valor de linha
    'numa planilha, são interpretadas pelo compilador com mais velocidade.
    
    On Error Resume Next
    'Não deixe essa instrução solta por aí no código. Você tem que tratar os erros!
    'Colocando essa instrução, seu código rodará sem te avisar os erros, mas não
    'espere que os erros sejam consertados sozinhos. O que acontecerá, simplesmente,
    'é que você não será notificado dos erros.
    'Veja mais em: http://www.ambienteoffice.com.br/officevba/tratamento_de_excecao/
    
    With Worksheets("Base").Cells(j, 1)
    Set lin.ne = .Find("NE:", LookIn:=xlValues)
    'Nesse bloco de código, observe que você está utilizando o método Find em apenas
    'uma célula. É dispensado seu uso nesse caso. É melhor usar a instrução InStr, usado
    'no exemplo que te passei.



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

    segunda-feira, 3 de dezembro de 2012 21:11
    Moderador

Todas as Respostas

  • Para provar que não estou apenas esperando uma solução pronta rsrsrs

    Alterei o código para o que segue e funcionou, mais ou menos...

    Sub linha()
        Dim j, l As Integer
        Dim k As Long
        Dim lin As Prop
        l = 5
        On Error Resume Next
        For j = 1 To 863
            With Worksheets("Base").Cells(j, 1)
                Set lin.ne = .Find("NE:", LookIn:=xlValues)
                Worksheets("SFP").Cells(l, 1).Value = lin.ne.Value
                l = l + 1
            End With
        Next j
    End Sub

     

    Esqueci de postar a estrutura que criei:

    Type Prop
        ne As Variant
        board As Variant
        component As Variant
        boardtype As Variant
        barcode As Variant
        item As Variant
        description As Variant
    End Type

     

    O a rotina funciona, mas deve haver algum erro na nas linhas:

    Worksheets("SFP").Cells(l, 1).Value = lin.ne.Value
    l = l + 1

    Quando ele insere os valores, ele não insere em uma sequencia de linhas abaixo, ao contrário ele pula a mesma quantidade de linhas que existe entre uma ocorrencia e outra na base. Socorro rsrs

    segunda-feira, 3 de dezembro de 2012 19:29
  • Experimente o código abaixo:

    Sub linha()
        Dim j As Long
        Dim l As Long
        l = 5
        For j = 1 To 863
            With Sheets("Base").Cells(j, "A")
                If InStr(.Value, "NE:") > 0 Then
                    Sheets("SFP").Cells(l, "A") = .Value
                    l = l + 1
                End If
            End With
        Next j
    End Sub

    'Atenção:
    Dim j, l As Integer
    'é diferente de:
    Dim j As Integer
    Dim l As Integer
    'Você tem que especificar claramente o tipo de dados que uma variável
    'representa quando separa-as por vírgula:
    Dim j As Integer, l As Integer
    'Da forma como declarou inicialmente, 'j' está declarada como tipo Variant
    'e l como Integer.
    
    'Outra observação sobre essas declarações: no VBA, na maioria das vezes,
    'não declare variáveis como Integer. Prefira declarar como Long. Além
    'de variáveis tipo Long conseguirem representar qualquer valor de linha
    'numa planilha, são interpretadas pelo compilador com mais velocidade.
    
    On Error Resume Next
    'Não deixe essa instrução solta por aí no código. Você tem que tratar os erros!
    'Colocando essa instrução, seu código rodará sem te avisar os erros, mas não
    'espere que os erros sejam consertados sozinhos. O que acontecerá, simplesmente,
    'é que você não será notificado dos erros.
    'Veja mais em: http://www.ambienteoffice.com.br/officevba/tratamento_de_excecao/
    
    With Worksheets("Base").Cells(j, 1)
    Set lin.ne = .Find("NE:", LookIn:=xlValues)
    'Nesse bloco de código, observe que você está utilizando o método Find em apenas
    'uma célula. É dispensado seu uso nesse caso. É melhor usar a instrução InStr, usado
    'no exemplo que te passei.



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

    segunda-feira, 3 de dezembro de 2012 21:11
    Moderador
  • Felipe (ou Benzadeus rs)

    Muito obrigado, vou ler sim o artigo sobre como tratar erros, mas posso te fazer mais um pergunta?

    O código que me passou é excelente e as intruções foram ótimas, mas ainda preciso de mais uma coisa. Outra necessidade minha é a seguinte, ao passar para a SFP depois de executar a rotina o resultado é este:

    O que devo acrescentar para que todas as informações fiquem na mesma linha? Tentei ajustar manualmente, subtraindo de l a quantidade de linhas que pulou, mas em alguns casos, eu não tenho a informação "[Main Board]" mesmo assim tenho todas as suas propriedades e seu endereço. Se faço a correção manual, nessa situação, as propriedades ficam uma linha acima do endereço que deveriam estar.

    OBS: Quando digo endereço, quero dizer que: NE é onde a BOARD está e que nesta board eu tenho Componentes (Main ou Port) com propriedades (de BOARDTYPE a DESCRIPTION).

    
    Sub linha()
        Dim tam As Integer
        Dim wsBase As Worksheet
        Set wsBase = Sheets("Base")
        tam = wsBase.Cells.SpecialCells(xlCellTypeLastCell).Row
        Dim j As Long
        Dim l As Long
        Dim lin As Prop
        l = 5
        Application.ScreenUpdating = False
        'On Error Resume Next
        For j = 1 To tam
            With Worksheets("Base").Cells(j, "A")
                If InStr(.Value, "NE:") > 0 Then
                    Sheets("SFP").Cells(l, "A") = .Value
                End If
                If InStr(.Value, "Board:") > 0 Then
                    Sheets("SFP").Cells(l, "B") = .Value
                End If
                If InStr(.Value, "Main") > 0 Then
                    Sheets("SFP").Cells(l, "C") = .Value
                End If
                If InStr(.Value, "Port") > 0 Then
                    Sheets("SFP").Cells(l, "C") = .Value
                End If
                If InStr(.Value, "BoardType") > 0 Then
                    Sheets("SFP").Cells(l, "D") = .Value
                End If
                If InStr(.Value, "BarCode") > 0 Then
                    Sheets("SFP").Cells(l, "E") = .Value
                End If
                If InStr(.Value, "Item") > 0 Then
                    Sheets("SFP").Cells(l, "F") = .Value
                End If
                If InStr(.Value, "Description") > 0 Then
                    Sheets("SFP").Cells(l, "G") = .Value
                End If
                l = l + 1
            End With
        Next j
        Columns("A:G").EntireColumn.AutoFit
        Application.ScreenUpdating = True
    End Sub

    Aqui me sinto desconfortável, já perguntei demais, mas preciso que Board e NE repitam até que apareça uma ocorrência diferente.

    Mais uma vez agradeço muitíssimo a ajuda.

    terça-feira, 4 de dezembro de 2012 12:41
  • Fábio,

    Estou entendendo que sua nova pergunta não está relacionada com a pergunta original. Para manter o fórum organizado, crie um novo tópico.


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

    quarta-feira, 5 de dezembro de 2012 01:32
    Moderador