Страницы: 1
RSS
Остановка выполнения кода по кнопке на msgbox
 
Здравствуйте, форумчане. Такая ситуация , есть код по заполнению таблицы данными с формы. Затем есть код проверки столбца на повторение конкретного значения в ячейке в соответствии с заданным изначально значением. Проверка выполняется по клику на кнопке переноса данных с формы на лист (коммандбаттон_клик) При нахождении повторения появляется msgbox в котором говорится о том, что найдено повторение. Суть проблемы: При появлении сообщения о найденном повторении необходимо при клике на кнопку останавливать выполнение кода, чтобы ни одно из значений с формы не перенеслось на лист. Т.е у меня 4 optionButton если у меня записано на листе в столбце "Тип номера" - "Стандартный", то при следующей попытке записи такого же значения и появлении msgbox при нажатии на кнопку ok я должен выбрать другую галочку и уже теперь при нажатии на "Расчёт" должны записаться данные на лист.
Код
Private Sub CommandButton1_Click()
Worksheets("Выписка").Activate
Dim Data As String
Dim FioP As String
Dim FioM As String
Dim TypeN As String
Dim Srok As String
Dim Summa As String
Dim Phone As String
Dim StoimS As String
НомерСтроки = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1
With UserForm1
Data = .TextBox1.Text
FioP = .TextBox2.Text
Srok = .TextBox5.Text
Phone = .TextBox7.Text
TextBox6.Text = TextBox9.Text * TextBox5.Text
If OptionButton1.Value = True Then TextBox6.Text = TextBox6.Text - (TextBox6.Text * 0.03)
If OptionButton2.Value = True Then TextBox6.Text = TextBox6.Text - (TextBox6.Text * 0.05)
If OptionButton3.Value = True Then TextBox6.Text = TextBox6.Text - (TextBox6.Text * 0.07)
Summa = TextBox6.Text
If CheckBox1.Value = True Then TextBox8.Text = Worksheets("Менеджеры").Range("B1").Value
If CheckBox1.Value = True Then FioM = TextBox8.Text
If CheckBox2.Value = True Then TextBox8.Text = Worksheets("Менеджеры").Range("B10").Value
If CheckBox2.Value = True Then FioM = TextBox8.Text
If CheckBox3.Value = True Then TextBox9.Text = Worksheets("Апартаменты").Range("B4").Value
If CheckBox3.Value = True Then StoimS = Worksheets("Апартаменты").Range("B4").Value
If CheckBox3.Value = True Then TypeN = "Стандартный"

If CheckBox3.Value = True Then Call Search1

If CheckBox4.Value = True Then TextBox9.Text = Worksheets("Апартаменты").Range("B10").Value
If CheckBox4.Value = True Then StoimS = Worksheets("Апартаменты").Range("B10").Value
If CheckBox4.Value = True Then TypeN = "Студия"
If CheckBox5.Value = True Then TextBox9.Text = Worksheets("Апартаменты").Range("B18").Value
If CheckBox5.Value = True Then StoimS = Worksheets("Апартаменты").Range("B18").Value
If CheckBox5.Value = True Then TypeN = "Семейный"
If CheckBox6.Value = True Then TextBox9.Text = Worksheets("Апартаменты").Range("B25").Value
If CheckBox6.Value = True Then StoimS = Worksheets("Апартаменты").Range("B25").Value
If CheckBox6.Value = True Then TypeN = "Люкс"
End With
With Worksheets("Выписка")
Cells(НомерСтроки, 1).Value = Data
Cells(НомерСтроки, 2).Value = FioP
Cells(НомерСтроки, 3).Value = FioM
Cells(НомерСтроки, 4).Value = TypeN
Cells(НомерСтроки, 5).Value = Srok
Cells(НомерСтроки, 6).Value = Summa
Cells(НомерСтроки, 7).Value = Phone
End With
End Sub

Private Sub CommandButton2_Click()
Call obj
End Sub

Private Sub CommandButton3_Click()
TextBox2.Text = ""
TextBox7.Text = ""
TextBox8.Text = ""
TextBox9.Text = ""
TextBox6.Text = ""
TextBox5.Text = ""
CheckBox1.Value = False
CheckBox2.Value = False
CheckBox3.Value = False
CheckBox4.Value = False
CheckBox5.Value = False
CheckBox6.Value = False
End Sub

Private Sub UserForm_Activate()
TextBox1.Text = Date
Worksheets("Выписка").Activate
End Sub

Private Sub Search1()
 Dim x As String
      Dim found As Boolean
      Cells(2, 4).Select
      x = "Стандартный"
      found = False
      Do Until IsEmpty(ActiveCell)
         If ActiveCell.Value = x Then
            found = True
            Exit Do
         End If
         ActiveCell.Offset(1, 0).Select
      Loop
      If found = True Then
            Call allert
      End If
End Sub
Sub allert()
Dim a As Integer
a = msgbox("Все номера выбранного типа заняты", vbOKCancel)
'If a = 1 Then

End Sub
Изменено: OG.Dope - 21.11.2018 18:46:03 (Файл не поместился 500+ кб засчёт картинок оформления.)
 
Может так?
Код
Sub allert()
    If MsgBox("Прервать работу программы?", vbYesNo) = vbYes Then End
End Sub

 
Это хорошее начало на пути к достижению моей цели, уже благодарен. Но возможно ли сделать так, чтобы при нажатии на кнопку да, он не закрывал программу полностью, а оставлял форму, на которой было бы можно просто поставить галочку на другой пункт?  
 
Ваш макрос написан так, что вкорячить туда простейшую команду становится проблемой.
Можно переписать так
Код
Private Sub CommandButton1_Click()
    Worksheets("Выписка").Activate
    Dim Data As String
    Dim FioP As String
    Dim FioM As String
    Dim TypeN As String
    Dim Srok As String
    Dim Summa As String
    Dim Phone As String
    Dim StoimS As String
    НомерСтроки = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1
    With UserForm1
        Data = .TextBox1.Text
        FioP = .TextBox2.Text
        Srok = .TextBox5.Text
        Phone = .TextBox7.Text
        TextBox6.Text = TextBox9.Text * TextBox5.Text
        If OptionButton1.Value = True Then TextBox6.Text = TextBox6.Text - (TextBox6.Text * 0.03)
        If OptionButton2.Value = True Then TextBox6.Text = TextBox6.Text - (TextBox6.Text * 0.05)
        If OptionButton3.Value = True Then TextBox6.Text = TextBox6.Text - (TextBox6.Text * 0.07)
        Summa = TextBox6.Text
        If CheckBox1.Value = True Then TextBox8.Text = Worksheets("Менеджеры").Range("B1").Value
        If CheckBox1.Value = True Then FioM = TextBox8.Text
        If CheckBox2.Value = True Then TextBox8.Text = Worksheets("Менеджеры").Range("B10").Value
        If CheckBox2.Value = True Then FioM = TextBox8.Text
        If CheckBox3.Value = True Then TextBox9.Text = Worksheets("Апартаменты").Range("B4").Value
        If CheckBox3.Value = True Then StoimS = Worksheets("Апартаменты").Range("B4").Value
        If CheckBox3.Value = True Then TypeN = "Стандартный"

        If CheckBox3.Value = True Then GoSub Search1

        If CheckBox4.Value = True Then TextBox9.Text = Worksheets("Апартаменты").Range("B10").Value
        If CheckBox4.Value = True Then StoimS = Worksheets("Апартаменты").Range("B10").Value
        If CheckBox4.Value = True Then TypeN = "Студия"
        If CheckBox5.Value = True Then TextBox9.Text = Worksheets("Апартаменты").Range("B18").Value
        If CheckBox5.Value = True Then StoimS = Worksheets("Апартаменты").Range("B18").Value
        If CheckBox5.Value = True Then TypeN = "Семейный"
        If CheckBox6.Value = True Then TextBox9.Text = Worksheets("Апартаменты").Range("B25").Value
        If CheckBox6.Value = True Then StoimS = Worksheets("Апартаменты").Range("B25").Value
        If CheckBox6.Value = True Then TypeN = "Люкс"
    End With
    With Worksheets("Выписка")
        Cells(НомерСтроки, 1).Value = Data
        Cells(НомерСтроки, 2).Value = FioP
        Cells(НомерСтроки, 3).Value = FioM
        Cells(НомерСтроки, 4).Value = TypeN
        Cells(НомерСтроки, 5).Value = Srok
        Cells(НомерСтроки, 6).Value = Summa
        Cells(НомерСтроки, 7).Value = Phone
    End With
    Exit Sub
Search1:
    Dim x As String
    Dim found As Boolean
    Cells(2, 4).Select
    x = "Стандартный"
    found = False
    Do Until IsEmpty(ActiveCell)
        If ActiveCell.Value = x Then
            found = True
            Exit Do
        End If
        ActiveCell.Offset(1, 0).Select
    Loop
    If found = True Then
        GoSub allert
    End If
    Return
allert:
    Dim a As Integer
    a = MsgBox("Все номера выбранного типа заняты", vbOKCancel)
    If a = vbCancel Then Exit Sub
    Return
End Sub
 
Огромнейшее человеческое спасибо, ещё убрал оттуда лишнюю ок, оставил только одну кнопку на месседж боксе и программа стала конфеткой. Просто с Goto Return не связывался ещё, вот и накорячил как мог..)
Изменено: OG.Dope - 21.11.2018 21:36:54
 
Не могли бы Вы оказать мне ещё одну консультацию (помощь)
Код
Sub obj()
Dim objWord As Object
Dim FileStart
Dim FileNew

Set objWord = CreateObject("Word.Application")

    FileSt = "C:\Users\OGDop\OneDrive\Рабочий стол\Шаблон.docx"
    FileNew = "C:\Users\OGDop\OneDrive\Рабочий стол\Квитанция.docx"
    
    Set objDoc = objWord.Documents.Open(FileSt)

      objWord.Visible = True
      
objDoc.Bookmarks("first").Range.InsertAfter (Cells(2, 2).Value)
objDoc.Bookmarks("second").Range.InsertAfter (Cells(2, 7).Value)
objDoc.Bookmarks("third").Range.InsertAfter (Cells(2, 3).Value)
objDoc.Bookmarks("summa").Range.InsertAfter (Cells(2, 6).Value)
objDoc.Bookmarks("data").Range.InsertAfter (Cells(2, 1).Value)

    objWord.ActiveDocument.SaveAs _
            Filename:=FileNew, _
            FileFormat:=wdFormatDocument, _
            Password:="", _
            AddToRecentFiles:=True, _
            WritePassword:="", _
            ReadOnlyRecommended:=False
objWord.Quit
End Sub

По этому коду, макрос выкидывает данные из экселя в Ворд, можно ли осуществить как-то чтобы каждый раз необходимая строка для переписывания автоматически переходила на новую строку и следовательно при каждом нажатии на кнопку "Квитанция" в ней данные были не из строго определённых ячеек, как сейчас, а нового посетителя? Если я правильно понимаю в макросе нужно прописать цикл примерного содержания :
Dim q As integer
q = 2
objDoc.Bookmarks("first").Range.InsertAfter (Cells(q, 2).Value)
objDoc.Bookmarks("second").Range.InsertAfter (Cells(q, 7).Value)
objDoc.Bookmarks("third").Range.InsertAfter (Cells(q, 3).Value)
objDoc.Bookmarks("summa").Range.InsertAfter (Cells(q, 6).Value)
objDoc.Bookmarks("data").Range.InsertAfter (Cells(q, 1).Value)
q = q+1
Изменено: OG.Dope - 21.11.2018 21:36:45
 
Есть ещё макрос по выводу данных из этого самого экселя в ворд, строго определённых ячеек в строго указанное место в ворде
Код
Sub obj()
Dim objWord As Object
Dim FileStart
Dim FileNew
Set objWord = CreateObject("Word.Application")
    FileSt = "C:\Users\OGDop\OneDrive\Рабочий стол\Шаблон.docx"
    FileNew = "C:\Users\OGDop\OneDrive\Рабочий стол\Квитанция.docx"
    Set objDoc = objWord.Documents.Open(FileSt)
      objWord.Visible = True      
objDoc.Bookmarks("first").Range.InsertAfter (Cells(2, 2).Value)
objDoc.Bookmarks("second").Range.InsertAfter (Cells(2, 7).Value)
objDoc.Bookmarks("third").Range.InsertAfter (Cells(2, 3).Value)
objDoc.Bookmarks("summa").Range.InsertAfter (Cells(2, 6).Value)
objDoc.Bookmarks("data").Range.InsertAfter (Cells(2, 1).Value)
    objWord.ActiveDocument.SaveAs _
            Filename:=FileNew, _
            FileFormat:=wdFormatDocument, _
            Password:="", _
            AddToRecentFiles:=True, _
            WritePassword:="", _
            ReadOnlyRecommended:=False
objWord.Quit
End Sub
Возможно ли сделать так, чтобы вывод в ворд происходил каждый раз с той строки которая только что записалась?
Насколько я понимаю примерно так?
Код
Dim q As Integer
q=2
objDoc.Bookmarks("first").Range.InsertAfter (Cells(q, 2).Value)
objDoc.Bookmarks("second").Range.InsertAfter (Cells(2, 7).Value)
objDoc.Bookmarks("third").Range.InsertAfter (Cells(q, 3).Value)
objDoc.Bookmarks("summa").Range.InsertAfter (Cells(q, 6).Value)
objDoc.Bookmarks("data").Range.InsertAfter (Cells(q, 1).Value)
q=q+1
Изменено: OG.Dope - 21.11.2018 20:22:10
 
Возможно.
 
Если циклом, то нужно обнулить лист и это всё будет выполняться только при условии первая запись при первом клике, вторая при втором и т.д насколько я понимаю.
Возможно ли использовать специальные указатели? Как например этот?
Код
ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
Изменено: OG.Dope - 21.11.2018 21:37:32
 
Цитата
RAN написал:
Возможно.
Попробовал с указателем, но только потом понял, что указатель возвращает номер строки, а не данные из этой строки... Могли бы подсказать?
 
Цитата
RAN написал:
Возможно.
Разобрался, поменял .Row на .Value, вроде работает)
 
OG.Dope, вернитесь в #5, #6 и #9 и удалите то, что Вы ошибочно считаете цитатой.
На будущее: кнопка цитирования не для ответа!
Страницы: 1
Наверх