#excel #vba #combobox #activex
#excel #vba #выпадающий список #activex
Вопрос:
Я создаю форму с 3 выпадающими списками, которые пользователь может заполнить. Когда пользователь нажимает кнопку «Новая строка», форма должна создать новую строку непосредственно под самой последней строкой с 3 пустыми выпадающими списками.
ПРОБЛЕМА: иногда, когда пользователь выбирает одно из полей не по порядку (например, они нажимают combobox 2 перед combobox1), а затем нажимают кнопку «новая строка», вторые два поля копируются правильно, но первый выпадающий список не копируется в правильную строку. Он всегда копирует в верхнюю левую строку таблицы. (Смотрите визуальный)
Исправить:
Неверно:
Вот мой код:
'Declare variables
Dim curIndirectRow As Integer
'Search for keyword in column B; search direction: top to bottom
'Set findTable to the coordinates of matching word
Set findTable = ThisWorkbook.Sheets("Main").Range("B:B").Find(What:="Indirect Damages", LookIn:=xlValues, LookAt:=xlWhole, searchdirection:=xlNext)
'If the line immediately after the found word is blank (meaning it's the first row)
If Range(findTable.Address).Offset(1, 0) = "" Then
'set variable to be the first row
curIndirectRow = Range(findTable.Address).Row
Else
'set variable to be the last row in the table
curIndirectRow = ThisWorkbook.Sheets("Main").Range(findTable.Address).End(xlDown).Row
End If
'Add one blank row underneath your last row
Range("$B$" amp; curIndirectRow).Offset(1).EntireRow.Insert Shift:=xlShiftDown
'Copy the row above it into your newly inserted row(no buttons included)
Sheets("Main").Range("B" amp; CStr(findTable.Row) amp; ":F" amp; CStr(findTable.Row)).Copy Destination:=Sheets("Main").Range("B" amp; CStr(curIndirectRow 1) amp; ":F" amp; CStr(curIndirectRow 1))
'Clear the values of the Approver cell
Sheets("Main").Range("$F$" amp; CStr(curIndirectRow 1)).Value = ""
'Select the first box ("Type") and copy
Sheets("Main").Shapes.Range(Array("Combobox8")).Select
Selection.Copy
'Paste the first box into your new row's C column
Sheets("Main").Range("C" amp; CStr(curIndirectRow 1)).PasteSpecial
'Populate the drop down list
Sheets("Main").Shapes("ComboBox" amp; CStr(Sheets("Main").Shapes.Count - 63)).OLEFormat.Object.ListFillRange = "=Lists!D2:D6"
'Set the default value to blank
Sheets("Main").OLEObjects("ComboBox" amp; CStr(Sheets("Main").Shapes.Count - 63)).Object.Value = ""
Код для первого поля повторяется для второго и третьего полей. Обратите внимание, что я вычитаю 63 из количества фигур на листе, потому что есть 63 других фигуры (флажки и т.д.), Которые Не являются выпадающими списками.
Комментарии:
1. Вы проверили свойства фигур Top, Left, TopLeftCell?
2. Другой подход — как насчет отключения combobox2 и 3 до тех пор, пока не будет выбран параметр для combobox1?
3. @dwirony это интересная идея, которую я мог бы использовать, но как мне программно отключить другие после создания новой строки?