Предположим, что значение 18 и значение 4 находятся в одной строке, но значение 4 должно быть только 70% со значением 18 во всех строках моих данных. Как я могу исправить это и изменить только 30% значения 4 Случайно с любым значением для всех строк, имеющих значение 18? Смотрите картинку ниже:
1 ответ
Исходя из того, как я понимаю ваш вопрос, попробуйте этот код и подтвердите, работает ли он для вас.
В этом примере пример данных находится в B1:F23. 4 проверяются только в 3-м столбце.
Нажмите Alt+F11 для доступа к VBA Editor. Из меню Вставка вставить модуль. Дважды щелкните имя модуля в левой панели, чтобы открыть его редактор кода. Теперь поместите в него следующий код макроса.
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
Правильно установите свой диапазон в операторе Set MyRange = Range("B2:F23")
Правильно установите номер столбца в Const Mycol = 3
Сохраните файл как Macro Enabled Workbook и из рабочей таблицы нажмите ALT + F8, чтобы открыть диалоговое окно Macro Run. Запустите этот макрос Replace430().
Проверьте это дальше и подтвердите. Согласно вашим комментариям это предполагает, что 4 встречаются только в 3-м столбце выбранного диапазона. 4 в любом месте игнорируются в настоящее время.