Всем здравствуйте! Помогите пожалуйста в решении следующей задачки. Не знаю правильно ли назвал тему. Проблем вот в чём. На форме есть ListBox, значения в который заносятся из таблицы согласно условию [vba]
Код
If Worksheets("Лист1").Cells(i, 2) <> "да" Then UserForm1.ListBox1.AddItem Worksheets("Лист1").Cells(i, 1) End If
[/vba] Далее значения из ListBoxа периодически необходимо удалять, для этого на форму добавил кнопку, по клику на которую выбранные значения из ListBoxа удаляются, а в таблице рядом со значени(ями)ем удалённым(и) из ListBoxа должно отмечаться "да". Вот с этим "должно" я бьюсь и всё ни как... Заранее спасибо за помощь.
Всем здравствуйте! Помогите пожалуйста в решении следующей задачки. Не знаю правильно ли назвал тему. Проблем вот в чём. На форме есть ListBox, значения в который заносятся из таблицы согласно условию [vba]
Код
If Worksheets("Лист1").Cells(i, 2) <> "да" Then UserForm1.ListBox1.AddItem Worksheets("Лист1").Cells(i, 1) End If
[/vba] Далее значения из ListBoxа периодически необходимо удалять, для этого на форму добавил кнопку, по клику на которую выбранные значения из ListBoxа удаляются, а в таблице рядом со значени(ями)ем удалённым(и) из ListBoxа должно отмечаться "да". Вот с этим "должно" я бьюсь и всё ни как... Заранее спасибо за помощь.Максим123
обратная связь не сохраняется, если только вы в коде предусмотрите массив, в котором будете хранить привязку номера строки и номер индекса добавленного элемента
обратная связь не сохраняется, если только вы в коде предусмотрите массив, в котором будете хранить привязку номера строки и номер индекса добавленного элементаK-SerJC
For j = UserForm1.ListBox1.ListCount - 1 To 0 Step -1 If UserForm1.ListBox1.Selected(j) = True Then Set Mycell = Worksheets("Ëèñò1").Columns("A:A").Find(What:=UserForm1.ListBox1.List(j), LookIn:=xlFormulas, _ LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, SearchFormat:=False) If Not Mycell Is Nothing Then Mycell.Offset(, 1).Value = "да" UserForm1.ListBox1.RemoveItem (j) End If
Next j
[/vba]
Максим123, [vba]
Код
Private Sub CommandButton1_Click()
Dim j As Variant
For j = UserForm1.ListBox1.ListCount - 1 To 0 Step -1 If UserForm1.ListBox1.Selected(j) = True Then Set Mycell = Worksheets("Ëèñò1").Columns("A:A").Find(What:=UserForm1.ListBox1.List(j), LookIn:=xlFormulas, _ LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, SearchFormat:=False) If Not Mycell Is Nothing Then Mycell.Offset(, 1).Value = "да" UserForm1.ListBox1.RemoveItem (j) End If
Если есть дубликаты, то можно предусмотреть продолжение поиска слежующего, если "да" уже стоит, но нужно ли - вам решать. В любом случае если будет такое то опрдеелить что это второй Сидоров, а не первый сложнее, хотя и можно. [vba]
Код
Private Sub CommandButton1_Click() Dim j As Variant For j = UserForm1.ListBox1.ListCount - 1 To 0 Step -1 If UserForm1.ListBox1.Selected(j) = True Then Set aftercell = Range("A1") For i = 0 To 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) If Not mycell Is Nothing Then Set aftercell = mycell If mycell.Offset(, 1).Value = "да" Then i = i - 1 End If End If Next i If Not mycell Is Nothing Then mycell.Offset(, 1).Value = "да" UserForm1.ListBox1.RemoveItem (j) End If Next j End Sub
[/vba]
K-SerJC,
Это верно.
Максим123,
Если есть дубликаты, то можно предусмотреть продолжение поиска слежующего, если "да" уже стоит, но нужно ли - вам решать. В любом случае если будет такое то опрдеелить что это второй Сидоров, а не первый сложнее, хотя и можно. [vba]
Код
Private Sub CommandButton1_Click() Dim j As Variant For j = UserForm1.ListBox1.ListCount - 1 To 0 Step -1 If UserForm1.ListBox1.Selected(j) = True Then Set aftercell = Range("A1") For i = 0 To 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) If Not mycell Is Nothing Then Set aftercell = mycell If mycell.Offset(, 1).Value = "да" Then i = i - 1 End If End If Next i If Not mycell Is Nothing Then mycell.Offset(, 1).Value = "да" UserForm1.ListBox1.RemoveItem (j) End If Next j End Sub
Возникла другая проблема, после переноса кода в основной документ выдал сообщение "переменная не определена " и выделяет первую объектную переменную aftercell. Проверил несколько раз, всё вроде правильно, ни чего не пойму. В чём может быть причина?
Возникла другая проблема, после переноса кода в основной документ выдал сообщение "переменная не определена " и выделяет первую объектную переменную aftercell. Проверил несколько раз, всё вроде правильно, ни чего не пойму. В чём может быть причина?Максим123
На самом деле я очень люблю использовать всяческие переменные в коде и на больших макросах у меня их количество запросто за сотню переваливает. Я сам-то в них не путаюсь, для меня мои названия понятны - привык за много лет, что, например, r0_ - номер первой строки диапазона, а r1_ - номер последней. А вот всю это кучу объявлять у меня просто терпения не хватает. Объявляю только то, что мне действительно нужно (типа As Range), чтобы потом автоподстановкой пользоваться при написании или при тормозах, но это реже, при тормозах я лучше постараюсь код оптимизировать. Я прекрасно понимаю, что это методически неверно, то так вот исторически сложилось. Да и память дисциплинирует
Все верно, не должно смущать. Объявлять типом Вариант хотя бы для того нужно, чтобы потом случайно дрогнувшей рукой не поставить вместо переменной j например jj. И долго искать потом в коде косяк. Но кто бы говорил, конечно. Я сам такой, о чем выше и написал уже.
Но тогда не только aftercell, но и остальную кучу переменных тоже объявить нужно
На самом деле я очень люблю использовать всяческие переменные в коде и на больших макросах у меня их количество запросто за сотню переваливает. Я сам-то в них не путаюсь, для меня мои названия понятны - привык за много лет, что, например, r0_ - номер первой строки диапазона, а r1_ - номер последней. А вот всю это кучу объявлять у меня просто терпения не хватает. Объявляю только то, что мне действительно нужно (типа As Range), чтобы потом автоподстановкой пользоваться при написании или при тормозах, но это реже, при тормозах я лучше постараюсь код оптимизировать. Я прекрасно понимаю, что это методически неверно, то так вот исторически сложилось. Да и память дисциплинирует
Все верно, не должно смущать. Объявлять типом Вариант хотя бы для того нужно, чтобы потом случайно дрогнувшей рукой не поставить вместо переменной j например jj. И долго искать потом в коде косяк. Но кто бы говорил, конечно. Я сам такой, о чем выше и написал уже._Boroda_
А вот всю это кучу объявлять у меня просто терпения не хватает.
Вот тут полностью солидарен, особенно когда короткий пример делается, а не полновесный продукт и время тратить не хочется, да и все что умещается на один скрин обозреть проще. Но с другой стороны, вырабатывается привычка и Alex_ST прав, к слову снимаю шляпу, с точки зрения чистоплотности чувствуется правильный подход.
А вот всю это кучу объявлять у меня просто терпения не хватает.
Вот тут полностью солидарен, особенно когда короткий пример делается, а не полновесный продукт и время тратить не хочется, да и все что умещается на один скрин обозреть проще. Но с другой стороны, вырабатывается привычка и Alex_ST прав, к слову снимаю шляпу, с точки зрения чистоплотности чувствуется правильный подход.