Братцы, доброго времени суток! Похожее на нижеописанную операцию я уже сделал с вашей помощью несколько дней назад, НО между двумя листами одной книги. Это было для рабочего файла, для работы моей, а вот попробовал "для себя, для души" сделать такую же операцию подстановки данных, НО УЖЕ в userform - не получается. Как в том анекдоте, чую, что пол-литра, а сказать не могу.()) Подсобите в очередной раз.
В-общем, выдрал кусочек из файла, чтобы уложиться в ограничения по размеру/весу файла. Есть лист "Продажи", на листе умная таблица "Продажи_tb". Также есть форма "Sales", которую можно открыть, зайдя в окно vba-редактора. Есть "Модуль1" со всякими сварганенными мной макросами. Чего же душе моей хочется? Ага, при открытии формы в "красном" блоке в левом комбобоксе № счета cbx_NumVozv агрегируются номера счетов из таблицы "продажи_tb". После выбора в нем какого-либо счета в cbx_tovarVozv заливаются наименования товаров, входящих в этот счет. И ТУТ начинаются мои страдания.(( При выборе ПЕРВОГО товара в этом списке в ячейки формы подставляются требуемые данные, А ВОТ при выборе второго или любого другого последующего в списке товара ничего не происходит, т.е. нужные данные не подставляются. Меня, конечно же, терзают смутные сомнения относительно примененного метода FIND, но я пробовал и с FOR i , но то ли руки кривые (что близко к истине), то ли в данном случае нужен совсем другой подход. Друзья, подскажите, как решить вот эту задачку, чтобы подставлялись данные не только при выборе первой позиции во втором выпадающем списке, НО И при выборе любой позиции из этого списка. Надеюсь, смог объяснить суть своей проблемы.
Затык в следующем Для процедуры FillUpgradeVozv В этой строке
Код
Set Rng = .Columns(1).Find(what:=Sales.cbx_NumVozv, LookIn:=xlValues, LookAt:=xlWhole)
Вы находите Номер заказа и при нахождении строки с номером, переходите на 6 столбцов правее, для сравнения Описания товара в таблице с выбранным описанием в Форме
Код
If Rng.Offset(0, 6) = Sales.cbx_tovarVozv Then
но проблема в том, что метод .Find всегда возвращает ячейку с ПЕРВЫМ найденным значением номера и ваш Rng.Offset(0, 6)всегда равен Описанию товара, расположенному напротив первого Номера из всего списка номеров Вам поможет цикл по номерам со сравнением строк с описанием или метод .FindNext(по ссылке есть пример его использования)
Ваш код с .FindNext может выглядеть примерно так
Скрытый текст
Код
Dim firstAddress$
With Sheets("Продажи").Columns(1)
Set Rng = .Find(what:=Sales.cbx_NumVozv, LookIn:=xlValues, LookAt:=xlWhole)
If Not Rng Is Nothing Then
firstAddress = Rng.Address
Do
If Rng.Offset(0, 6) = Sales.cbx_tovarVozv Then
Set SalesListRow = SalesListObj.ListRows(Rng.Row - 1)
Sales.txb_order = SalesListRow.Range(1)
Sales.DTP_order = SalesListRow.Range(2)
Sales.cbx_status = "Возврат"
Sales.cbx_kategoriya = SalesListRow.Range(4)
Sales.cbx_group = SalesListRow.Range(5)
Sales.txb_article = SalesListRow.Range(6)
Sales.cbx_naimTovara = SalesListRow.Range(7)
Sales.txb_kolvo = SalesListRow.Range(8)
Sales.txb_price = CDbl(SalesListRow.Range(9))
Sales.txb_summa = SalesListRow.Range(10)
Sales.txb_skidka = SalesListRow.Range(22)
Sales.txb_itogo = SalesListRow.Range(23)
Exit Do
End If
Set Rng = .FindNext(Rng)
Loop While Not Rng Is Nothing And Rng.Address <> firstAddress
End If
End With