Как правильно написать цикл

user999

У меня есть 10 лейблов. Нужно расположить их определенным образом.Расположение нужно сделать в цикле. Выдает ошибку. Не могу в цикле написать названия объектов (Н-р: N1, N2, N3)Вот код, пробовал разными способами:
For i = <b>1</b> To <b>10</b>
 Вариант1: N(i).Top = <b>400</b>
 Вариант2: N & i.Top = <b>400</b>
 Вариант3: M = N & i или N(i)
 M.Top = <b>400</b>
Next i
16 ответов

user999

Нужно из лейблов сделать массив, присвоив им одинаковое имя. Jah loves you.


user999

На форме 3 Label и 2 кнопки
Option Explicit

Private Sub Command1_Click()
Dim i As Long
For i = <b>1</b> To <b>3</b>
 With Me.Controls("Label" & CStr(i))
 .Top = <b>500</b> * i
 .Left = <b>100</b>
 End With
Next i
End Sub

Private Sub Command2_Click()
Dim i As Long
Dim lab(<b>1</b> To <b>3</b>) As Label
Set lab(<b>1</b>) = Me.Label1
Set lab(<b>2</b>) = Me.Label2
Set lab(<b>3</b>) = Me.Label3

For i = <b>1</b> To <b>3</b>
 With lab(i)
 .Top = <b>750</b> * i
 .Left = <b>1000</b>
 End With
Next i
End Sub
Можно ещё и с TypeOf поигратся, вообщем есть где развернутся :)


user999

To Игорь Горбонос Вариант
Dim i As Long
For i = <b>1</b> To <b>3</b>
 With Me.Controls("Label" & CStr(i))
 .Top = <b>500</b> * i
 .Left = <b>100</b>
 End With
Next i
То что надо. Спасибо


user999

Прошу еще раз помочь.
Dim i As Long
For i = <b>1</b> To <b>3</b>
 With Me.Controls("Label" & CStr(i))
 .Top = <b>500</b> * i
 .Left = <b>100</b>
 End With
Next i
Как присвоить названия? .Caption =Вставляю в цикл запрос типа: strSQL = "SELECT Группы.[НаименованиеГруппы] AS [Группа] FROM [Группы] ORDER BY [НаименованиеГруппы];" G = CurrentProject.Connection.Execute(strSQL).Fields(0).Caption = GЕстественно все надписи с первым значением из запроса.Как изменить запрос?LIMIT в Access не работаетВ PHP можно было бы G сделать массивом.Как в VBA не знаю.


user999

LIMIT в Access не работаетВ PHP можно было бы G сделать массивом.
Вместо LIMIT используется TopSelect Top 10 ...По поводу "можно было бы G сделать массивом" смотрите в хелпе метод GetRows


user999

Что тот не получается:
For i = <b>1</b> To R
Dim rs As DAO.Recordset
Dim strSQL As String
Dim MyArray As Variant
strSQL = "SELECT Группы.[НаименованиеГруппы] FROM [Группы];"
Set rs = CurrentDb.OpenRecordset(strSQL)
MyArray = rs.GetRows()

MsgBox MyArray(i, <b>0</b>)
Next i


user999

а что вы внутрь цикла то засунули и объявления и выборку данных?


user999

Да без разницы, можно и так:
Dim rs As DAO.Recordset
Dim strSQL As String
Dim MyArray As Variant
strSQL = "SELECT Группы.[НаименованиеГруппы] FROM [Группы];"
Set rs = CurrentDb.OpenRecordset(strSQL)
MyArray = rs.GetRows()

For i = <b>1</b> To R
MsgBox MyArray(i, <b>0</b>)
Next i
Все равно ошибка


user999

Все равно ошибка
Блин! ошибка в 17 строке! Какая ошибка? может выход за границы массива , может пустой рекордсет, может вообще при выполнении запроса что-то происходит.Текст ошибки можно взять в окне Immedate набрав следующий текст: ? err.description и нажав на Ентер. Окно Immedate можно вызвать нажав Ctrl+G или в меню View пункт Immedate Window.З.Ы. И без текста ошибки не приходите


user999

Subscript out of range


user999

For i = <b>1</b> To R
MsgBox MyArray(i, <b>0</b>)
Next i
что такое R? где она у вас задается?напишите так:
If IsArray(MyArray) Then
For i = LBound(MyArray) To UBound(MyArray)

...

Next i
End if


user999

Работает только так:
MsgBox MyArray(<b>0</b>, <b>0</b>)
или
MsgBox MyArray(i, i)
где i начинается с 0Выводит первое значение из массива, а потом выдает ошибку (когда в цикле i становится = 1)Т.е. вывести поочереди все значения массива не получается


user999

> Автор: user999> Работает только так:Значит у вас двухмерный массив с одной строкой> Выводит первое значение из массива, а потом выдает ошибку (когда в цикле i становится = 1)Естественно, потому, что пытаетесь вывести содержимое массива с координатами 1,1 а если там одна строка, получаете ошибку выхода за границы массива.
Dim i As Long, j As Long
For i = LBound(MyArray, <b>1</b>) to UBound(MyArray, <b>1</b>)
 For j = LBound(MyArray, <b>2</b>) To UBound(MyArray, <b>2</b>)
 MsgBox MyArray(i, j)
 Next j
Next i
> Т.е. вывести поочереди все значения массива не получается;)


user999

Игорь Горбонос,Все равно выводит только значение первой строки, а в таблице их 7.Таблица состоит из 2-х полей: Код и НаименованиеГруппы. Заполнено 7 строк.Неужели у Вас работает написанный Вами код, а у меня нет. Казалось бы простая задача.


user999

................................
Set rs = CurrentDb.OpenRecordset(strSQL)
rs.MoveLast: rs.MoveFirst
MyArray = rs.GetRows(rs.RecordCount)
...............................


user999

Разобрался, загвоздка была в MyArray = rs.GetRows()нужно былоMyArray = rs.GetRows(R)где R количество строк в запросе