Notifications
Clear all

Definir número de linhas (Variável)

7 Posts
4 Usuários
0 Reactions
1,193 Visualizações
(@souzar)
Posts: 0
New Member
Topic starter
 

Pessoal,

Sou novo no forúm e estou com uma dúvida que deve ser bem simples para muitos de vocês.
Estou criando uma planilha que precisa selecionar uma amostra aleatório de 25 valores, em uma base que muda todo mês.
Consegui, com ajuda do google e outros foruns, montar uma macrinho para gerar números aleatórios e linkalos com texto.
Ótimo!
O problema é que tenho sempre que definir o número de linhas que minha base tem...
queria que a macro calcula-se isso =/
isso é possível?

Dim i                           As Integer
Dim j                           As Integer
Dim bRandomOk                   As Boolean
Dim valor_aleatorio             As Integer
Dim valor_maior                 As Integer
Dim total_numeros_gerados       As Integer
Dim total_numeros_para_gerar    As Integer
Dim iControleGerar              As Integer
Dim iColunaCelula               As Integer


    valor_maior = 60                   'Informa maior número a ser gerado ------- [b]ESSE CARA DEVERIA SER CALCULADO SOZINHO - Se for maior que 60, deveria aparecer o total. Se for menor que 25, por exemplo, 15, deveria aparecer 15 e alterar a linha abaixo, já que não haveria 25 amostras e sim 15!!![/b]
    [b]total_numeros_para_gerar = 25      'Informe a quantidade de números aleatórios que deseja gerar[/b]
    total_numeros_gerados = 0
    iLinhaCelulaInicial = 3            'Informe a linha da primeira célula que será escrito o número
    iColunaCelula = 14                 'Informe a coluna. Exemplo: Coluna B = 2
    iControleGerar = total_numeros_para_gerar + iLinhaCelulaInicial - 1

    'Gera quantos números forem indicados na variável 'total_numeros_gerados'
    For i = iLinhaCelulaInicial To iControleGerar
        total_numeros_gerados = total_numeros_gerados + 1

        'Fica executando a geração de um novo número enquanto houver duplicidade
        Do
            'Utilize a condição abaixo para verificar se ainda existem números possíveis a serem gerados
            'Porque se i for maior que o valor limite, significa que todos os números já saíram. Então, sai do loop
            If valor_maior < total_numeros_gerados Then
                valor_aleatorio = 0
                bRandomOk = True
                Exit Do
            End If

            'Gera um novo número
            Randomize   'Sempre utilize esta função antes de chamar Rnd
            valor_aleatorio = Int((valor_maior * Rnd) + 1)
            bRandomOk = True

            'Verifica se já saiu este número
            For j = iLinhaCelulaInicial To i
                If Cells(j, iColunaCelula).Value = valor_aleatorio Then
                    bRandomOk = False
                    Exit For
                End If
            Next j

        Loop While bRandomOk = False

        'Escreve o número na célula
        Cells(i, iColunaCelula).Value = valor_aleatorio
    Next i

   
    'Teste para ver se números foram gerados corretamente sem repetição
    
    Range("M3").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(COUNTIF(R3C14:R30C14,RC[1])>1,""REPETIDO"",""NÃO REPETIDO"")"


    'Fórmulas 

    Range("O3").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(RC14,C1:C6,3,0)"
    Range("P3").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(RC14,C1:C6,2,0)"
    Range("Q3").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(RC14,C1:C6,6,0)"
    Range("M3").Select

    Selection.AutoFill Destination:=Range("M3:M27")             -[b]Aqui deveria colocar autofill do primeiro para o lastrow, mas nao ta rolando[/b]
    Range("M3:M27").Select
    Range("O3:Q3").Select
    Selection.AutoFill Destination:=Range("O3:Q27")             -[b]Aqui deveria colocar autofill do primeiro para o lastrow, mas nao ta rolando[/b] 
    Range("O3:Q27").Selec

t

Bom, Obrigado pela força!

 
Postado : 24/08/2016 12:44 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Não sei quanto aos demais, mas não entendi.

 
Postado : 24/08/2016 12:58 pm
(@brunoxro)
Posts: 0
New Member
 

Boa tarde souzar,

Como está colocados esses dados, em linhas, colunas, ou linhasXcolunas?

Se por exemplo, se os dados estiverem na coluna A e terminam na linha 60, então você pode usar:

valor_maior =range("A1048576").end(xlup).row

valor_maior vai receber o valor de 60 (última linha).

Disponibilize o arquivo, com alguns valores (não precisa ser os originais), assim fica mais fácil ajudar.

att,

 
Postado : 24/08/2016 1:13 pm
(@souzar)
Posts: 0
New Member
Topic starter
 

Bom, me desculpem por não ter explicado melhor.

Eu tenho uma base com algumas dezenas de colunas (todo mês recebo o mesmo número de colunas) e, nesse mês, 800 linhas (cade mês tenho mais ou menos linhas, mês passado foram 600).

Pego essa base, e faço alguns filtros (pela macro) e só sobram 6 colunas (A:F) (sempre sobrará 6 colunas) e, nesse mês, sobraram 165 linhas.

Insiro uma coluna (A) para númerar as linhas de 1 até a última (60 nesse mês).

Uso esses números para que a macro procure números aleatórios e os copie e cole em outra coluna. Lembrando que preciso de 25 amostras.

Como podem ver abaixo, não sei calcular o VALOR_MAIOR. Esse campo é o TOTAL DE LINHAS que sobraram nesse mês.
Preciso que esse número seja calculado automaticamente, pq toda vez tenho que alterá-lo manualmente (Claro, quando outra pessoa usa a planilha = dá ruim rs)

Se, em algum mês, eu tiver MENOS LINHAS QUE DO AS 25 AMOSTRAS, o campo TOTAL_NUMEROS_PARA_GERAR deverá ser igual ao número de linhas.
ou seja:
Se VALOR_MAIOR for igual ou MAIOR que 25, TOTAL_NUMEROS_PARA_GERAR tem que ser 25.
Se VALOR_MAIOR for MENOR que 25, TOTAL_NUMEROS_PARA_GERAR tem que ser IGUAL ao número de VALOR_MAIOR.

valor_maior = 60 'Informa maior número a ser gerado
total_numeros_para_gerar = 25 'Informe a quantidade de números aleatórios que deseja gerar

Assim que possível, posto a planilha.

Muito obrigado!

 
Postado : 25/08/2016 7:34 am
(@brunoxro)
Posts: 0
New Member
 

Boa noite souzar,

Deixa ver se eu entendi, você recebe uma tabela com diversos dados cada mês, realiza alguns filtros e no fim adiciona uma coluna (A) e numera começando da linha 1 até o final da linha dos dados (60 no caso especifico). Depois sorteia aleatoriamente 25 linhas (no caso) entre a 1 ate o final dos dados (60). E por fim copia as linhas sorteadas em um outro lugar.

Em anexo postei um código que talvez você possa adaptar para seu caso.
A macro realiza um sorteio das linhas da coluna A da planilha1 e copia para a planilha2. Não importa se é 5 ou 100 linhas, e você escolhe a quantidade que vai sortear através do InputBox. Na planilha coloquei apenas 29 linhas, você pode colocar mais linhas para testar.

att,

 
Postado : 26/08/2016 4:03 pm
(@mprudencio)
Posts: 0
New Member
 

Faça o seguinte:

Declare uma variavel chamada UltimaLinha

Dim UltimaLinha as long

Apos essa linha no seu codigo

Range("M3").Select

Apague o seu codigo e cole o abaixo


    UltimaLinha = Range("N" & Rows.Count).End(xlUp).Row

    Selection.AutoFill Destination:=Range("M3:M" & UltimaLinha)           'Aqui deveria colocar autofill do primeiro para o lastrow, mas nao ta rolando[/b]
    
    Range("O3:Q3").Select
    Selection.AutoFill Destination:=Range("O3:Q" & UltimaLinha)            'Aqui deveria colocar autofill do primeiro para o lastrow, mas nao ta rolando[/b]

 
Postado : 27/08/2016 9:17 am
(@souzar)
Posts: 0
New Member
Topic starter
 

MPrudencio

Cara, valeu!

Me salvou!

 
Postado : 30/08/2016 7:12 am