2016-07-09 4 views
-2

Это, вероятно, должно быть чем-то, что делается в VBA, и это нормально.Проверка данных Excel (длина текста)

Некоторая справочная информация. Я хочу использовать параметр длины текста в проверке данных Excel. Мне нужно ограничить до 60 символов или меньше. Однако это легкая часть.

Мой вопрос: если пользователь превысил этот порог в 60 символов, я не хочу, чтобы мое предупреждение об ошибке оставалось статичным и давало общий ответ, говорящий «вы должны хранить ниже 60 символов ...» Я хочу, чтобы это на самом деле count количество символов, которые пользователь попытался разместить в ячейке, а затем всплывающее окно с предупреждением об ошибках. Я хотел бы, чтобы это было более конкретным, например: You have exceeded the 60-character limit by ## characters. Please shorten the input and try again. Кто-нибудь знает о решении?

+2

The [Worksheet_Change] (https: // MSDN. microsoft.com/en-us/library/office/ff839775.aspx) (или [Workbook_SheetChange] (https://msdn.microsoft.com/en-us/library/office/ff196611.aspx)) макрос события может заменить данные валидации и добавления гораздо большей функциональности. – Jeeped

+1

Пожалуйста, не вводите название вопроса во всех CAPS. Не вежливо кричать, и он не даст вам ответов быстрее. Это также затрудняет чтение вашего заголовка, и это довольно грубо и раздражает. Правильный текст с обложкой гораздо легче читать.Вы не видите никаких других названий вопросов во ВСЕХ CAPS на главной странице, не так ли? –

+0

Я оцениваю, что вы на самом деле пишете .VSTO добавляете в визуальную студию с помощью VB.NET, чисто потому, что на мой взгляд это просто немного проще, и вы можете сделать больше, например, вы можете использовать обработчики событий на элементах управления , поэтому вы можете получить доступ к событию TextChanged текстового поля, чтобы отобразить сообщение об ошибке или что-то еще, но только на секунду или около того, а затем продолжить или нет. В VBA это, на мой взгляд, несколько ограничено, например, никакими обработчиками событий (насколько мне известно) и вроде ... нет метода textbox.contains ... Но VB.NET, однако. Попробуйте :) Это не слишком сложно ... Дает ему вихрь. –

ответ

2

я написал что-то похожее на код, предоставленный K Davis в другой ответ. Помимо стиля кодирования, здесь представлены основные функциональные различия.

• обрабатывает несколько целевых столбцы
• добавляет адрес к сообщению
• выбирает изгой ячейки после уведомления
• петель в обратном направлении, так что в случае нескольких изгоев входов, пользователь заканчивает в первых
• декларация и назначение переменных зарезервированы, если они действительно необходимы
• окно с сообщением о критической остановке

Option Explicit 

Private Sub Worksheet_Change(ByVal Target As Range) 

    If Not Intersect(Target, Union(Columns("B"), Columns("D"))) Is Nothing Then 
     On Error GoTo bm_Safe_Exit 
     Application.EnableEvents = False 
     Dim mssg As String, iLimit As Long, a As Long, t As Long, trgt As Range 
     iLimit = 60 
     Set trgt = Intersect(Target, Union(Columns("B"), Columns("D"))) 
     'loop backwards through multiples so we end up at the first rogue entry 
     For a = trgt.Areas.Count To 1 Step -1 
      For t = trgt.Areas(a).Cells.Count To 1 Step -1 
       If Len(trgt.Areas(a).Cells(t).Value2) > iLimit Then 
        mssg = "You have exceeded the " & iLimit & "-character limit by " & _ 
          Len(trgt.Areas(a).Cells(t).Value2) - iLimit & " characters in " & _ 
          trgt.Areas(a).Cells(t).Address(0, 0) & ". Please shorten the input and try again." 
        MsgBox mssg, vbCritical + vbOKOnly, "Bad Input" 
        trgt.Areas(a).Cells(t).ClearContents: trgt.Areas(a).Cells(t).Select 
       End If 
      Next t 
     Next a 
     Set trgt = Nothing 
    End If 

bm_Safe_Exit: 
    Application.EnableEvents = True 

End Sub 

text_length_validation

Вы можете разделить предложения с одним или двумя vbLF. На мой взгляд, это делает сообщение более эффективным; особенно с добавлением адреса ячейки.

Я думал о том, чтобы поместить все адреса ячеек входных ячеек в одно сообщение, но это исключало бы конкретное количество превышенных символов.


Пример текста любезно Lorem Ipsum Generator

+1

По завершении процедуры отображаются указания о повторном вводе ячеек и превышении количества символов на ячейку. Предложение 1) Сотовые комментарии могут использоваться для обозначения ячеек, которые требуют повторного набора, и указанных превышенных символов. 2) Комбинация последнего сообщения в поле, указывающего, что некоторые ячейки нуждаются в повторной печати, в то время как комментарии в ячейках помещают ячейки и указывают превышенные символы. – EEM

+1

Cont ... Предложение 1 может быть достигнуто путем замены этих строк: 'MsgBox mssg, vbCritical + vbOKOnly,« Bad Input »и' trgt.Areas (a) .Cells (t) .ClearContents: trgt.Areas (a) .Cells (t) .Выберите' с этими 'С trgt.Areas (a) .Cells (t)' '.AddComment' ' .Comment.Text Текст: = mssg' '.Comment.Visible = True' '' .ClearContents' .Select' 'Конец With' ' 'Else' trgt.Areas (а) .Cells (т) .ClearComments' ' End If' – EEM

+0

Удаление [метод Range.ClearContents] (https://msdn.microsoft.com/en-us/library/office/aa223828%28v=office.11%29.aspx) должен позаботиться об этом. – Jeeped

1

Благодаря предложению, сделанному Jeepeed, я провел интернет-поиск и наткнулся на this site. Я немного изменил код этого человека, чтобы выполнить то, что мне было нужно в моем первоначальном вопросе, и хотел бы поделиться им в случае, если кто-то другой встретит мою проблему.

Вот код:

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim rng As Range 
    Dim rCell As Range 
    Dim iChars As Integer 
    On Error GoTo ErrHandler 

    'Change these as desired 
    iChars = 60 
    Set rng = Me.Range("B:B") 

    If Not Intersect(Target, rng) Is Nothing Then 
     Application.EnableEvents = False 
     For Each rCell In Intersect(Target, rng) 
      If Len(rCell.value) > iChars Then 
       MsgBox "You have exceeded the 60-character" & _ 
       " limit by " & Len(rCell.value) - iChars & _ 
       " characters." & vbCrLf & "Please shorten" & _ 
       " your input and try again.", vbRetryCancel 
      End If 
     Next 
    End If 

ExitHandler: 
    Application.EnableEvents = True 
    Set rCell = Nothing 
    Set rng = Nothing 
    Exit Sub 

ErrHandler: 
    MsgBox Err.Description 
    Resume ExitHandler 
End Sub 
+0

Вы заинтересованы в дополнениях к этому? – Jeeped

0

Я думаю, что было бы лучше с формулой Excel рядом с клеткой:

= IF(LEN(B2) > 60, "You have exceeded the 60-character limit by " 
    & (LEN(B2) - 60) & " characters. Please shorten your input and try again.", "") 
Смежные вопросы