Come trovare e sostituire in modo casuale con rate di due valori multipli nella stessa riga di Excel?


0

Supponiamo che il valore 18 e il valore 4 siano nella stessa riga, ma il valore 4 deve essere solo il 70% con il valore 18 in tutte le righe dei miei dati. Come posso correggerlo e cambiare solo il 30% del valore 4 in modo casuale con qualsiasi valore per tutte le righe che hanno valore 18? Vedi l'immagine qui sotto:

Esempio della mia domanda


Stai osservando il 30% per riga o il conteggio complessivo del 30% di 4 dove la prima colonna è 18?
patkim,

Sì, conteggio complessivo del 30% di 4 in cui la prima colonna è 18.
Andray Jamil Almakhadmeh,

Voglio dire che i miei dati hanno 120 righe consistono in 18 con 4, voglio sostituire casualmente solo il 30% di 4 da queste righe con qualsiasi valore dopo la sostituzione I miei dati devono avere 84 righe di cui 18 con 4.
Andray Jamil Almakhadmeh,

Quindi è il 30% del conteggio delle righe (dove potrebbe esserci almeno un 4 contro 18) non il conteggio dei 4?
patkim,

Sì, naturalmente .
Andray Jamil Almakhadmeh,

Risposte:


0

In base a come capisco la tua domanda, prova questo codice e conferma se funziona per te.

In questo esempio i dati di esempio sono in B1: F23. I 4 sono controllati solo nella terza colonna.

Premi Alt+ F11per accedere a VBA Editor. Dal menu Inserisci inserire un modulo. Fare doppio clic sul nome del modulo nel riquadro sinistro per accedere al suo editor di codice. Ora inserisci il seguente codice macro in esso.

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

Imposta correttamente l'intervallo in corrispondenza dell'istruzione Set MyRange = Range("B2:F23") Imposta il numero di colonna correttamente inConst Mycol = 3

Salvare il file come cartella di lavoro abilitata per le macro e dal foglio di lavoro premere ALT + F8 per accedere alla finestra di dialogo Esegui macro. Esegui questa macro Replace430 ().

Provalo ulteriormente e conferma. Secondo i tuoi commenti, questo presuppone che i 4 siano presenti solo nella terza colonna dell'intervallo selezionato. 4 altrove vengono ignorati per il momento.

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.