Notifications
Clear all

Consulta dentro de Array

10 Posts
2 Usuários
0 Reactions
2,130 Visualizações
depoisteconto
(@depoisteconto)
Posts: 183
Estimable Member
Topic starter
 

Caros, boa noite!

Estou colecionando emails vindo de uma tabela access. Pra isso, decidi criar um array.

Quero verificar se o email já existe, antes de anotá-lo dentro do array.

Alguem pode ajudar?

Sql = "SELECT * FROM Cadastro"
Sql = Sql & strCrit & " ORDER BY [Codigo]"
  
On Error GoTo 0
cx.Conectar
   
With banco
    .CursorType = adOpenKeyset
    .CursorLocation = adUseClient
    .Source = Sql
    .ActiveConnection = cx.Conn
    .Open
End With

banco.MoveLast

Front.Reg_Direct_Mail = banco.AbsolutePosition

banco.MoveFirst

Dim Lista() As String
Dim Email As Variant

ReDim Preserve Lista(Front.Reg_Direct_Mail)

While Not banco.EOF

Email = banco(18)

          For Each Email In Lista
  
          Exit For

          Lista(x) = banco(18)
      
          Next

banco.MoveNext

Wend

cx.Desconectar

At

 
Postado : 17/09/2014 2:55 pm
(@edcronos)
Posts: 1006
Noble Member
 

pelo visto ainda tenho muito que aprender,

tentei entender sua macro mas fiquei bastante confuso

Dim Lista() As String <<---aqui vc cria o array
Dim Email As Variant

ReDim Preserve Lista(Front.Reg_Direct_Mail) <<<--- e aqui vc usou o preserve antes mesmo de definir algum valor na array

para saber se na array tem algum valor eu uso um laço for next e o if

mas como vc não quer valores repetidos vc pode uma dicionários em vez de arrays

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 18/09/2014 7:02 am
(@edcronos)
Posts: 1006
Noble Member
 

desculpe, "acho" que me equivoquei

acho que são coleções

esse pequeno código preenche um combo box com valores únicos da coluna A da linha 1 até 200

Private Sub ComboBox1_DropButtonClick()

    Do While ComboBox1.ListCount > 0: ComboBox1.RemoveItem (0): Loop    ' limpa dados do combobox

    Dim Lista As New Collection

    On Error Resume Next
    For L = 1 To 200
        Lista.Add banco, CStr(banco)
    Next
    
    For Each Valor In Lista    '----------------------------( Preenche Combobox com os valores de "Lista (Coleção)")---
        ComboBox1.AddItem Valor
    Next Valor
    Set Lista = Nothing    '---------------( Limpa "lista (Coleção)")---

End Sub

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 18/09/2014 8:05 am
depoisteconto
(@depoisteconto)
Posts: 183
Estimable Member
Topic starter
 

Olá Edcronos, obrigado por responder.

ReDim Preserve Lista(Front.Reg_Direct_Mail) >> o valor da lista está entre parenteses.

Fazer a verificação de nome repetido através do for next if acho que demora mais do que no for each, acredito.

At

 
Postado : 18/09/2014 8:27 am
(@edcronos)
Posts: 1006
Noble Member
 

dá na mesma,
for next por ser mais simples creio ser mais rápido
e processo de comparação é algo basico em vba.
não sei quantos emails vc tem mas eu faço loops 1000000 de ciclos em arrays e nem dá para piscar

sobre o valor da lista estar entre parêntese, não entendi,
mas Redim por acaso não serve apenas para redimensionar o array?
e para atribuir valores não teria que usar "=" ?

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 18/09/2014 8:47 am
(@edcronos)
Posts: 1006
Noble Member
 

eu tentei analisar a sua macro,
como não sei trabalhar com bancos de dados ficou alguns pontos sem eu conseguir entender
e voce não especificou oq funciona e oq nao funciona

    banco.MoveLast

    Front.Reg_Direct_Mail = banco.AbsolutePosition
    banco.MoveFirst
    Dim Email As Variant
    Dim Lista() As String

    Lista = Front.Reg_Direct_Mail
    tamanholista = UBound(Lista) '<<<---verifica qual o tamano da lista de emails
    
    While Not banco.EOF

        Email = banco(18)

        nd = 0 '<<---coloca a adição do valor como possitiva

 '--------------------------------------------------------'varre a lista para saber se o email já existe
        For x = 0 To tamanholista
            If Lista(x) = banco(18) Then nd = 1: Exit For '<<<---------se existe sai do loop e cancela a adição e redim do array
        Next
'-------------------------------------------------------------------------------------------------------------------------
'------------------------- 'se valor não existe redimenciona o array e add o novo valor
        If nd = 0 Then
            tamanhoarray = tamanhoarray + 1
            ReDim Preserve Lista(0 To tamanhoarray)  '<<<---redimenciona o array para caber o novo valor
            Lista(x) = banco(18)
        End If

        banco.MoveNext
    Wend
    cx.Desconectar

Front.Reg_Direct_Mail = banco.AbsolutePosition
banco.MoveFirst
Dim Email As Variant
Dim Lista() As String

provavelmente precise de um loop para adicionar os valores em lista
Lista = Front.Reg_Direct_Mail

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 18/09/2014 9:46 am
depoisteconto
(@depoisteconto)
Posts: 183
Estimable Member
Topic starter
 

Nesse caso vou usar o For, If, next mesmo.

Obrigado.

At

 
Postado : 18/09/2014 11:55 am
(@edcronos)
Posts: 1006
Noble Member
 

para definir a melhor maneira de se fazer a macro

tem que se entender como funciona a aquisição de banco de dados

tipo essa linha...
Front.Reg_Direct_Mail = banco.AbsolutePosition
é mais de um valor de cada vez?
é mais de uma coluna?
tem como contar quantos valores possuem ?
com Array se usa o UBound para se saber o tamanho

UBound(array,1) retorna quantas linha tem a array
UBound(array,2) retorna quantas colunas tem a array

então para se fazer um loop na array na linha
for L=1(0) to UBound(array,1) a array pode começar em 0 ou 1

Obs. ReDim Preserve dentro de um loop tem uma perda significante de performance, mas creio não ser contável em seu caso

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 18/09/2014 12:23 pm
depoisteconto
(@depoisteconto)
Posts: 183
Estimable Member
Topic starter
 

Cronos,

Pra finalizar então...

Front = nome do meu userform
Reg_Direct_Mail = nome de uma label
banco = nome de um recorset
.AbsolutePosition = método de um recordset

As vezes escrevemos nos fóruns da vida e achamos que todo mundo tá fazendo o mesmo projeto :lol:

Obrigado pela disposição.

Até breve. ;)

 
Postado : 19/09/2014 6:29 am
(@edcronos)
Posts: 1006
Noble Member
 

estou meio confuso...
já solucionou o seu problema?

se, não
no caso vc vai entrar dados a partir de um formulário, e quer saber se esse dado em questão já existe em seu banco de dados,
seria isso?

para falar a verdade estou completamente confuso...

se ainda não resolveu tenta detalhar melhor oq vc quer fazer

de onde os dados da array vem
com dados de onde vai ser verificado se já existe, e ter uma nova entrada
como vai ser usada essa array posteriormente, vai ser carregado de volta no banco de dados?

se tem como saber a quantidade de dados do banco antes de pega-los
pode fazer assim...

dim lista()
quant=(verificar quantidade de dados do banco)
redim lista(quant)

for n=0 to quant
lista(n)=banco(x)
next

nd = 0 '<<---coloca a adição do valor como possitiva
'--------------------------------------------------------'varre a lista para saber se o email já existe
For n = 0 To quant
If Lista(n) = banco(18) Then
nd = 1:
Exit For
enf if
next

'------------------------- 'se valor não existe redimenciona o array e add o novo valor
If nd = 0 Then
quant = quant + 1
ReDim Preserve Lista(0 To quant) '<<<---redimenciona o array para caber o novo valor
Lista(x) = banco(18)
End If

como vc mesmo falou, é bem dificil definir oq a pessoa está pensando em fazer e como

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 19/09/2014 8:49 am