Страницы: 1
RSS
порядок вывода формы VBA и диалогового окна, нужен совет как поменять порядок вывода окна формы и диалогового окна
 
Приветствую специалисты! Прошу подсказать новичку как в ниже указанном макросе сделать, чтобы окно формы VBA открывалось после окончания работы диалогового окна (сейчас все открывается с точность до наоборот - сначала открывается форма и только потом диалоговое окно).
спасибо всем, кто откликнется.
Код
Private Sub ф_Добавить_Комментарий_Initialize()
    CommandButton1_Click
End Sub

Private Sub CommandButton1_Click()
Dim komment
flag = False
komment = ф_Добавить_Комментарий.TextBox1.Text
Unload ф_Добавить_Комментарий

    With Sheets("Ассортимент")
        Set selectRange = Application.InputBox("Выберите клиента", "Номер Позиции", Type:=8) '''''''''Речь про этот диалог
        n_1 = Cells(selectRange.Row, 1).Text ' номер менеджера
        n_2 = Cells(selectRange.Row, 2).Text ' номер клиента
    End With

    With Sheets("База клиентов")
        Set bk_act = .Cells.Find("Акты", , xlFormulas, xlWhole) ' ячейка с комментарием
        Set bk_n_1 = .Cells.Find("№1", , xlFormulas, xlWhole) ' ячейка с №1
        Set bk_n_2 = .Cells.Find("№2", , xlFormulas, xlWhole) ' ячейка с №2
        Set bk_find = bk_n_2.EntireColumn.Find(n_2, LookIn:=xlValues)
        If Not bk_find Is Nothing Then
            firstAddress = bk_find.Address
            Do
                If .Cells(bk_find.Row, bk_n_1.Column).Text = n_1 Then
                        flag = True
                    .Cells(bk_find.Row, bk_act.Column).Value = .Cells(bk_find.Row, bk_act.Column).Text + "  " + komment
                    If OptionButton2 = True Then
                        .Cells(bk_find.Row, bk_act.Column).Interior.Color = RGB(255, 0, 0)
                    End If
                    MsgBox "Комментарий добавлен!"
                Else
                    Set bk_find = bk_n_2.EntireColumn.FindNext(bk_find)
                End If
            Loop While Not bk_find Is Nothing And bk_find.Address <> firstAddress And flag = False
        End If
        If flag = False Then
            MsgBox "Клиент не найден в базе клиентов или активен фильтр"
        End If
    End With
End Sub
Если важно, то форма вызывается отдельным макросом.
Код
Sub Добавить_Комментарий()
    ф_Добавить_Комментарий.Show vbModeless
End Sub
 
Сдается мне, что в данном случае никак, т.к. вызов диалога у Вас в модуле формы. Вынесите процедуру вызова Application.InputBox из модуля формы в отдельный модуль и потом переписывайте код с вызовом в нужном порядке.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, насколько понимаю, основной макрос нужно оставить в первом модуле, а из формы получать только переменные flag и komment?  Их нужно сделать глобальными? Можете подсказать как сделать их глобальными и как передать их значения в основной макрос?
 
В самых общих чертах вроде бы так...
Я не волшебник, я только учусь.
 
VIZ_VIZ, попробуйте так вызывать форму -
Код
Load ф_Добавить_Комментарий
ф_Добавить_Комментарий.Show vbModeless
 
Апострофф, сделал так
Код
Public komment
Sub ф_Добавить_Комментарий()
    Load ф_Добавить_Комментарий
    ф_Добавить_Комментарий.Show vbModeless
    MsgBox "komment=  " & komment
End Sub
переменная не передается
 
VIZ_VIZ, уберите лишнее объявление
Цитата
Private Sub CommandButton1_Click()
'Dim komment
flag = False
 
Апострофф,не помогло. Сначала выходит форма vba и msg из макроса (с пустой переменной). После закрытия msg появляется возможность занести комментарий в форму vba - выходит сообщение Compile error: expected variable or procedure, not module. Вероятно нужно заставить макрос ждать пока не отработает форма. Вопрос как заставить?
 
Цитата
VIZ_VIZ написал:
как заставить?
как минимум выложить свой файл, в котором можно лицезреть и форму и коды. А без этого все нужные рекомендации Вам уже даны.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков,
 
VIZ_VIZ написал:
Цитата
Private Sub ф_Добавить_Комментарий_Initialize()
Попробуйте поменять эту строку на штатную для всех UserForm.
Код
Private Sub UserForm_Initialize()
Изменено: Апострофф - 12.11.2019 14:31:30
 
м-да...в этом файле вообще нет кода с Application.InputBox. Куда он делся? Где его взять? Неужели нельзя выложить адекватный файл и не заставлять додумывать за Вас что откуда надо куда воткнуть? Давайте хоть по шагам тогда:
1. Какое окно должно появиться ДО формы? Выбор диапазона?
2. Какое отношение к этому имеет переменная komment? Она берется изначально из формы: так и должно быть?
3. Какую роль имеет переменная flag? Не вижу, что у неё было значение хоть где-то, отличное от False. А нет, нашел. Вопрос отпал.
Изменено: Дмитрий(The_Prist) Щербаков - 12.11.2019 14:48:41
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
В общем по логике вопрос напрашивается такой код(в стандартный модуль):
Код
Public komment
Sub Добавить_Комментарий111()
    flag = False

    With Sheets("Ассортимент")
        Set selectRange = Application.InputBox("Выберите клиента", "Номер Позиции", Type:=8) '''''''''Речь про этот диалог
        n_1 = Cells(selectRange.Row, 1).Text ' номер менеджера
        n_2 = Cells(selectRange.Row, 2).Text ' номер клиента
    End With
    
    ф_Добавить_Комментарий111.Show

    With Sheets("База клиентов")
        Set bk_act = .Cells.Find("Акты", , xlFormulas, xlWhole) ' ячейка с комментарием
        Set bk_n_1 = .Cells.Find("№1", , xlFormulas, xlWhole) ' ячейка с №1
        Set bk_n_2 = .Cells.Find("№2", , xlFormulas, xlWhole) ' ячейка с №2
        Set bk_find = bk_n_2.EntireColumn.Find(n_2, LookIn:=xlValues)
        If Not bk_find Is Nothing Then
            firstAddress = bk_find.Address
            Do
                If .Cells(bk_find.Row, bk_n_1.Column).Text = n_1 Then
                        flag = True
                    .Cells(bk_find.Row, bk_act.Column).Value = .Cells(bk_find.Row, bk_act.Column).Text + "  " + komment
                    If OptionButton2 = True Then
                        .Cells(bk_find.Row, bk_act.Column).Interior.Color = RGB(255, 0, 0)
                    End If
                    MsgBox "Комментарий добавлен!"
                Else
                    Set bk_find = bk_n_2.EntireColumn.FindNext(bk_find)
                End If
            Loop While Not bk_find Is Nothing And bk_find.Address <> firstAddress And flag = False
        End If
        If flag = False Then
            MsgBox "Клиент не найден в базе клиентов или активен фильтр"
        End If
    End With
End Sub
а этот в модуль формы
Код
Private Sub ф_Добавить_Комментарий111_Initialize()
    CommandButton1_Click
End Sub

Private Sub CommandButton1_Click()
    flag = False
    komment = ф_Добавить_Комментарий111.TextBox1.Text
    Unload Me
End Sub
правда так и не понял какую роль здесь играет ф_Добавить_Комментарий111_Initialize и почему она при запуске ссылается на CommandButton1_Click(и кстати, правильно процедура должна называться UserForm_Initialize). Скорее всего должно было быть что-то вроде:
Код
Private Sub UserForm_Initialize()
'вставляем в поле записанный ранее коммент
    ф_Добавить_Комментарий111.TextBox1.Text = komment
End Sub

Private Sub CommandButton1_Click()
    flag = False
    komment = ф_Добавить_Комментарий111.TextBox1.Text
    Unload Me
End Sub
Изменено: Дмитрий(The_Prist) Щербаков - 12.11.2019 14:48:07
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, изначальный код указан в  самом начале, могу добавить его в файл с примером. По вашим вопросам: 1. Да - выбор диапазона должен быть первым. 2. В поле формы пользователь должен заполнить комментарий.
После отработки формы макрос добавляет переменную komment в таблицу (добавляет комментарий пользователя).
Мне достаточно помочь своевременно передать komment в основной макрос, далее я, наверное, справлюсь. - планировал поставить вызов формы после выбора диапазона - между блоками with.
 
см.выше
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
ф_Добавить_Комментарий111_Initialize
- это придуманная VIZ_VIZ процедура, которая по задумке автора должна выполняться при вызове формы - это главная его ошибка.
 
Дмитрий(The_Prist) Щербаков,
flag не нужен - забыл удалить из кода))
протестировал оба кода для формы - не работает - ругается на Private Sub CommandButton1_Click() - пишет Compile error: expected variable or procedure, not module.
На всякий случай еще раз поясню задачу макроса - добавить новый комментарий пользователя в базу клиентов. То есть в форме vba пользователь вводит свой комментарий (нужный текст). И указывает тип этого комментария - постоянный или одноразовый.
 
У меня нет таких ошибок с кодами выше. Посмотрите внимательно - может скопировали до того, как я внес в коды небольшие правки. Ну и файл во вложении - чую я, что что-то не туда копируете.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, удалил свои модули, скопировал модули из вашего файла - все равно ругается... В вашем файле все работает. Загадка.... Буду тестировать. Если найду интересную ошибку - выложу в чем причина.
Спасибо всем, кто откликнулся!))
 
Цитата
VIZ_VIZ написал:
В вашем файле все работает. Загадка....
ответ на загадку я написал выше - что-то Вы явно делаете не так. И причина явно будет неинтересной, т.к. судя по ошибке это банальная невнимательность :) Проверьте как все скопировалось с сайта(или скопируйте напрямую с моего файла) - с сайта копируется иногда с лишними символами.
И еще можно вбить в поиск по проекту VBA(в проблемной книге) - CommandButton1_Click. Поиск - по всему проекту(Project). Скорее всего где-то остался хвостик в виде объявленной переменной с таким же именем, как процедура. Или модуль с таким же именем, или форма. Вот и проблема...
Если не поможет - создать любой комментарий и скомпилировать проект(Debug -Compile VBA Project). И приучите себя использовать Option Explicit - ошибок будет в разы меньше.
Изменено: Дмитрий(The_Prist) Щербаков - 12.11.2019 15:43:56
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
остался хвостик в виде объявленной переменной с таким же именем
Дмитрий - вы как всегда выручаете!))) Был пробный модуль с такой же переменной - удалил его - все заработало. Вероятно, это особенность глобальных переменных?
 
Это особенность любых переменных - очень желательно, чтобы они не совпадали с именем имеющейся в том же модуле/проекте процедуры, формы, другого модуля.
Изменено: Дмитрий(The_Prist) Щербаков - 12.11.2019 16:00:14
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Наверх