Всем здравствуйте! Помогите пожалуйста в решении следующей задачки. Не знаю правильно ли назвал тему. Проблем вот в чём. На форме есть ListBox, значения в который заносятся из таблицы согласно условию
If Worksheets("Лист1").Cells(i, 2) <> "да"Then
UserForm1.ListBox1.AddItem Worksheets("Лист1").Cells(i, 1) EndIf
Далее значения из ListBoxа периодически необходимо удалять, для этого на форму добавил кнопку, по клику на которую выбранные значения из ListBoxа удаляются, а в таблице рядом со значени(ями)ем удалённым(и) из ListBoxа должно отмечаться "да". Вот с этим "должно" я бьюсь и всё ни как... Заранее спасибо за помощь.
Всем здравствуйте! Помогите пожалуйста в решении следующей задачки. Не знаю правильно ли назвал тему. Проблем вот в чём. На форме есть ListBox, значения в который заносятся из таблицы согласно условию
If Worksheets("Лист1").Cells(i, 2) <> "да"Then
UserForm1.ListBox1.AddItem Worksheets("Лист1").Cells(i, 1) EndIf
Далее значения из ListBoxа периодически необходимо удалять, для этого на форму добавил кнопку, по клику на которую выбранные значения из ListBoxа удаляются, а в таблице рядом со значени(ями)ем удалённым(и) из ListBoxа должно отмечаться "да". Вот с этим "должно" я бьюсь и всё ни как... Заранее спасибо за помощь.Максим123
обратная связь не сохраняется, если только вы в коде предусмотрите массив, в котором будете хранить привязку номера строки и номер индекса добавленного элемента
обратная связь не сохраняется, если только вы в коде предусмотрите массив, в котором будете хранить привязку номера строки и номер индекса добавленного элементаK-SerJC
Если есть дубликаты, то можно предусмотреть продолжение поиска слежующего, если "да" уже стоит, но нужно ли - вам решать. В любом случае если будет такое то опрдеелить что это второй Сидоров, а не первый сложнее, хотя и можно.
PrivateSub CommandButton1_Click() Dim j AsVariant For j = UserForm1.ListBox1.ListCount - 1To0Step -1 If UserForm1.ListBox1.Selected(j) = TrueThen Set aftercell = Range("A1") For i = 0To j If UserForm1.ListBox1.List(i) = UserForm1.ListBox1.List(j) Then Set mycell = Nothing Set mycell = Worksheets("Лист1").Columns("A:A").Find(What:=UserForm1.ListBox1.List(j), After:=aftercell, LookIn:=xlFormulas, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, SearchFormat:=False) IfNot mycell IsNothingThen Set aftercell = mycell If mycell.Offset(, 1).Value = "да"Then i = i - 1 EndIf EndIf Next i IfNot mycell IsNothingThen mycell.Offset(, 1).Value = "да"
UserForm1.ListBox1.RemoveItem (j) EndIf Next j EndSub
K-SerJC,
Это верно.
Максим123,
Если есть дубликаты, то можно предусмотреть продолжение поиска слежующего, если "да" уже стоит, но нужно ли - вам решать. В любом случае если будет такое то опрдеелить что это второй Сидоров, а не первый сложнее, хотя и можно.
PrivateSub CommandButton1_Click() Dim j AsVariant For j = UserForm1.ListBox1.ListCount - 1To0Step -1 If UserForm1.ListBox1.Selected(j) = TrueThen Set aftercell = Range("A1") For i = 0To j If UserForm1.ListBox1.List(i) = UserForm1.ListBox1.List(j) Then Set mycell = Nothing Set mycell = Worksheets("Лист1").Columns("A:A").Find(What:=UserForm1.ListBox1.List(j), After:=aftercell, LookIn:=xlFormulas, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, SearchFormat:=False) IfNot mycell IsNothingThen Set aftercell = mycell If mycell.Offset(, 1).Value = "да"Then i = i - 1 EndIf EndIf Next i IfNot mycell IsNothingThen mycell.Offset(, 1).Value = "да"
UserForm1.ListBox1.RemoveItem (j) EndIf Next j EndSub
Возникла другая проблема, после переноса кода в основной документ выдал сообщение "переменная не определена " и выделяет первую объектную переменную aftercell. Проверил несколько раз, всё вроде правильно, ни чего не пойму. В чём может быть причина?
Возникла другая проблема, после переноса кода в основной документ выдал сообщение "переменная не определена " и выделяет первую объектную переменную aftercell. Проверил несколько раз, всё вроде правильно, ни чего не пойму. В чём может быть причина?Максим123
На самом деле я очень люблю использовать всяческие переменные в коде и на больших макросах у меня их количество запросто за сотню переваливает. Я сам-то в них не путаюсь, для меня мои названия понятны - привык за много лет, что, например, r0_ - номер первой строки диапазона, а r1_ - номер последней. А вот всю это кучу объявлять у меня просто терпения не хватает. Объявляю только то, что мне действительно нужно (типа As Range), чтобы потом автоподстановкой пользоваться при написании или при тормозах, но это реже, при тормозах я лучше постараюсь код оптимизировать. Я прекрасно понимаю, что это методически неверно, то так вот исторически сложилось. Да и память дисциплинирует
Все верно, не должно смущать. Объявлять типом Вариант хотя бы для того нужно, чтобы потом случайно дрогнувшей рукой не поставить вместо переменной j например jj. И долго искать потом в коде косяк. Но кто бы говорил, конечно. Я сам такой, о чем выше и написал уже.
Но тогда не только aftercell, но и остальную кучу переменных тоже объявить нужно
На самом деле я очень люблю использовать всяческие переменные в коде и на больших макросах у меня их количество запросто за сотню переваливает. Я сам-то в них не путаюсь, для меня мои названия понятны - привык за много лет, что, например, r0_ - номер первой строки диапазона, а r1_ - номер последней. А вот всю это кучу объявлять у меня просто терпения не хватает. Объявляю только то, что мне действительно нужно (типа As Range), чтобы потом автоподстановкой пользоваться при написании или при тормозах, но это реже, при тормозах я лучше постараюсь код оптимизировать. Я прекрасно понимаю, что это методически неверно, то так вот исторически сложилось. Да и память дисциплинирует
Все верно, не должно смущать. Объявлять типом Вариант хотя бы для того нужно, чтобы потом случайно дрогнувшей рукой не поставить вместо переменной j например jj. И долго искать потом в коде косяк. Но кто бы говорил, конечно. Я сам такой, о чем выше и написал уже._Boroda_
А вот всю это кучу объявлять у меня просто терпения не хватает.
Вот тут полностью солидарен, особенно когда короткий пример делается, а не полновесный продукт и время тратить не хочется, да и все что умещается на один скрин обозреть проще. Но с другой стороны, вырабатывается привычка и Alex_ST прав, к слову снимаю шляпу, с точки зрения чистоплотности чувствуется правильный подход.
А вот всю это кучу объявлять у меня просто терпения не хватает.
Вот тут полностью солидарен, особенно когда короткий пример делается, а не полновесный продукт и время тратить не хочется, да и все что умещается на один скрин обозреть проще. Но с другой стороны, вырабатывается привычка и Alex_ST прав, к слову снимаю шляпу, с точки зрения чистоплотности чувствуется правильный подход.