Предположим, что значение 18 и значение 4 находятся в одной строке, но значение 4 должно быть только 70% со значением 18 во всех строках моих данных. Как я могу исправить это и изменить только 30% значения 4 Случайно с любым значением для всех строк, имеющих значение 18? Смотрите картинку ниже:

Образец моего вопроса

1 ответ1

0

Исходя из того, как я понимаю ваш вопрос, попробуйте этот код и подтвердите, работает ли он для вас.

В этом примере пример данных находится в 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 в любом месте игнорируются в настоящее время.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .