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 TiaoMecanico
#51129
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
Avatar do usuário
Por Jimmy
Avatar
#51130
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
Avatar do usuário
Por Jimmy
Avatar
#51139
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
Você não está autorizado a ver ou baixar esse anexo.
Por TiaoMecanico
#51147
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.
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