Página 1 de 1

Gerando Arranjos

Enviado: 14 Dez 2019 às 16:31
por TiaoMecanico
Tudo bom, pessoal? Estou me aventurando a aprender VBA, Eu estava estudando como gerar um arranjo de valores distribuídos em colunas em que os valores não repetissem, achei umas vídeo aulas, li um pouco e comecei a entender, conseguir gera um arranjo para uma linha e diversas colunas, então pensei, beleza, e agora eu quero 3 linhas de arranjos, mas o mas o valor em determinada linha e coluna, não pode ser igual ao que está imediatamente acima

Por exemplo, se na linha 1 e coluna 2 eu tenho o Valor 4, então na linha 2 coluna 2 eu não posso ter o valor 4. Tentei usar If,mas sem sucesso, algumas vezes ele gera linhas faltando valores, e às vezes até os valores que não deveriam repetir, repetem.

Esse é o código que estou usando.
Código: Selecionar todos
Option Base 1
Sub FabioJunior()
Dim qtd As Integer


Dim clc1 As Collection
Dim clc2 As Collection
Dim clc3 As Collection

Dim n1 As Long
Dim n2 As Long
Dim n3 As Long

    qtd = InputBox("Informe a quantidade de elementos")
    ReDim garcom(qtd)
    

    Set clc1 = New Collection
    Set clc2 = New Collection
    Set clc3 = New Collection
    Randomize Timer
        On Error Resume Next
        Do
            n1 = WorksheetFunction.RandBetween(1, qtd)
            clc1.Add n1, CStr(n1)
            
            
            n2 = WorksheetFunction.RandBetween(1, qtd)
            If n2 = n1 Then
                Do
                n2 = WorksheetFunction.RandBetween(1, qtd)
                Loop Until n2 <> n1
            End If
            clc2.Add n2, CStr(n2)
            
             n3 = WorksheetFunction.RandBetween(1, qtd)
            If n3 = n2 Then
                Do
                n3 = WorksheetFunction.RandBetween(1, qtd)
                Loop Until n3 <> n2
            End If
            clc3.Add n3, CStr(n3)
            
        Loop Until clc1.Count = qtd
            
            For n1 = 1 To qtd
            Cells(2, 3 + n1) = clc1(n1)
            Next n1
            
            For n2 = 1 To qtd
            Cells(3, 3 + n2) = clc2(n2)
            Next n2
            
            For n3 = 1 To qtd
            Cells(4, 3 + n3) = clc3(n3)
            Next n3
            
            
        On Error GoTo 0
    
End Sub

Re: Gerando Arranjos

Enviado: 14 Dez 2019 às 17:40
por Jimmy
Olá Tião,

Você está usando a coleção como se fosse um array, mas não funciona da mesma forma.

Supondo que o primeiro tri foi 1 2 3. Esses 3 valores entraram nas 3 coleções.

O segundo foi 1 3 2. O primeiro 1, ao ser colocado na coleção substituiu o primeiro pois o 1 é chave da coleção, e chave não se repete. Os outros 2 entrarão nas coleções respectivas.

As vezes as linhas têm tamanhos diferentes porque as coleções terão "tamanhos" diferentes.

Use um array, ou a própria planilha para armazenar os valores.

Se quiser te mando esse seu exemplo usando a própria planilha. Peloque entendi, são 3 linhas fixas. A quantidade solicitada é para definir a faixa de números. Só não entendi quantas colunas são.

Outra coisa: a sequencia 1 2 1 é permitida, apenas do 1 se repetir? Pelo seu critério seria porque só diz que deve ser diferente da anterior, e não de qualquer anterior gerada. É isso mesmo?

Se esta mensagem colabora para a solução do problema, peço que dê um Like, clicando no botão com o "positivo" existente acima e a direita de cada mensagem.

Jimmy San Juan

Re: Gerando Arranjos

Enviado: 15 Dez 2019 às 06:23
por Jimmy
Bom dia Tião,

Segue uma macro que não utiliza coleções. Armazena os valores diretamente na planilha. Para milhares de dados é mais rápido ir guardando os valores em array, e após terminada a geração passar para a planilha, mas para poucos dados praticamente não há diferença.

Como está aprendendo VBA, fiz coisas extras na macro, pra te mostrar outras funcionalidades.

A macro que atende os 2 critérios: número diferente do anterior, e diferente de todos os anteriores. Você escolhe acionando o botão correspondente.

Também fiz 2 formas de entrada de dados: via célula e via caixa de entrada de dados. Você escolhe alterando o IF dentro da macro: para "1 = 1" entrada de dados via caixa, e, para "1 = 2" entrada de dados via valor de célula.

Deixei também configurável a quantidade de linhas e colunas. Você digita os valores em células e a macro pega de lá.

Se tiver dúvida do funcionamento da macro, pode perguntar.

Se esta mensagem colabora para a solução do problema, peço que dê um Like, clicando no botão com o "positivo" existente acima e a direita de cada mensagem.

Jimmy San Juan

Gerando Arranjos

Enviado: 15 Dez 2019 às 12:48
por TiaoMecanico
Putz! Achei Genial. Só muda que eu estava tentando distribuir os arranjos em linhas, já vc distribuiu em colunas, mas é a funcionalidade que eu estava procurando. Achei muito bacana, fico muito agradecido. Agora vou estudar essa macro que vc me enviou, linha por linha pra entender certinho. Eu tenho suspeitas que vc escreveu essa macro hoje, durante a madrugada, enquanto passando o Filme da Elis Regina. HAHAHAHAHA.

Jimmy. Muito Obrigado pelo tempo e pelo ensinamento.