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
Por rit
Posts
#55984
Bom dia,

Eu encontrei um procv na internet que me tras os itens em ordem, hoje o procv normal nos tras apenas a primeira ocorrencia com esse outro procv que eu achei eu consigo pegar a primeira, segunda etc... só que esse código esta travando de mais, ele funciona bem até, mas quando tem muitos dados ele trava tudo.. alguem consegue otimizar esse código? ou me dizer o que pode ser feito para melhorar o desempenho dele?
Código: Selecionar todos
Public Function PROCVN(Val1 As Variant, _
                       Table As Range, _
                       ResultCol As Integer, _
                       Optional Val1Occrnce As Integer = 1)
    Dim i As Integer
    Dim iCount As Integer
    Dim rCol As Range
        For i = 1 To Table.Rows.Count
        If Not (Application.WorksheetFunction.IsError(Table.Cells(i, 1))) Then
            If UCase(Table.Cells(i, 1)) = UCase(Val1) Then
                iCount = iCount + 1
            End If
            If iCount = Val1Occrnce Then
                PROCVN = Table.Cells(i, ResultCol)
                Exit For
                Else
                PROCVN = CVErr(xlErrNA)
            End If
        End If
        Next i
End Function
Por babdallas
#55990
Tentei melhorar o código. Veja o exemplo em anexo. Evidentemente que se tivermos milhares de linhas o resultado pode sim demorar muito, pois ele percorre linha a linha.
Código: Selecionar todos
Public Function PROCVN(Val1 As Variant, _
                       Table As Range, _
                       ResultCol As Long, _
                       Optional Val1Occrnce As Long = 1)
                       
    Static vrtDados     As Variant
    Dim i               As Long
    Dim iCount          As Long
    Dim rngInt          As Range
    
    Set rngInt = Application.Intersect(Table, Planilha1.UsedRange)
    If Not VBA.IsArray(vrtDados) Then
        vrtDados = rngInt.Value
    End If
    
        For i = LBound(vrtDados, 1) To UBound(vrtDados, 1)
            If Not (VBA.IsError(vrtDados(i, 1))) Then
                If VBA.UCase(vrtDados(i, 1)) = VBA.UCase(Val1) Then iCount = iCount + 1

                If iCount = Val1Occrnce Then
                    PROCVN = vrtDados(i, ResultCol)
                    Exit For
                Else
                    PROCVN = CVErr(xlErrNA)
                End If
            End If
        Next i
End Function
Você não está autorizado a ver ou baixar esse anexo.
Editado pela última vez por babdallas em 16 Jun 2020 às 06:44, em um total de 1 vez.
Por babdallas
#56013
É um Procv que no último argumento você pode escolher se quer retornar a 1a, 2a, 3a correspondência, etc. Se não tiver a correspondência, retornar erro de não disponível.
Por babdallas
#56022
Editei a primeira mensagem. Mudei um pouco o código para não deixar lento demais caso se escolha a coluna toda. Também anexei um exemplo lá. Lembrando que o código não é meu. Apenas adaptei para ficar menos lento.
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