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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2012, 15:37   #1
Mjaso
Пользователь
 
Регистрация: 01.10.2011
Сообщений: 19
Радость Цикл спуска по столбцу

Добрый день !

Вот, пытаюсь на своей Форме в TextBox отразить все значения (из столбца в Таблице) один за одним, по нажатию кнопки. Кол-во значений в Таблице не будет фиксированным (но при этом может доходить до 300-400). Вот что у меня получилось:

Private Sub UserForm_Initialize()
With Worksheets("List") 'Работаем с листом "List".
If .Range("F2") <> "" Then TextBox1.Text = .Range("F2")
If .Range("F2") = "" Then TextBox1.Text = ""
End With
End Sub
Private Sub CommandButton1_Click()
If TextBox1.Text = Sheets("List").Range("F2") Then
TextBox1.Text = Sheets("List").Range("F3")
ElseIf TextBox1.Text = Sheets("List").Range("F3") Then
TextBox1.Text = Sheets("List").Range("F4")
ElseIf TextBox1.Text = Sheets("List").Range("F4") Then
TextBox1.Text = Sheets("List").Range("F5")

End If
End Sub

Вобщем, до 3-х он у меня сейчас все цифры по порядку показывает. Но что-то мне подсказывает, что есть способы и полегче чем перебирать КАЖДОЕ из значений.

Знающие люди, подскажите какой цикл использовать в моём случае.

Заранее благодарен
Вложения
Тип файла: rar Test5 (cikl spuska).rar (9.7 Кб, 12 просмотров)
Mjaso вне форума Ответить с цитированием
Старый 03.06.2012, 16:21   #2
RAN.
Форумчанин
 
Аватар для RAN.
 
Регистрация: 05.07.2011
Сообщений: 208
По умолчанию

Код:
Dim i&

Private Sub UserForm_Initialize()
i = 2
TextBox1 = Sheets("List").Range("F" & i)
End Sub
Private Sub CommandButton1_Click()
i = IIf(i <= Sheets("List").Cells(Rows.Count, "F").End(xlUp).Row, i + 1, 2)
TextBox1 = Sheets("List").Range("F" & i)
End Sub
RAN. вне форума Ответить с цитированием
Старый 03.06.2012, 16:26   #3
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

А если нужно назад вернуться?
Может лучше spinbutton? Значение можно заносить в публичную переменную - тогда при повторном открытии формы перебор можно продолжить.
Значения с листа брать способом cells(i,6).value
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 03.06.2012, 17:05   #4
Mjaso
Пользователь
 
Регистрация: 01.10.2011
Сообщений: 19
По умолчанию

Цитата:
Сообщение от RAN. Посмотреть сообщение
Код:
Dim i&

Private Sub UserForm_Initialize()
i = 2
TextBox1 = Sheets("List").Range("F" & i)
End Sub
Private Sub CommandButton1_Click()
i = IIf(i <= Sheets("List").Cells(Rows.Count, "F").End(xlUp).Row, i + 1, 2)
TextBox1 = Sheets("List").Range("F" & i)
End Sub
Спасибо, это действительно то что нужно, правда работает медленно, бывает два раза уже успеваю на кнопку нажать пока он следующее порядковое число выдаст.

И кстати, действительно хотелось бы чтобы по возвращению в Форму она продолжала счёт. Но без SpinButton, т.к. нельзя мне в эту Форму новый элемент управления добавлять. Можно это как то без него организовать ?
Mjaso вне форума Ответить с цитированием
Старый 03.06.2012, 17:43   #5
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

> правда работает медленно
Это сама форма тормозит! Попробуйте код без обращения к листу при нажатии кнопки, сам по себе он срабатывает за доли миллисекунды:
Код:
Dim i&, v()

Private Sub UserForm_Initialize()
With Sheets("List")
    v = .Range("F1", .Cells(.Rows.Count, "F").End(xlUp)).Value
End With
i = 2
TextBox1 = v(i, 1)
End Sub

Private Sub CommandButton1_Click()
If i < UBound(v) Then i = i + 1 Else i = 2
TextBox1 = v(i, 1)
End Sub
А вообще тут напрашивается ListBox вместо TextBox.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 03.06.2012, 18:07   #6
Mjaso
Пользователь
 
Регистрация: 01.10.2011
Сообщений: 19
По умолчанию

Цитата:
Сообщение от Казанский Посмотреть сообщение
> правда работает медленно
Это сама форма тормозит! Попробуйте код без обращения к листу при нажатии кнопки, сам по себе он срабатывает за доли миллисекунды:
Код:
Dim i&, v()

Private Sub UserForm_Initialize()
With Sheets("List")
    v = .Range("F1", .Cells(.Rows.Count, "F").End(xlUp)).Value
End With
i = 2
TextBox1 = v(i, 1)
End Sub

Private Sub CommandButton1_Click()
If i < UBound(v) Then i = i + 1 Else i = 2
TextBox1 = v(i, 1)
End Sub
А вообще тут напрашивается ListBox вместо TextBox.
Не, всё равно тормозит, и без обращения к листу. Может версия моя Offisa 2010 подводит ? Больше в Excel ничего не открыто. А ListBox мне нельзя, место много занимает и длинный, на моей реальной Форме у меня место только для одной полоски с текстом.
Может всё-же есть какое нибудь "заклинание", чтобы при повторном открывании Формы отсчёт продолжался ?
Mjaso вне форума Ответить с цитированием
Старый 03.06.2012, 19:22   #7
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

> А ListBox мне нельзя, место много занимает и длинный
Кто мешает сделать его размером с текстбокс? Пробуйте, прокручивается штатными кнопочками или кнопками вверх/вниз, мгновенно. И кстати отдельная кнопка на форме не нужна, место экономится
Вложения
Тип файла: rar Test5 (cikl spuska)1.rar (11.4 Кб, 19 просмотров)
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 03.06.2012, 19:27   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Попробуйте на коде Казанского при инициализации формы:
Код:
If i<2 then i = 2
TextBox1 = v(i, 1)
Но переменную нужно сделать публичной.

Алексей, а где код?
Вложения
Тип файла: rar Test5(ciklspuska)Kazansky+Hugo.rar (15.0 Кб, 11 просмотров)
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 03.06.2012 в 19:36.
Hugo121 вне форума Ответить с цитированием
Старый 03.06.2012, 20:01   #9
RAN.
Форумчанин
 
Аватар для RAN.
 
Регистрация: 05.07.2011
Сообщений: 208
По умолчанию

Тормозят не коды, а обработка нажатия кнопки. Попробуйте для сравнения нажимать не мышом, а клавишей Enter.
RAN. вне форума Ответить с цитированием
Старый 03.06.2012, 20:09   #10
Mjaso
Пользователь
 
Регистрация: 01.10.2011
Сообщений: 19
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Попробуйте на коде Казанского при инициализации формы:
Код:
If i<2 then i = 2
TextBox1 = v(i, 1)
Но переменную нужно сделать публичной.

Алексей, а где код?
Огромное спасибо ! Всё работает, при перезапуске всё как надо.
Есть только одна маленькая просьба/вопрос. Как сделать так, чтобы когда он выдаст последнее значение столбца - при последующем нажатии CommandButton макрос выдавал MsgBox "В начало !" ? Сам пытался этот MsgBox как то присобачить, да знаний маловато.
Mjaso вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод покоординатного спуска новичочек C++ Builder 0 02.05.2011 15:44
метод градиентного спуска Альмира Visual C++ 0 03.04.2011 15:38
алгоритм покоординатного спуска mimi_mimi Паскаль, Turbo Pascal, PascalABC.NET 0 20.06.2010 18:23
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34