информация из диапазона с использованием наилучшей практики цикла для поля со списком - PullRequest
0 голосов
/ 24 мая 2019

Я хотел взять информацию из диапазона и добавить ее в форму пользователя в поле со списком.

Код ниже сделал это для меня с успехом, но в поле со списком я установил диапазон из 40 строк,поэтому у него есть мои значения, а затем после моего последнего значения у него есть пустое пространство около 20 строк, которое я помещаю туда на случай, если пользователь добавит больше центров затрат.

Как комбинированный список может выбрать точные строки и затем распознать, если новый МВЗ будет добавлен позже?

«Правила» - это таблица, из которой я получаю информацию, «Центры затрат» - это имя диапазона, построенного на этом листе и имеющего 40 строк.

Что лучше40 центров затрат добавляются, что мне никогда не придется возвращаться в код, чтобы изменить диапазон?

Private Sub UserForm_Initialize()

    Worksheets("Rules").Activate

    Dim rangeCount As Integer
    Dim Range As Range
    Dim i As Integer

    Set Range = ActiveSheet.Range("A2")
    rangeCount = ActiveSheet.Range("CostCentres").Count
    i = 2

    Do While i <= rangeCount

         Me.CostCentreCMBox.AddItem Cells(i, "a").Text

         i = i + 1
    Loop

End Sub

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Спасибо, тигр,

отлично сработало,

однако я столкнулся с одной проблемой, код, который вы дали, отлично работал для моего центра затрат,

Затем я в той же пользовательской форме создал комбинированный список Vendor, который снова отлично работал с тем же кодом, просто меняя переменные на правильные. В поле со списком у меня есть все поставщики, которые мне нужны, поэтому он работает, однако полоса прокрутки в этом поле со списком не работает. Чтобы прокрутить поставщиков вниз, я должен использовать клавиши со стрелками или щелкнуть внутри фактического бита полосы прокрутки и переместить полосу вниз таким образом, вместо того, чтобы щелкать и удерживать фактическую полосу и двигаться вниз, если вы понимаете.

Вы сталкивались с этим раньше? есть ли причина для этого?

С уважением, Ross

0 голосов
/ 24 мая 2019

Для получения лучших практик вы должны избегать использования выбора / активации , использовать четко определенные и именованные переменные, не использовать магические числа (которые в основном просто жестко закодированызначений, поэтому избегайте жесткого кодирования, когда это возможно), и комментируйте свой код так, чтобы, когда вы (или кто-либо другой) снова смотрели на него после того, как забыли о его существовании, код можно легко понять и отслеживать.Еще лучше, если используемые переменные упрощают отслеживание самого кода, так что комментарии не требуются так часто, чтобы легко следовать за ними.Можно определенно утверждать, что у меня слишком много комментариев в этом коде.

Есть много способов получить последнюю заполненную ячейку в столбце, но наиболее рекомендуемый метод - использовать Range.End(xlup), как показано здесь:

Private Sub UserForm_Initialize()

    Dim oCMBCostCentres As ComboBox
    Dim wsRules As Worksheet
    Dim sCostCentresCol As String
    Dim lDataStartRow As Long

    Set oCMBCostCentres = Me.CostCentreCMBox

    'Adjust these as needed
    Set wsRules = ThisWorkbook.Worksheets("Rules")  'This is the worksheet where your Cost Centres list is stored
    sCostCentresCol = "A"   'This is the column where the Cost Centres list is stored
    lDataStartRow = 2       'This is the row where the Cost Centres list begins (actual data, not the header row)

    'Using the defined variables, work with the Cost Centres list
    With wsRules.Range(wsRules.Cells(lDataStartRow, sCostCentresCol), wsRules.Cells(wsRules.Rows.Count, sCostCentresCol).End(xlUp))
        'Verify it actually has data in it
        If .Row >= lDataStartRow Then
            'Data found, check if it only contains a single cell or not
            Select Case .Cells.Count = 1
                Case True:  oCMBCostCentres.AddItem .Value   'Only a single cell, need to use the .AddItem method
                Case Else:  oCMBCostCentres.List = .Value    'More than one cell, can use the .List method
            End Select
        End If
    End With

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...