У меня трудности с обоими более ранними ответами.
Я согласен, что проверка важна;пользователь может набрать «2011-4», если он не слишком задумывается о подсказке.Проверка того, что его формат - «Q # ####», безусловно, является шагом в правильном направлении.Однако:
Я бы отметил, что этого уровня проверки недостаточно.«Q5 1234», например, будет соответствовать этому формату.«Q5 1234» предполагает, что пользователь пытался сломать систему, но «Q4 2101» - это простая ошибка.
Оператор Like - ваш единственный выбор в Excel 2003, но с более поздними версиями я бы порекомендовал рассмотретьрегулярные выражения.Я пробовал их с VB 2010. Я не отрицаю, что им трудно понять, но они так много делают для вас.Возможно, на данный момент у тяжеловесов достаточно знаний на его тарелке, но я все же предложил бы взглянуть на некоторые недавние вопросы об их использовании.
Как используется в более ранних ответах, InputBox не достигает цели тяжелых вооружений.Если бы я набрал «Q4 2101» вместо «Q4 2011», а макрос был расширен для проверки невозможных дат, я бы не узнал о своей простой ошибке, если в сообщении об ошибке не указано введенное мной значение.Также я не смог отредактировать «Q4 2101» до значения, которое я хотел набрать.Синтаксис для InputBox: vReply = InputBox (Подсказка, Заголовок, По умолчанию, ...).Поэтому, если бы я рекомендовал использовать оператор Like, я бы предложил:
Sub updatesheet()
Dim vReply As String
Dim Prompt As String
Dim Title As String
Dim UpdateQuarter As Integer
Dim UpdateYear As Integer
' I have found users respond better to something like "Qn ccyy"
Prompt = "Enter period (format: Qn ccyy) to update, or hit enter to escape"
' I find a title that gives context can be helpful.
Title = "Update sheet"
vReply = InputBox(Prompt, Title)
Do While True
' I have had too many users add a space at the end of beginning of a string
' or an extra space in the middle not to fix these errors for them.
' Particularly as spotting extra spaces can be very difficult.
vReply = UCase(Trim(VReply))
vReply = Replace(vReply, " ", " ") ' Does not cater for three spaces
If Len(vReply) = 0 Then Exit Sub
If vReply Like "Q# ####" Then
' I assume your macro will need these value so get them now
' so you can check them.
UpdateQuarter = Mid(vReply, 2, 1)
UpdateYear = Mid(vReply, 4)
' The check here is still not as full as I would include in a macro
' released for general use. I assume "Q4-2011" is not valid because
' the quarter is not finished yet. Is "Q3-2011" available yet? I
' would use today's date to calculate the latest possible quarter.
' I know "You cannot make software foolproof because fools are so
' ingenious" but I have learnt the hard way that you must try.
If UpdateQuarter >= 1 And UpdateQuarter <= 4 And _
UpdateYear >= 2009 And UpdateYear <= 2012 Then
Exit Do
Else
' Use MsgBox to output error message or include it in Prompt
End If
Else
' Use MsgBox to output error message or include it in Prompt
End If
vReply = InputBox(Prompt, Title, vReply)
Loop
End Sub
Наконец, я редко использую InputBox, потому что формы, освоенные, очень просты в создании и предлагают гораздо больший контроль.