Как сгенерировать диапазоны случайных значений для столбцов x и y строк, которые суммируют до заданных значений c для строк и столбцов в EXCEL 2007 - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь динамически генерировать случайные значения от 0 до 5 в 3 отдельных столбцах и меняющемся количестве строк. Значения должны суммировать до 5 в каждой строке и заданное значение c в столбце. Сумма столбца отличается в каждом столбце.

Мой лист вычисляет необходимое значение для каждого из 3 столбцов и необходимое количество строк.

У меня есть средние навыки с формулами нет с VBA, но интересно учиться.

trying to achieve

1 Ответ

0 голосов
/ 11 марта 2020

Объяснение

В следующем коде используется число, найденное в столбце B, и вычисляется случайное число с циклическим изменением до тех пор, пока не будет найдена последняя строка в столбце B. Ось полностью отформатирована макросом. Единственное, что требуется для запуска этого макроса, - это значения в столбце B. Код был тщательно прокомментирован для дальнейшего объяснения.

Шаги по включению макроса в рабочую книгу

  • Шаг 1: Откройте VBA (горячая клавиша в Excel: alt-F11)
  • Шаг 2:

    • a) Если у вас открыто более одного листа, перейдите к нужному листу. Имена перечислены в меню слева.

      enter image description here

    • b) Поскольку этот код определяет лист (Dim ws As Worksheet: Set ws = wb.Worksheets("Sheet1")) Вы можете скопировать / вставить этот код либо в рабочую таблицу, в которой он будет выполняться (в данном примере это будет Sheet1), Thisworkbook, либо добавить его в модуль (Module1 в рисунок). Не забудьте дать Sub имя лучше, чем "test":)

Шаги по созданию кнопки

  • Шаг 1. Если в вашем Excel нет возможности создать кнопку из строки заголовка, выполните следующие действия, иначе перейдите к шагу 2.

    • a) Нажмите раскрывающийся список в строке заголовка enter image description here

    • b) Нажмите «Дополнительные команды ...»

    • c) Нажмите «Выберите команды из:» и выберите «Вкладка разработчика»
    • d) Нажмите «Режим разработки», затем нажмите «Добавить >>». Режим дизайна позволит вам нажать кнопку, не активируя макрос. Эта опция теперь будет отображаться в строке заголовка. enter image description here
    • e) Нажмите «Вставить элементы управления», затем нажмите «Добавить >>». Вставить элементы управления будет возможность создать кнопку. Эта опция теперь будет отображаться в строке заголовка. enter image description here
  • Шаг 2:

    • a) Нажмите на значок «Вставить элементы управления» в строке заголовка.
    • b) Нажмите «Кнопка (Управление формой)» (опция слева вверху).

      enter image description here

    • c) Курсор мыши теперь будет перекрестием, когда вы наводите курсор мыши на ячейки в рабочей книге. Нажмите и перетащите, чтобы создать кнопку.

    • d) Вам будет автоматически предложено выбрать макрос для назначения кнопке. Выберите макрос, который вы только что скопировали / вставили.

Шаг 3: Нажмите кнопку / наслаждайтесь макросом.


Код (проверено)

Sub test()
    ' dim your variables. this tells vba what type of variable it is working with
    Dim lRow As Long
    ' defining wb is easier than typing out ThisWorkbook everytime
    Dim wb As Workbook: Set wb = ThisWorkbook
    ' defining ws is easier than typing out Worksheets("Sheet1") everytime
    Dim ws As Worksheet: Set ws = wb.Worksheets("Sheet1")
    ' find the last row in column b (2) in the above defined ws
    lRow = ws.Cells(ws.Rows.Count, 2).End(xlUp).Row

    ' loop through rows 3 to last row
    For i = 3 To lRow
        ' generate a random number between 0 and the row contents of column B (5)
        ws.Cells(i, 3).Value = Int(Rnd() * (ws.Cells(i, 2).Value + 1))
        ' generate a random number between 0 and the difference between column B and colum C
        ws.Cells(i, 4).Value = Int(Rnd() * (ws.Cells(i, 2).Value - ws.Cells(i, 3).Value))
        ' subtract the difference between column B and the sum of column C and column D
        ws.Cells(i, 5).Value = ws.Cells(i, 2).Value - (ws.Cells(i, 3).Value + ws.Cells(i, 4).Value)
    Next i

    ' sum column C (column 3) and place the value in C2
    ws.Cells(2, 3).Value = Application.WorksheetFunction.Sum(Range(Cells(3, 3), Cells(lRow, 3)))
    ' sum column D (column 4) and place the value in D2
    ws.Cells(2, 4).Value = Application.WorksheetFunction.Sum(Range(Cells(3, 4), Cells(lRow, 4)))
    ' sum column E (column 5) and place the value in E2
    ws.Cells(2, 5).Value = Application.WorksheetFunction.Sum(Range(Cells(3, 5), Cells(lRow, 5)))

    ' format from A3 to the last row in column A - cell alignment / merge cells / value
    With ws.Range(Cells(3, 1), Cells(lRow, 1))
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = True
        .Value = "row sum"
    End With

    ' format from C1 to E1 - cell alignment / merge cells / value
    With ws.Range(Cells(1, 3), Cells(1, 5))
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = True
        .Value = "column sum"
    End With

    ' format from B3 to the last row in column B - color formatting
    With ws.Range(Cells(3, 2), Cells(lRow, 2)).Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 5296274
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With

    ' format from C2 to E2 - color formatting
    With ws.Range(Cells(2, 3), Cells(2, 5)).Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 5296274
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...