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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2011, 21:00   #1
LBlonde
Пользователь
 
Регистрация: 24.06.2011
Сообщений: 15
По умолчанию Вопрос по пользовательским формам

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

В общем, цепочка из 3 форм (описана ниже). При вводе данных в последнюю форму и нажатии кнопки "ОК", данные заносятся в обе таблицы, как и нужно, но появляется все та же 3-я форма, уже пустая. А мне нужно, чтобы все 3 формы закрывались.
Когда же нажимаю "Отмена" для каждой формы поочередно, то появляется сообщение об ошибке автоматизации, закрываю его - опять появляется последняя форма.

И еще вопрос. Когда форма заканчивает работу (Unload), в какое место возвращается программа?

Вначале в отдельном модуле задаются глобальные переменные: заказчик, номер заказа, клиентский номер, фирма-клиент, улица, индекс, город. С помощью отдельной кнопки на листе запускается макрос:

Sub NewOrder()
'Запускает пользовательскую форму Заказчик
ufOrderer.Show
End Sub


Данная форма имеет 2 OptionButtons (2 заказчика) и 2 командные кнопки ОК и Отмена.

Кнопка Отмена:

Private Sub CanselButton_Click()
Unload Me
End Sub


Кнопка ОК:

Private Sub OKButton_Click()

'Если выбран клиент1, то присваиваем глобальной переменной его имя
'скрываем данную форму и запускаем следующую.
If obMM Then
Orderer = "Клиент1"
Me.Hide
ufOrderClient.Show
Else
......
End If

Unload Me
End Sub


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

Кнопка "Отмена":

Private Sub CancelBut_Click()
'При нажатии кнопки Отмена возвращаемся к первой форме
Unload Me
ufOrderer.Show
End Sub

Кнопка ОК:

Private Sub OKBut_Click()

' Процесс для клиента 1
........
(Здесь глобальным переменным присваиваются значения, введенные в форму)
.......
'Ищем, имеется ли введенный клиентский номер в таблице
For i = 2 To EndCell
If Cells(i, 1).Value = ClientNum Then
' Если номер найден
MsgBox "Введенный номер имеется в таблице"
........
(Здесь глобальным переменным присваиваются значения из таблицы)
Exit For
Else
' Если номер не найден, открываем след.польз. форму
Me.Hide
ufNewClient.Show
End If
Next i

Call EnterNewOrder ' Заполняет последнюю строку в листе заказов
Unload Me
End Sub

Итак, если клиенский номер не найден, то открывается новая форма ufNewClient, где нужно ввести фирму, адрес и т.п.

Кнопка "Отмена":

Private Sub CancelNew_Click()
Unload Me
ufOrderClient.Show ' Возвращаемся к предыдущей форме
End Sub

Кнопка ОК:

Private Sub OKNeu_Click()
........
(Здесь глобальным переменным присваиваются значения, введенные в форму)
..............
(Данные заносятся в таблицу клиентов)
..............
Call EnterNewOrder ' Данные заносятся в последнюю строку в листе заказов
Unload Me
End Sub


Пожалуйста, помогите разобраться, в чем ошибка. Буду благодарна за ответы.

Последний раз редактировалось LBlonde; 01.07.2011 в 21:47.
LBlonde вне форума Ответить с цитированием
Старый 03.07.2011, 01:17   #2
LBlonde
Пользователь
 
Регистрация: 24.06.2011
Сообщений: 15
По умолчанию

Что, неужели никто не может ответить?
Еще я обнаружила, что при наличии 3-й формы не работает цикл во второй форме, т.е. программа не находит клиентский номер в таблице и сразу открывает третью форму.
Когда убираю команду показать 3-ю форму, то все работает правильно. В чем проблема?
LBlonde вне форума Ответить с цитированием
Старый 03.07.2011, 01:45   #3
vikttur
Участник клуба
 
Регистрация: 16.05.2010
Сообщений: 1,249
По умолчанию

Я не спец. А спецы могут молчать, т.к. нет файла с формами.
vikttur вне форума Ответить с цитированием
Старый 03.07.2011, 01:47   #4
LBlonde
Пользователь
 
Регистрация: 24.06.2011
Сообщений: 15
По умолчанию

файл не на русском и не на английском. не знаю, имеет ли смысл его выставлять. поэтому переписала сюда код.
LBlonde вне форума Ответить с цитированием
Старый 03.07.2011, 03:19   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
файл не на русском и не на английском
Да хоть на китайском - если вы про текст в ячейках.
Код VBA ведь на английском - а больше нам ничего и не надо.

Цитата:
не знаю, имеет ли смысл его выставлять
судя по отсутствию ответов - имеет смысл.
Сами подумайте - для спеца найти ошибку в вашем коде потребует около минуты времени, а чтобы её найти, надо нарисовать пример файла - это потребует в несколько раз больше времени.
А спецы все ленивые - им неохота рисовать формы и вставлять туда код, лишь для того, чтобы проверить свою идею )
EducatedFool вне форума Ответить с цитированием
Старый 03.07.2011, 04:24   #6
LBlonde
Пользователь
 
Регистрация: 24.06.2011
Сообщений: 15
По умолчанию

Спасибо за ответ. Немного подкорректирую файл и выставлю.
LBlonde вне форума Ответить с цитированием
Старый 03.07.2011, 11:50   #7
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

LBlonde, и вопросы как-то по пунктам разложите...
а-то лично я ниасилил Ваш пост - даже не дочитав до середины, начинаю забывать что я читал в начале, и так несколько раз подряд...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 03.07.2011, 14:22   #8
LBlonde
Пользователь
 
Регистрация: 24.06.2011
Сообщений: 15
По умолчанию

Выставляю файл. Комментарии написала по-русски, хоть и латиницей, надеюсь, это хоть немного поможет разобраться. Попытаюсь еще раз объяснить все более кратко.

Проект запускается кнопкой, находящейся на листе Excel.

1. Нужно выбрать заказчика.
2. Если выбран заказчик MyM, то открывается след.форма, куда вносится номер заказа и клиентский номер. (Для остальных заказчиков процесс еще не разрабатывался).
3. Наличие введенного клиенского номера проверяется в таблице на отдельном листе. Если номер найден, то данные заносятся в таблицу заказов одной строкой. И на этом процесс завершен.
4. Если номер не найден, то открывается следующая форма, куда заносятся данные по клиенту. Затем эти данные должны быть занесены в таблицу с клиентскими номерами и в таблицу с заказами.

Теперь мои вопросы:

1. Не могу выйти из последней формы. Нужно, чтобы после ее заполнения процесс завершался окончательно. Но форма снова выскакивает.
2. При наличии в программе 3-й формы не работает поиск клиентского номера. Программа пишет, что клиентский номер не найден (хотя он есть в таблице), и выводит 3-ю форму. Если же я убираю эту проклятую третью форму, то программа работает нормально и находит имеющийся номер.
3. В файле имеется еще одна пользовательская форма ufTyp, которую я хочу загружать тогда, когда выше указанные операции завершены, но только для того же заказчика MyM. Но я ума не приложу, куда ее вставлять. Поэтому вопрос: куда возвращается программа после завершения работы польтзовательских форм? т.е. в какое место программы мне вставить эту форму?

Если будут возникать вопросы, готова на них ответить. Буду благодарна вам за отклики!
Вложения
Тип файла: zip ENM1.zip (39.6 Кб, 13 просмотров)

Последний раз редактировалось LBlonde; 03.07.2011 в 14:25.
LBlonde вне форума Ответить с цитированием
Старый 03.07.2011, 15:37   #9
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Кое-что исправил - проверяйте: http://excelvba.ru/XL_Files/Sample__...__17-33-46.zip
Немного оптимизировал код.

Присвоил листам кодовые имена - что упростило код:


Код:
Public Sub NeuenAuftragEintragen()

    ' Zapolnjaet stroku zakaza v liste Auftrдge
    Dim NextRowAuftrage As Range    ' Vvod novogo klienta
    Set NextRowAuftrage = Auftrage.Range("a" & Auftrage.Rows.Count).End(xlUp).Offset(1)
    NextRowAuftrage.Resize(1, 7).Value = _
    Array(Auftragsgeber, AuftragsNr, KundenNr, Markt, Adresse, PLZ, Ort)

End Sub
Возможно, кое-где в коде появились ошибки (у меня в Windows немецкий отсутствует, поэтому Excel заменил некоторые отсутствующие символы "аналогичными" из кириллицы)
Но общая суть должна быть понятна.

Все формы сделал немодальными - чтобы одна другой не мешала.
Убрал ненужные обработчики ошибок.

Несколько раз макросы вылетали с ошибками на ровном месте - видимо, сказывается, что файл на другом языке
EducatedFool вне форума Ответить с цитированием
Старый 03.07.2011, 15:48   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Вообще, как мне кажется, у вас не совсем верный подход к организации данных в книге.

Взять хотя бы то, что вводимые данные дублируются на обоих листах.
По идее, данные лучше хранить на одном листе (к примеру, на Kundennummer), а на втором листе (Aufträge) выводить из формулами (занося в строку только Kunden-Nr. - все остальные данные подтягиваются из базы данных из строки с таким номером)

Также считаю неправильным изготовление отдельных форм для каждого из заказчиков.
Неужто заполняемые поля для разных заказчиков так сильно отличаются друг от друга?

Вообще, какой смысл этой программы?
Для чего все эти формы? Какова конечная цель?
EducatedFool вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по формам Igori_18 Microsoft Office Access 2 28.10.2013 08:47
Вопрос по формам Tirpitz HTML и CSS 1 25.11.2010 22:47
Вопрос по формам Armatus Общие вопросы C/C++ 11 18.05.2009 17:44
Вопрос по формам max38934 Общие вопросы Delphi 4 18.05.2009 13:41
Вопрос по формам UserOK Общие вопросы Delphi 6 13.05.2008 21:25