Como encontrar e substituir aleatoriamente com taxa de dois valores múltiplos na mesma linha pelo excel?

0

Suponha que o valor 18 e o valor 4 estejam na mesma linha, mas o valor 4 deve ser apenas 70% com o valor 18 em todas as linhas dos meus dados. Como posso corrigir isso e alterar apenas 30% do valor 4 Aleatoriamente com qualquer valor para todas as linhas que tenham valor 18? Veja a imagem abaixo:

    
por Andray Jamil Almakhadmeh 20.11.2017 / 09:18

1 resposta

0

Com base em como entendi sua pergunta, experimente este código e confirme se isso funciona para você.

Neste exemplo, os dados de amostra estão em B1: F23. Os 4's são verificados apenas na 3ª coluna.

Pressione Alt + F11 para acessar o VBA Editor. No menu Inserir, insira um módulo. Clique duas vezes no nome do módulo no painel esquerdo para acessar o Editor de código. Agora coloque o seguinte código de macro nele.

Sub Replace430()

Dim MyRange As Range
Dim RowCount As Long
Dim ColCount As Integer
Dim MyArray() As Variant

Dim i, j, k, percent30 As Long
Dim Count4 As Long
Const Replaced = 0   'Set Replaced Value
Const found = 18     'Set Find Value
Const Mycol = 3      'Correctly set the Column Number of Column in Range where 4 is to be checked
Set MyRange = Range("B2:F23")

RowCount = MyRange.Rows.Count
ColCount = MyRange.Columns.Count
'Get number of 4's againts 18
For i = 1 To RowCount
    If MyRange.Columns(1).Cells(i) = found Then
        For j = Mycol To Mycol
            If MyRange.Columns(j).Cells(i) = 4 Then
               Count4 = Count4 + 1
            End If
        Next j
    End If

Next i

ReDim MyArray(Count4 - 1, 2)
k = 0
For i = 1 To RowCount
    If MyRange.Columns(1).Cells(i) = found Then
        For j = Mycol To Mycol
            If MyRange.Columns(j).Cells(i) = 4 Then
               MyArray(k, 1) = i
               MyArray(k, 2) = j
               k = k + 1
            End If
        Next j
    End If

Next i

percent30 = 0.3 * Count4

Dim shufflearray()
ReDim shufflearray(Count4 - 1)
For i = 0 To Count4 - 1
    shufflearray(i) = i
Next i

'Shuffle the shufflearray() below


    Dim N As Long
    Dim Temp As Variant


    Randomize
    For N = LBound(shufflearray) To UBound(shufflearray)
        j = CLng(((UBound(shufflearray) - N) * Rnd) + N)

        If N <> j Then
            Temp = shufflearray(N)
            shufflearray(N) = shufflearray(j)
            shufflearray(j) = Temp
        End If
    Next N

'Use randomised values from shufflearray as array subscript to replace only 30% of 4's
For i = 0 To percent30 - 1
    MyRange.Columns(MyArray(shufflearray(i), 2)).Cells(MyArray(shufflearray(i), 1)).Value = Replaced
Next i


End Sub

Defina o seu intervalo corretamente na declaração Set MyRange = Range("B2:F23") Defina o número da coluna corretamente em Const Mycol = 3

Salve o arquivo como Pasta de trabalho habilitada para macro e, na planilha, pressione ALT + F8 para acessar a caixa de diálogo Executar macro. Execute esta macro Replace430 ().

Teste mais e confirme. De acordo com seus comentários, isso pressupõe que os 4s ocorram apenas na terceira coluna do intervalo selecionado. 4 em qualquer outro lugar são ignorados por enquanto.

    
por 20.11.2017 / 10:37