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.
Por SandroLima
#73127
Boa tarde, pessoal.

Estou fazendo uma macro com o intuito de localizar a linha e contar a quantidade de uma determinada ocorrência em uma coluna.

Porém a Macro é interrompida por uma célula que contem um erro do tipo "#NOME?"

Como posso tratar esse erro de modo que a macro continue executando a rotina?

Segue planilha para verificação.
Você não está autorizado a ver ou baixar esse anexo.
Por SandroLima
#73128
Tentei resolver da seguinte maneira:

Option Explicit

Sub Localizar_e_Contar_Ocorrencias()

Dim Plan As Worksheet
Dim Ult_Lin_NC As Long
Dim CoL_NC As Long
Dim Ult_Lin_Operacao As Long
Dim Lin As Long, Counter As Long

Set Plan = Sheets("Planilha1")

Ult_Lin_NC = 262
CoL_NC = 4

Ult_Lin_Operacao = Ult_Lin_NC

For Lin = Ult_Lin_Operacao To 2 Step -1
If Plan.Cells(Lin, CoL_NC).Value = "Corretora" Then
MsgBox Lin
Ult_Lin_Operacao = Lin - 1
End If

Counter = Counter + 1

Next

MsgBox Counter

Set Plan = Nothing

End Sub

Mas dessa forma ele contabiliza os erros.

Está retornando o valor 6 quando deveriam ser apenas 3.
Por osvaldomp
#73129
Se o Bill Gates souber que pra fazer uma contagem de conteúdo você fez um Loop por mais de 250 células, ele vai entrar em deprê.

Sub ContarCorretora()
Dim k As Long
k = Application.CountIf(Range("D6:D" & Cells(Rows.Count, 4).End(3).Row), "Corretora")
MsgBox k
End Sub
Por SandroLima
#73131
Boa noite, Osvaldo.

Obrigado pela dica.

Na verdade o loop para contar a quantidade de ocorrências ou conteúdo era um "gancho" para juntamente com a contagem identificar a linha em há a ocorrência/conteúdo.

Mas me preocupo também em fazer o loop pq essa é uma amostra com apenas 3 notas de corretagem mas esse número pode ser bem maior.

Poderia me ajudar com isso também?

Preciso contar a quantidade de ocorrências e a linha em que ocorreu... por isso fiz o loop.

A ideia final é identificar a quantidade de notas de corretagem no range e identificar a linha inicial e final das linhas das operações.

Mas se me ajudar apenas na melhor maneira de contar a quantidade de notas e identificar a última linha das operações de cada nota já me ajudaria muito e eu tentaria fazer o restante.

Apontei a linha com o conteúdo "corretora" pois a última linha de cada intervalo das operações será sempre lin_corretora - 1.

Mais uma vez muito obrigado.
Por osvaldomp
#73132
... identificar a linha em há a ocorrência/conteúdo.
Preciso contar a quantidade de ocorrências e a linha em que ocorreu... por isso fiz o loop.

► No seu código a identificação das linhas é informada via MsgBox, que é uma informação volátil e isso obriga o usuário a memorizar cada número de linha mostrado na tela.
Se a informação de quais linhas contém o critério será utilizada na sequência pela mesma ou por outra macro ou UDF, então ela deve ser armazenada em uma coleção (Matriz, por exemplo).
Por outro lado, se essa informação será somente para análise visual após a execução da macro, então o próprio código pode destacar as linhas na planilha.
Não faz sentido obrigar o usuário a memorizar dados exibidos na tela durante a execução de uma macro.
_______________________________________________________________________________________________________
Mas me preocupo também em fazer o loop pq essa é uma amostra com apenas 3 notas de corretagem mas esse número pode ser bem maior.

►O método a ser utilizado para identificar a localização de conteúdos (neste caso você escolheu o Loop) deve ser escolhido com base na quantidade de dados a serem analisados e não na quantidade existente dos conteúdos procurados, até porque, a quantidade de conteúdos procurados não é sabida antes de rodar a macro, pois se já for sabida, então rodar a macro para descobrir o que já se sabe é puro passatempo.
_____________________________________________________________________________________________________
Mas se me ajudar apenas na melhor maneira de contar a quantidade de notas

► O exemplo de código que passei na mensagem anterior faz isso. O Loop é possivelmente o mais lento dos métodos para se efetuar buscas em planilha.
_____________________________________________________________________________________________________
... e identificar a última linha das operações de cada nota ...

► Para identificar a última linha em que ocorre o conteúdo procurado eu sugiro o uso do método Find com o parâmetro SearchDirection:=xlPrevious. NUNCA UTILIZE LOOP PARA ISSO.
___________________________________________________________________________________________________

► A minha sugestão é utilizar o método Find ... FindNext para identificar todas as células/linhas que contêm o conteúdo procurado. Mas isso depende do próximo passo, ou seja, o que você vai fazer com essas informações.

► Outra dica é evitar a criação desnecessária de variáveis, pois isso aumenta o tamanho do código, dificulta a sua leitura e o seu entendimento.
Veja no código que passei que utilizei somente uma variável (k). E coloquei essa variável supondo que ele será utilizada na sequência, pois se for só para informação visual, então ela pode ser dispensada.
Editado pela última vez por osvaldomp em 02 Abr 2023 às 22:13, em um total de 1 vez.
Por SandroLima
#73133
Boa tarde, Osvaldomp.

Mais uma vez obrigado pelo retorno e explicações dadas.

Vou anexar uma planilha e nela coloco duas situações:
- Em uma aba inseri manualmente o resultado esperado ao final da rotina da macro.
- Na Aba Principal "NOTAS DE CORRETAGEM" inseri 2 botões com Macros.
> em um deles fiz a simulação da maneira que consegui inserir os dados porém só consegui escrever para a situação em que há uma única nota de corretagem e envolve o "loop" que talvez não seja a melhor maneira de inserir os dados mas foi a que eu consegui estruturar

> No outro botão, agora já para a situação em que pode ocorrer mais de uma nota de corretagem, já utilizando a sua maneira de contar as ocorrências e baseado nas suas orientações deixei comentado o que preciso no código.

Poderia me ajudar a construir a melhor maneira de extrair esses dados?

Vou tentar me explicar minhas limitações a necessidade do código baseado nas suas orientações comentadas anteriormente.

► No seu código a identificação das linhas é informada via MsgBox, que é uma informação volátil e isso obriga o usuário a memorizar cada número de linha mostrado na tela.
Se a informação de quais linhas contém o critério será utilizada na sequência pela mesma ou por outra macro ou UDF, então ela deve ser armazenada em uma coleção (Matriz, por exemplo).
Por outro lado, se essa informação será somente para análise visual após a execução da macro, então o próprio código pode destacar as linhas na planilha.
Não faz sentido obrigar o usuário a memorizar dados exibidos na tela durante a execução de uma macro.

►► Sim a informação da linha deverá ser armazenada... coloquei o MsgBox apenas para saber se está funcionado a localização / identificação das linhas inicial e final da sequencia de operações de cada nota de corretagem... e isso não estou sabendo como fazer.

Tudo que quero ao final da macro é localizar as linhas das operações e copiá-las para outra coluna em sequencia.
--------------------------------------------------------------------------------------------------------------------------------------------------------------

►O método a ser utilizado para identificar a localização de conteúdos (neste caso você escolheu o Loop) deve ser escolhido com base na quantidade de dados a serem analisados e não na quantidade existente dos conteúdos procurados, até porque, a quantidade de conteúdos procurados não é sabida antes de rodar a macro, pois se já for sabida, então rodar a macro para descobrir o que já se sabe é puro passatempo.

►►O intuito/resultado desejado com a macro é localizar as linhas das operações e copiá-las para outra coluna em sequencia.
Vou reproduzir o efeito desejado manualmente na planilha.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
► O exemplo de código que passei na mensagem anterior faz isso. O Loop é possivelmente o mais lento dos métodos para se efetuar buscas em planilha.

►► Achei ótimo e já inseri aqui.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------

► Para identificar a última linha em que ocorre o conteúdo procurado eu sugiro o uso do método Find com o parâmetro SearchDirection:=xlPrevious. NUNCA UTILIZE LOOP PARA ISSO.

►► Esse não conheço... poderia me dar uma orientação?
------------------------------------------------------------------------------------------------------------------------------------------------------------------

► A minha sugestão é utilizar o método Find ... FindNext para identificar todas as células/linhas que contém o conteúdo procurado. Mas isso depende do próximo passo, ou seja, o que você vai fazer com essas informações.

►► Vou colocar na planilha a parte do código com a sua ideia anterior para contar as ocorrências e o exemplo inserido manualmente do resultado desejado

► Outra dica é evitar a criação desnecessária de variáveis, pois isso aumenta o tamanho do código, dificulta a sua leitura e o seu entendimento.

►► Sobre as vaiáveis é pq vou executando o código linha a linha para ir entendendo e as variáveis me ajudam nisso. Mas concordo que códigos devem ser mais enxutos.
------------------------------------------------------------------------------------------------------------------------------------------------------------------
►Veja no código que passei que utilizei somente uma variável (k). E coloquei essa variável supondo que ele será utilizada na sequência, pois se for só para informação visual, então ela pode ser dispensada.

►► Preciso armazenar a informação.

Segue a planilha anexa.
Você não está autorizado a ver ou baixar esse anexo.
Por SandroLima
#73139
Bom dia, Osvaldomp.

Isso mesmo... buscando a mesma finalidade.

Abri o tópico aqui reformulando a necessidade para melhor entendimento.

Mas já vou dar uma olhada na sugestão do tópico do link que vc enviou.

Se tiver alguma sugestão dentro desse tópico após a reformulação da necessidade que coloquei fico agradecido.

Tenham todos uma excelente semana.
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