Здравствуйте, форумчане. Такая ситуация , есть код по заполнению таблицы данными с формы. Затем есть код проверки столбца на повторение конкретного значения в ячейке в соответствии с заданным изначально значением. Проверка выполняется по клику на кнопке переноса данных с формы на лист (коммандбаттон_клик) При нахождении повторения появляется 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
Это хорошее начало на пути к достижению моей цели, уже благодарен. Но возможно ли сделать так, чтобы при нажатии на кнопку да, он не закрывал программу полностью, а оставлял форму, на которой было бы можно просто поставить галочку на другой пункт?
Ваш макрос написан так, что вкорячить туда простейшую команду становится проблемой. Можно переписать так
Код
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 не связывался ещё, вот и накорячил как мог..)
Не могли бы Вы оказать мне ещё одну консультацию (помощь)
Код
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
Если циклом, то нужно обнулить лист и это всё будет выполняться только при условии первая запись при первом клике, вторая при втором и т.д насколько я понимаю. Возможно ли использовать специальные указатели? Как например этот?