Почему MyTable.Range.Rows.Count возвращает неверное значение в Excel VBA - PullRequest
0 голосов
/ 17 марта 2020

Я работаю над проблемой уже несколько дней и почти достигла решения. В настоящее время я работаю над приложением Excel, в котором у меня есть макрос, управляемый нажатием кнопки, который сбрасывает числовые значения в определенных ячейках таблицы.

В этой таблице 3 столбца; «Количество установлено (n)», «Требуемое количество (м)» и «Конфигурация замка».

Что мне нужно сделать, так это то, что при нажатии кнопки числовые значения для каждой строки в пределах «Количество Подходящий столбец (n) "сбрасывается, чтобы соответствовать значениям, отображаемым в столбце« Необходимое количество (м) »той же строки.

Однако, если значение ячейки в столбце« Конфигурация замка »этой строки установлено значение «заблокировано», я хочу, чтобы значение «Количество соответствовало (n)» оставалось неизменным после нажатия кнопки.

Надеюсь, это имеет смысл! Вот моя текущая попытка закодировать это:

Dim x As Long

    'Set reference to your table.  Have hard-coded the sheet name and table name in.
    Dim MyTable As ListObject
    Set MyTable = Worksheets("System").ListObjects("Table_System")

    'These will be the numerical index numbers of the columns in your table.
    'This assumes your "Locked" column is in the table and has the header "Locked".
    Dim Required As Long, Fitted As Long, Locked As Long
    Required = MyTable.ListColumns("Quantity Required (m)").Index
    Fitted = MyTable.ListColumns("Quantity Fitted (n)").Index
    Locked = MyTable.ListColumns("Lock Configuration").Index

    'Look at each row in the table.  Am using `x` rather than `Each Cell`
    'as the row number of the cell may differ from the row location in the table
    'e.g. If your table starts on row 2, then first row after the header is row 3 - row 3 as Cell, but row 1 in table.
    For x = 1 To MyTable.Range.Rows.Count
        'If Locked column doesn't say "Locked" then copy value from
        'Fitted to Required columns, otherwise do nothing.
        If MyTable.DataBodyRange.Cells(x, Locked) <> "Locked" Then
            MyTable.DataBodyRange.Cells(x, Fitted) = MyTable.DataBodyRange.Cells(x, Required)
        Else
            'Do Nothing.
            'The ELSE and comment aren't really needed - just here to show nothing happens.
        End If
    Next x

End Sub

Это достигает цели, однако код ломается из-за неправильного количества строк в таблице. В моей таблице 3 строки, и, введя формулу непосредственно в таблицу Excel =Rows(Table_System), возвращается значение 3.

Однако, в моем коде я могу видеть, объявив новую переменную Dim y As Long и установив его так, чтобы y = MyTable.Range.Rows.Count возвращало значение y равным 5.

Аналогично, если я увеличил строки в моей таблице на 1, формула excel обновит свое решение до 4. Однако у значения в моем коде теперь отображается 6. Это всегда +2 впереди? С чего бы это?

Спасибо!

1 Ответ

2 голосов
/ 17 марта 2020
MyTable.Range

включает строку заголовка столбца и любую строку нижнего колонтитула (например, итоги), которую вы можете иметь

MyTable.DataBodyRange

включает только строки данных. Так что это должно работать:

For x = 1 To MyTable.DataBodyRange.Rows.Count
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...