Я работаю над проблемой уже несколько дней и почти достигла решения. В настоящее время я работаю над приложением 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 впереди? С чего бы это?
Спасибо!