If Not (rng Is Nothing Or rna Is Nothing) Then .Columns(rna.Column).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove 'Здесь дальнейшее заполнение Else .Columns(4).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove 'Здесь дальнейшее заполнение End if
If Not (rng Is Nothing Or rna Is Nothing) Then .Columns(rna.Column).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove 'Здесь дальнейшее заполнение Else .Columns(4).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove 'Здесь дальнейшее заполнение End if
[/vba] такой вариант абсолютно исключает.StoTisteg
Интуитивно понятный код - это когда интуитивно понятно, что это код.
В общем я понял почему так, потому что я глупый. Значения то в Д записываются вот и создается ощущение что создается еще один столбец. А он попросту затирается. Как можно заносить значения в этот столбец? я ведь по сути точного адреса знать не могу чтобы написать как раньше [vba]
Код
Set rCell = Intersect(.Rows(8), .Cells.Find(test.[c2]).EntireColumn)
[/vba] Спасибо большое за помощь StoTisteg !
В общем я понял почему так, потому что я глупый. Значения то в Д записываются вот и создается ощущение что создается еще один столбец. А он попросту затирается. Как можно заносить значения в этот столбец? я ведь по сути точного адреса знать не могу чтобы написать как раньше [vba]
Код
Set rCell = Intersect(.Rows(8), .Cells.Find(test.[c2]).EntireColumn)
чтобы столбец создавался слева от столбца в котором уже есть дата 18.05.2018 и второе значение "3 из 6"
В таком случае искать надо в столбце с датой, а не на всём листе, то есть как я Вам изначально и написал: [vba]
Код
If Not rng is Nothing Then Err.Clear On Error Resume Next Set rng=.Columns(rng.Column).Find(test.[c9]) If Err.Number=0 Then .Columns(rng.Column).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove .Columns(rng.Column).ClearFormats ... Else .Columns(4).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove .Columns(4).ClearFormats ... End If Else .Columns(4).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove .Columns(4).ClearFormats End If
[/vba] Переменную rna убиваем, она не нужна, вставку и обработку столбца D выносим в отдельный макрос, чтобы не повторять код.
чтобы столбец создавался слева от столбца в котором уже есть дата 18.05.2018 и второе значение "3 из 6"
В таком случае искать надо в столбце с датой, а не на всём листе, то есть как я Вам изначально и написал: [vba]
Код
If Not rng is Nothing Then Err.Clear On Error Resume Next Set rng=.Columns(rng.Column).Find(test.[c9]) If Err.Number=0 Then .Columns(rng.Column).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove .Columns(rng.Column).ClearFormats ... Else .Columns(4).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove .Columns(4).ClearFormats ... End If Else .Columns(4).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove .Columns(4).ClearFormats End If
[/vba] Переменную rna убиваем, она не нужна, вставку и обработку столбца D выносим в отдельный макрос, чтобы не повторять код.StoTisteg
Интуитивно понятный код - это когда интуитивно понятно, что это код.
Сообщение отредактировал StoTisteg - Вторник, 22.05.2018, 11:24
Поскольку одному влом сделать пример чтобы показать хотелку, а другому влом сделать пример чтобы, проверить код, ваша переброска фрагментами кода затянется надолго. [b]StoTisteg[/b], ошибка в коде есть, и VBA ее достаточно однозначно идентифицирует. (столбцов в Nothing нет)
PS виноват, разглядывая фрагменты прозевал первый set.
Поскольку одному влом сделать пример чтобы показать хотелку, а другому влом сделать пример чтобы, проверить код, ваша переброска фрагментами кода затянется надолго. [b]StoTisteg[/b], ошибка в коде есть, и VBA ее достаточно однозначно идентифицирует. (столбцов в Nothing нет)
PS виноват, разглядывая фрагменты прозевал первый set.RAN
Быть или не быть, вот в чем загвоздка!
Сообщение отредактировал RAN - Понедельник, 21.05.2018, 21:48
Всем доброго дня! Amon, если правильно понял, что Вы хотите:
[vba]
Код
Sub Main() Dim rCell As Range, lr& 'по условию можем вызвать вставку столбца If Application.Caller = "Number 1" Then Call InsertColumn(SetRng)
lr = CLng(Right(Application.Caller, 2)) + 7 Set rCell = Intersect(Results.Rows(lr), SetRng.EntireColumn) Select Case lr - 7 'номер фигуры вызвавшей макрос Case 1 'операции с rCell при нажатии на прямоугольник №1 Case 2
Case 3 To 5
'Case n End Select End Sub
Private Function SetRng() As Range Dim rng As Range, rng1 As Range With Results 'ищем дату Set rng = .Cells.Find(test.[c2], .[a1]) If Not rng Is Nothing Then 'если нашли, ищем весь диапазон дат Set rng1 = .Range(rng, rng.End(xlToRight)).Find(rng, rng, , , , xlPrevious) Set rng1 = Intersect(.Range(rng, rng1).EntireColumn, .Rows(1)) 'в пересечении диапазона дат и строки ".Rows(1)" с № маршрутов, ищем маршрут Set rng = Nothing Set rng = rng1.Find(test.[c9], rng1(rng1.Count)) Dim str$, li%: str = test.[c9]: li = CInt(Left(str, 1)) Do While rng Is Nothing If li = 1 Then Exit Do li = li - 1: str = li & Right(str, 5) Set rng = rng1.Find(str, rng1(rng1.Count)) Loop If rng Is Nothing Then Set rng = rng1(rng1.Count).Offset(, 1) Else Set rng = .[d1] End If End With Set SetRng = rng End Function
Private Sub InsertColumn(ByVal rng As Range) rng.EntireColumn.Insert xlRight, xlFormatFromLeftOrAbove With rng.Offset(, -1).EntireColumn .Interior.Color = xlNone 'Ваши форматы и значения .Cells(7) = test.[c2] '.[d7] .Cells(3).Resize(5).HorizontalAlignment = xlCenterAcrossSelection '.[d3:d7] .Cells(1).Resize(24).Borders.Weight = xlMedium '.[d1].Resize(24) .Cells(8).Resize(17).Interior.Color = RGB(120, 7, 7) '.Range("D8:D24") .Cells(4) = test.[a6] '.[d4] .Cells(5) = test.[a4] '.[d5] .Cells(6) = "Фактический результат" '.[d6] .Cells(1) = test.[c9] '.[d1] .Cells(2) = test.[a10] '.[d2] .ColumnWidth = 32 '.[d5].ColumnWidth End With End Sub
[/vba]
Функция SetRng возвращает ячейку по двум условиям поиска дата и маршрут. Процедура InsertColumn добавляет столбец слева от найденной ячейки.
Процедура Main - это пример как использовать функцию и процедуру, и бонус-подсказка как можно все организовать через Application.Caller и избавиться от огромного полотна однотипных макросов.
Предполагается, что тест всегда начинается с 1 прямоугольника, поэтому новый столбец создается при нажатии на него.
Всем доброго дня! Amon, если правильно понял, что Вы хотите:
[vba]
Код
Sub Main() Dim rCell As Range, lr& 'по условию можем вызвать вставку столбца If Application.Caller = "Number 1" Then Call InsertColumn(SetRng)
lr = CLng(Right(Application.Caller, 2)) + 7 Set rCell = Intersect(Results.Rows(lr), SetRng.EntireColumn) Select Case lr - 7 'номер фигуры вызвавшей макрос Case 1 'операции с rCell при нажатии на прямоугольник №1 Case 2
Case 3 To 5
'Case n End Select End Sub
Private Function SetRng() As Range Dim rng As Range, rng1 As Range With Results 'ищем дату Set rng = .Cells.Find(test.[c2], .[a1]) If Not rng Is Nothing Then 'если нашли, ищем весь диапазон дат Set rng1 = .Range(rng, rng.End(xlToRight)).Find(rng, rng, , , , xlPrevious) Set rng1 = Intersect(.Range(rng, rng1).EntireColumn, .Rows(1)) 'в пересечении диапазона дат и строки ".Rows(1)" с № маршрутов, ищем маршрут Set rng = Nothing Set rng = rng1.Find(test.[c9], rng1(rng1.Count)) Dim str$, li%: str = test.[c9]: li = CInt(Left(str, 1)) Do While rng Is Nothing If li = 1 Then Exit Do li = li - 1: str = li & Right(str, 5) Set rng = rng1.Find(str, rng1(rng1.Count)) Loop If rng Is Nothing Then Set rng = rng1(rng1.Count).Offset(, 1) Else Set rng = .[d1] End If End With Set SetRng = rng End Function
Private Sub InsertColumn(ByVal rng As Range) rng.EntireColumn.Insert xlRight, xlFormatFromLeftOrAbove With rng.Offset(, -1).EntireColumn .Interior.Color = xlNone 'Ваши форматы и значения .Cells(7) = test.[c2] '.[d7] .Cells(3).Resize(5).HorizontalAlignment = xlCenterAcrossSelection '.[d3:d7] .Cells(1).Resize(24).Borders.Weight = xlMedium '.[d1].Resize(24) .Cells(8).Resize(17).Interior.Color = RGB(120, 7, 7) '.Range("D8:D24") .Cells(4) = test.[a6] '.[d4] .Cells(5) = test.[a4] '.[d5] .Cells(6) = "Фактический результат" '.[d6] .Cells(1) = test.[c9] '.[d1] .Cells(2) = test.[a10] '.[d2] .ColumnWidth = 32 '.[d5].ColumnWidth End With End Sub
[/vba]
Функция SetRng возвращает ячейку по двум условиям поиска дата и маршрут. Процедура InsertColumn добавляет столбец слева от найденной ячейки.
Процедура Main - это пример как использовать функцию и процедуру, и бонус-подсказка как можно все организовать через Application.Caller и избавиться от огромного полотна однотипных макросов.
Предполагается, что тест всегда начинается с 1 прямоугольника, поэтому новый столбец создается при нажатии на него.Mikael
Добрый день, Спасибо вам огромное за ответ очень много полезного для себя подчеркнул. У меня пара вопросов осталась , Если только с датой то он правильно вставляет рядом маршруты. Что необходимо изменить чтобы он так же делал но если в ячейке будет не только дата, а дата и время в формате дд.мм.гггг чч:мм И второй очень важный вопрос для меня, как мне обращаться к столбцу который создался не в (Д) а рядом с маршрутом, как правильно задавать пересечение и с чем) В данный момент фигур уже нет есть пользовательские формы на каждый маршрут. И как мне бы такую же штуку примерно хотя бы вставить в код своей пользовательской формы? Пример кода вот
[vba]
Код
Dim rCell As Range With Results If .Cells.Find(test.[c2]) Is Nothing Then ' тут вставка столбца обычного если нету даты такой ( дата и время ) End If If Me.Label1.Caption = Results.Range("b8").Value And Me.Label2.Caption = Results.Range("c8").Value Then Set rCell = Intersect(.Rows(8), .Cells.Find(test.[c2]).EntireColumn) ' как тут должно быть прописано? ElseIf Me.Label1.Caption = Results.Range("b10").Value And Me.Label2.Caption = Results.Range("c10").Value Then Set rCell = Intersect(.Rows(10), .Cells.Find(test.[c2]).EntireColumn) End If If IsEmpty(rCell) = False Then With Results 'Тут вставка абсолютно такого же столбца но если не пусто If Me.Label1.Caption = Results.Range("b8").Value And Me.Label2.Caption = Results.Range("c8").Value Then Set rCell = Intersect(.Rows(8), .Cells.Find(test.[c2]).EntireColumn) ElseIf Me.Label1.Caption = Results.Range("b10").Value And Me.Label2.Caption = Results.Range("c10").Value Then Set rCell = Intersect(.Rows(10), .Cells.Find(test.[c2]).EntireColumn) End If End With End If With rCell rCell.WrapText = True .Value = "Ошибок нет" .Interior.Color = vbGreen End With With Results If .[d8].Interior.Color = vbGreen And .[d10].Interior.Color = vbGreen Then .[d3].Value = "Выполнено без ошибок" .[d3].Interior.Color = vbGreen ElseIf .[d7].Interior.Color = vbYellow Or .[d10].Interior.Color = vbYellow Then .[d3].Value = "Есть ошибки" .[d3].Interior.Color = vbYellow End If End With If Me.Label1.Caption = Results.Range("b8").Value And Me.Label2.Caption = Results.Range("c8").Value Then 'Это у меня такое перелистывание на следующую строку Me.Label1.Caption = Results.Range("b10").Value Me.Label2.Caption = Results.Range("c10").Value ElseIf Me.Label1.Caption = Results.Range("b10").Value And Me.Label2.Caption = Results.Range("c10").Value Then MsgBox ("Вы завершили первый маршрут из шести ''^_^''") Unload OneSix whoForm.Show End If End With
Добрый день, Спасибо вам огромное за ответ очень много полезного для себя подчеркнул. У меня пара вопросов осталась , Если только с датой то он правильно вставляет рядом маршруты. Что необходимо изменить чтобы он так же делал но если в ячейке будет не только дата, а дата и время в формате дд.мм.гггг чч:мм И второй очень важный вопрос для меня, как мне обращаться к столбцу который создался не в (Д) а рядом с маршрутом, как правильно задавать пересечение и с чем) В данный момент фигур уже нет есть пользовательские формы на каждый маршрут. И как мне бы такую же штуку примерно хотя бы вставить в код своей пользовательской формы? Пример кода вот
[vba]
Код
Dim rCell As Range With Results If .Cells.Find(test.[c2]) Is Nothing Then ' тут вставка столбца обычного если нету даты такой ( дата и время ) End If If Me.Label1.Caption = Results.Range("b8").Value And Me.Label2.Caption = Results.Range("c8").Value Then Set rCell = Intersect(.Rows(8), .Cells.Find(test.[c2]).EntireColumn) ' как тут должно быть прописано? ElseIf Me.Label1.Caption = Results.Range("b10").Value And Me.Label2.Caption = Results.Range("c10").Value Then Set rCell = Intersect(.Rows(10), .Cells.Find(test.[c2]).EntireColumn) End If If IsEmpty(rCell) = False Then With Results 'Тут вставка абсолютно такого же столбца но если не пусто If Me.Label1.Caption = Results.Range("b8").Value And Me.Label2.Caption = Results.Range("c8").Value Then Set rCell = Intersect(.Rows(8), .Cells.Find(test.[c2]).EntireColumn) ElseIf Me.Label1.Caption = Results.Range("b10").Value And Me.Label2.Caption = Results.Range("c10").Value Then Set rCell = Intersect(.Rows(10), .Cells.Find(test.[c2]).EntireColumn) End If End With End If With rCell rCell.WrapText = True .Value = "Ошибок нет" .Interior.Color = vbGreen End With With Results If .[d8].Interior.Color = vbGreen And .[d10].Interior.Color = vbGreen Then .[d3].Value = "Выполнено без ошибок" .[d3].Interior.Color = vbGreen ElseIf .[d7].Interior.Color = vbYellow Or .[d10].Interior.Color = vbYellow Then .[d3].Value = "Есть ошибки" .[d3].Interior.Color = vbYellow End If End With If Me.Label1.Caption = Results.Range("b8").Value And Me.Label2.Caption = Results.Range("c8").Value Then 'Это у меня такое перелистывание на следующую строку Me.Label1.Caption = Results.Range("b10").Value Me.Label2.Caption = Results.Range("c10").Value ElseIf Me.Label1.Caption = Results.Range("b10").Value And Me.Label2.Caption = Results.Range("c10").Value Then MsgBox ("Вы завершили первый маршрут из шести ''^_^''") Unload OneSix whoForm.Show End If End With
как мне обращаться к столбцу который создался не в (Д) а рядом с маршрутом, как правильно задавать пересечение
после создания столбца еще раз используйте SetRng - она вернет ячейку с датой и маршрутом созданного столбца. Я в Main показывал как это работает. Примерно так: [vba]
Код
If Me.Label1.Caption = Results.Range("b8").Value And Me.Label2.Caption = Results.Range("c8").Value Then Set rCell = Intersect(.Rows(8), SetRng.EntireColumn) ' как тут должно быть прописано?
[/vba] Функция SetRng всегда возвращает ячейку исходя из двух условий поиска, на выходе получаем 4 возможных варианта: 1. если нет даты - ячейка "D1"; 2. если есть дата, но нет маршрута, ищем маршрут меньше нашего с этой датой; 3. если нет маршрута меньше нашего, вставляем справа от большего; 4. нашли ячейку с датой и маршрутом.
как мне обращаться к столбцу который создался не в (Д) а рядом с маршрутом, как правильно задавать пересечение
после создания столбца еще раз используйте SetRng - она вернет ячейку с датой и маршрутом созданного столбца. Я в Main показывал как это работает. Примерно так: [vba]
Код
If Me.Label1.Caption = Results.Range("b8").Value And Me.Label2.Caption = Results.Range("c8").Value Then Set rCell = Intersect(.Rows(8), SetRng.EntireColumn) ' как тут должно быть прописано?
[/vba] Функция SetRng всегда возвращает ячейку исходя из двух условий поиска, на выходе получаем 4 возможных варианта: 1. если нет даты - ячейка "D1"; 2. если есть дата, но нет маршрута, ищем маршрут меньше нашего с этой датой; 3. если нет маршрута меньше нашего, вставляем справа от большего; 4. нашли ячейку с датой и маршрутом.
К сообщению приложен файл: MFO_Dogovor.xlsm(37.2 Kb) · Resultati.xlsm(43.0 Kb)
В этом примере нет маршрутов, дата и время в test.[c2] обновляется автоматически при запуске формы. Не вижу проблем: каждый прогон теста новая дата и время, соответственно новый столбец всегда вставляется в "D". Без второго значения для поиска SetRng тут не нужен.
Могу только догадываться, наверно тут проблема в том, что тестер может в любое время прервать тест, и тогда повторный запуск формы, должен продолжить тест там где он был прерван, поэтому нужен поиск только по дате (без времени). Т.е. вопрос по большому счету стоит "вставлять новый столбец или нет?". Вы понимаете, что формулировать проблему должен не я?
Я бы его решал на этапе инициализации формы, как мы выяснили, значения всегда заносятся в столбец "D", поэтому: [vba]
Dim rng As Range With Results 'ищем дату без времени Set rng = .Cells.Find(Format(test.[c2], "dd.mm.yyyy"), .[a1], , xlPart) If Not rng Is Nothing Then 'если строка последней заполненной ячейки в столбце D, не совпадает с последней 'заполненной строкой в столбце B If .Cells(.Rows.Count, "D").End(xlUp).Row <> .Cells(.Rows.Count, "B").End(xlUp).Row Then 'продолжаем тест со следующего этапа With .Cells(.Rows.Count, "D").End(xlUp).Offset(1) 'следующая строка Me.Label1.Caption = .Offset(, -2) 'столбец B Me.Label2.Caption = .Offset(, -1) 'столбец C End With Else 'в противном случае вставляем новый столбец Call InsertColumnD 'тест с 1 этапа Me.Label1.Caption = .[b7]: Me.Label2.Caption = .[c7] End If Else 'если нет даты Call InsertColumnD Me.Label1.Caption = .[b7]: Me.Label2.Caption = .[c7] End If
Me.Frame1.Caption = .Name End With
End Sub
[/vba] Тогда поиск целевой ячейки сводится к поиску последней строки в столбце "D": [vba]
Код
Private Sub CommandButton1_Click() Dim rCell As Range
With Results 'поиск целевой ячейки сводится к поиску последней строки в столбце "D" Set rCell = .Cells(.Rows.Count, "D").End(xlUp).Offset(1) With rCell .WrapText = True .Value = "Ошибок нет" .Interior.Color = vbGreen End With
'если последний этап If rCell.Row = .Cells(.Rows.Count, "B").End(xlUp).Row Then .[d2].Value = "Ошибок нет" .[d2].Interior.Color = vbGreen For Each rCell In .Range("d7:d11") If Not rCell.Interior.Color = vbGreen Then .[d2].Value = "Есть ошибки" .[d2].Interior.Color = vbYellow Exit For End If Next rCell MsgBox ("Вы завершили все этапы этапы сценариев по группе ''Основные''") Unload MFOForm Else With rCell.Offset(1) 'следующая строка Me.Label1.Caption = .Offset(, -2) 'столбец B Me.Label2.Caption = .Offset(, -1) 'столбец C End With End If End With End Sub
К сообщению приложен файл: MFO_Dogovor.xlsm(37.2 Kb) · Resultati.xlsm(43.0 Kb)
В этом примере нет маршрутов, дата и время в test.[c2] обновляется автоматически при запуске формы. Не вижу проблем: каждый прогон теста новая дата и время, соответственно новый столбец всегда вставляется в "D". Без второго значения для поиска SetRng тут не нужен.
Могу только догадываться, наверно тут проблема в том, что тестер может в любое время прервать тест, и тогда повторный запуск формы, должен продолжить тест там где он был прерван, поэтому нужен поиск только по дате (без времени). Т.е. вопрос по большому счету стоит "вставлять новый столбец или нет?". Вы понимаете, что формулировать проблему должен не я?
Я бы его решал на этапе инициализации формы, как мы выяснили, значения всегда заносятся в столбец "D", поэтому: [vba]
Dim rng As Range With Results 'ищем дату без времени Set rng = .Cells.Find(Format(test.[c2], "dd.mm.yyyy"), .[a1], , xlPart) If Not rng Is Nothing Then 'если строка последней заполненной ячейки в столбце D, не совпадает с последней 'заполненной строкой в столбце B If .Cells(.Rows.Count, "D").End(xlUp).Row <> .Cells(.Rows.Count, "B").End(xlUp).Row Then 'продолжаем тест со следующего этапа With .Cells(.Rows.Count, "D").End(xlUp).Offset(1) 'следующая строка Me.Label1.Caption = .Offset(, -2) 'столбец B Me.Label2.Caption = .Offset(, -1) 'столбец C End With Else 'в противном случае вставляем новый столбец Call InsertColumnD 'тест с 1 этапа Me.Label1.Caption = .[b7]: Me.Label2.Caption = .[c7] End If Else 'если нет даты Call InsertColumnD Me.Label1.Caption = .[b7]: Me.Label2.Caption = .[c7] End If
Me.Frame1.Caption = .Name End With
End Sub
[/vba] Тогда поиск целевой ячейки сводится к поиску последней строки в столбце "D": [vba]
Код
Private Sub CommandButton1_Click() Dim rCell As Range
With Results 'поиск целевой ячейки сводится к поиску последней строки в столбце "D" Set rCell = .Cells(.Rows.Count, "D").End(xlUp).Offset(1) With rCell .WrapText = True .Value = "Ошибок нет" .Interior.Color = vbGreen End With
'если последний этап If rCell.Row = .Cells(.Rows.Count, "B").End(xlUp).Row Then .[d2].Value = "Ошибок нет" .[d2].Interior.Color = vbGreen For Each rCell In .Range("d7:d11") If Not rCell.Interior.Color = vbGreen Then .[d2].Value = "Есть ошибки" .[d2].Interior.Color = vbYellow Exit For End If Next rCell MsgBox ("Вы завершили все этапы этапы сценариев по группе ''Основные''") Unload MFOForm Else With rCell.Offset(1) 'следующая строка Me.Label1.Caption = .Offset(, -2) 'столбец B Me.Label2.Caption = .Offset(, -1) 'столбец C End With End If End With End Sub
Извиняюсь я не то загрузил. Я так разбил по листам чтобы не приходилось искать но это не удобно. Вот тот же док с маршрутами но с формой. Разница просто в том что тут все в одном листе (
Извиняюсь я не то загрузил. Я так разбил по листам чтобы не приходилось искать но это не удобно. Вот тот же док с маршрутами но с формой. Разница просто в том что тут все в одном листе (Amon
Да, спасибо вам большое. Теперь буду искать и смотреть как это у вас так все получилось. Изучать все что вы написали. Потому что мне стыдно за себя) Вроде ищу ищу постоянно что да как а пишу все примитивно, а вы просто взяли и сделали все в 1 форме, а у меня их было 6ть)))) Спасибо!
Да, спасибо вам большое. Теперь буду искать и смотреть как это у вас так все получилось. Изучать все что вы написали. Потому что мне стыдно за себя) Вроде ищу ищу постоянно что да как а пишу все примитивно, а вы просто взяли и сделали все в 1 форме, а у меня их было 6ть)))) Спасибо!Amon