Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2015, 05:39   #1
andreptobts
 
Регистрация: 05.04.2014
Сообщений: 5
По умолчанию значение списка Combobox из динамического диапозона листа эксель

Всем добрый день!
Имеется Combobox список которого черпается из динамического диапозона листа эксель. Содержимое динамического диапозона регулируется при помощи Combobox и двух CommandButton "Удалить" и "Добавить" (код ниже)
При удалении последней строки содержащей значение выскакивает ошибка "Run-time error 1004:
mehtod Range of object Global failed
т.к. VBA не может найти по существу исчезнувший диапозон
Вопрос:
1. Как в моем коде (добавить или что-то убавить) можно избежать данной ошибки
2. Можно ли через переменную сделать ссылку на диапозон и уже в коде перебора диапозона прописывать саму переменную
3. Можно ли часть кода где определяются граници диапозона вынести в отдельный модуль и отрабатывать через вызов модуля.

Private Sub Добавить_Click() '
Dim b As Range
Dim x As Variant
Dim y As Variant
For Each b In [Диапозон1] ' перебираем диапозон на листе
If b.Value = Combobox1.Text Then
MsgBox Combobox1.Text & " уже есть всписке"
Exit Sub
Else
End If
Next
' Определяем граници дипозона вставляем новое значение и сортируем
x = Range("Диапозон1").Column
y = Range("Диапозон1").CurrentRegion.Ro ws.Count + 1
Sheets("Лист1").Cells(y, x).Value = Combobox1.Text
ActiveWorkbook.Worksheets("Лист1"). Sort.SortFields.Clear '
ActiveWorkbook.Worksheets("Лист1"). Sort.SortFields.Add Key:=Range(Cells(1, x), Cells(y, x)) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Лист1"). Sort
.SetRange Range(Cells(1, x), Cells(y, x))
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Combobox1.RowSource = "Диапозон1"
End Sub


Private Sub Удалить_Click() ' Удаляем из списка
Dim b As Range
Dim x As Variant
Dim y As Variant
For Each b In [Диапозон1] ' сортируем диапозон
If b.Value = Combobox1.Text Then
b.Clear
' Определяем граници дипозона и сортируем
x = Range("Диапозон1").Column
y = Range("Диапозон1").CurrentRegion.Ro ws.Count + 1
ActiveWorkbook.Worksheets("Лист1"). Sort.SortFields.Clear '
ActiveWorkbook.Worksheets("Лист1"). Sort.SortFields.Add Key:=Range(Cells(1, x), Cells(y, x)) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Лист1"). Sort
.SetRange Range(Cells(1, x), Cells(y, x))
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Combobox1.RowSource = "Диапозон1"
Exit Sub
Else
End If
Next

End Sub
andreptobts вне форума Ответить с цитированием
Старый 02.02.2015, 06:37   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
Private Sub Добавить_Click() '
Dim b As Range
Dim x As Variant
Dim y As Variant
For Each b In [Диапозон1] ' перебираем диапозон на листе
If b.Value = Combobox1.Text Then
MsgBox Combobox1.Text & " уже есть всписке"
Exit Sub
Else
End If
Next
' Определяем граници дипозона вставляем новое значение и сортируем
x = Range("Диапозон1").Column
y = Range("Диапозон1").CurrentRegion.Rows.Count + 1
Sheets("Лист1").Cells(y, x).Value = Combobox1.Text
ActiveWorkbook.Worksheets("Лист1").Sort.SortFields.Clear  '
ActiveWorkbook.Worksheets("Лист1").Sort.SortFields.Add Key:=Range(Cells(1, x), Cells(y, x)) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Лист1").Sort
.SetRange Range(Cells(1, x), Cells(y, x))
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
With ThisWorkbook.Names("Диапозон1")
  .RefersToR1C1 = "=" & [Диапозон1].Parent.Name & "!R1C" & x & ":R" & y & "C" & x
End With
End Sub


Private Sub Удалить_Click() ' Удаляем из списка
  Dim b As Range
  For Each b In [Диапозон1]
    If b.Value = Combobox1.Text Then
      b.EntireRow.Delete
      Exit Sub
    End If
  Next
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 02.02.2015, 15:12   #3
andreptobts
 
Регистрация: 05.04.2014
Сообщений: 5
По умолчанию

Вставил ваш код и все равно при удаление последней строки выдает ошибку
andreptobts вне форума Ответить с цитированием
Старый 02.02.2015, 15:27   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

не давайте возможности удалять последнюю строку - не будет ошибки.

удачи!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 02.02.2015, 15:53   #5
andreptobts
 
Регистрация: 05.04.2014
Сообщений: 5
По умолчанию

Игорь подскажите, имеется форма на которой куча комббоксов, данные из которого необходимо переносить на лист эксель последовательно и в одну строку. Я это реализую по такому принципу

ActiveCell.Value = box1.Text
ActiveCell.Offset(0, 1).Select

ActiveCell.Value = box2.Text
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = box3.Text
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = box4.Text
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = box5.Text
при наличии около 100 комбобоксов на форме получается ну просто длино
я интуитивно понимаю что можно как то сделать более компактно, но как?
andreptobts вне форума Ответить с цитированием
Старый 02.02.2015, 17:12   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

как-то так:
Код:
for each ctrl in controls
  if ctrl.name like "box*" then
    ...
  end if
next
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с созданием динамического списка gvilon Паскаль, Turbo Pascal, PascalABC.NET 3 06.10.2011 23:08
отловить выбранный ItemIndex, а также значение динамического ComboBox (Delphi) Иаковъ Помощь студентам 2 06.09.2011 16:41
Сортировка двунаправленного динамического списка lacost Общие вопросы C/C++ 3 08.05.2009 10:32
сортировка динамического списка new_sergei Помощь студентам 1 19.12.2008 00:36
Заполнение динамического списка из файла KORT Помощь студентам 2 01.05.2007 22:28