2016-07-09 14 views
-2

Dies wird wahrscheinlich etwas sein, das in VBA getan wird, was in Ordnung ist.Excel-Datenvalidierung (Textlänge)

Einige Hintergrundinformationen: Ich möchte die Option Textlänge in Excel Daten Validierung verwenden. Ich muss auf 60 Zeichen oder weniger beschränken. Dies ist jedoch der einfache Teil.

Meine Frage ist, wenn ein Benutzer diesen 60-Zeichen-Schwellenwert überschritten hat, möchte ich nicht, dass meine Fehlermeldung statisch bleibt und eine generische Antwort mit der Aussage "Sie müssen unter 60 Zeichen halten ..." angeben eigentlich count die Anzahl der Zeichen, die der Benutzer versucht hat, in der Zelle zu platzieren, dann auf der Error Alert-Popup möchte ich es genauer, wie zum Beispiel: You have exceeded the 60-character limit by ## characters. Please shorten the input and try again. Wer weiß von einer Lösung?

+2

Die [Worksheet_Change] (https: // msdn. microsoft.com/en-us/library/office/ff839775.aspx) (oder [Workbook_SheetChange] (https://msdn.microsoft.com/en-us/library/office/ff196611.aspx)) Event-Makro kann Daten ersetzen Validierung und fügen Sie viel mehr Funktionalität hinzu. – Jeeped

+1

Bitte geben Sie Ihren Fragetitel nicht in allen CAPS ein. Es ist nicht höflich zu schreien, und es wird dir keine schnelleren Antworten geben. Es macht auch Ihren Titel schwieriger zu lesen, und es ist ziemlich unhöflich und ärgerlich. Korrekter Text ist viel einfacher zu lesen.Du siehst keine anderen Fragetitel in ALLEN CAPS auf der Hauptseite, oder? –

+0

Ich bewerte, dass Sie tatsächlich ein .VSTO-Add-In im Visual Studio mit VB.NET schreiben, nur weil es meiner Meinung nach nur ein kleines bisschen einfacher ist und Sie mehr tun können, zum Beispiel können Sie die Event-Handler für Steuerelemente verwenden , so können Sie auf das TextChanged-Ereignis eines Textfelds zugreifen, um eine Fehlermeldung oder ähnliches anzuzeigen, aber nur für eine Sekunde oder so, und dann fortfahren oder nicht. In VBA ist es, meiner Meinung nach, etwas eingeschränkt, zum Beispiel, keine Event-Handler (meines Wissens) und wie ... keine textbox.enthält Methode ... Aber VB.NET, tut es aber. Probieren Sie es aus :) Es ist nicht zu schwer ... Wird es einen Wirbel geben. –

Antwort

2

ich etwas ähnlich den Code von K Davis in einer anderen Antwort bereitgestellt schrieb. Neben dem Codierungsstil gibt es wichtige funktionale Unterschiede.

• Griffe mehrere Spalten Ziel
• fügt Adresse Nachricht
• die Rogue Zelle wählt nach Benachrichtigung
• Schleifen nach hinten, so dass im Falle von mehreren Rogue-Eingänge, der Benutzer endet an der ersten
up • Deklaration und Zuweisung von Variablen sind reserviert, wenn sie tatsächlich benötigt werden
• Meldungsfeld für kritischen Stopp

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

Sie könnten die Sätze mit einem oder zwei vbLF teilen möchten. Für mich macht es die Alarmmeldung effektiver; besonders so mit der Zelladresse hinzugefügt.

hatte ich gedacht, über all die Schurken Eingangszellenadressen in einer einzigen Nachricht setzen, aber dass die spezifische overdrawn Zeichenzahl ausschließen würde.


Beispieltext mit freundlicher Genehmigung von Lorem Ipsum Generator

+1

Nachdem der Vorgang abgeschlossen ist, sind die Angaben über die Zellen, die neu eingegeben werden sollen, und die überschrittene Anzahl von Zeichen pro Zelle nicht mehr vorhanden. Vorschlag 1) Zellenkommentare können verwendet werden, um die Zellen zu markieren, die erneut eingegeben werden müssen, und die angegebenen Zeichen wurden überschritten. 2) Eine Kombination einer abschließenden Box-Nachricht, um anzuzeigen, dass einige Zellen neu eingegeben werden müssen, während die Kommentare in den Zellen die Zellen markieren und die überzähligen Zeichen anzeigen. – EEM

+1

Cont ... Vorschlag 1 kann durch Ersetzen dieser Zeilen erreicht werden: 'MsgBox mssg, vbCritical + vbOKOnly," Bad Input "' und 'trgt.Areas (a) .Cells (t) .ClearContents: trgt.Areas (a) .Cells (t) .Wählen Sie mit diesen 'Mit trgt.Areas (a) .Zellen (t)' '.AddComment' ' .Comment.Text Text: = mssg' '.Comment.Visible = True' '' .Select' '.ClearContents' End With' ' 'Else' trgt.Areas (a) .Cells (t) .ClearComments' ' End If' – EEM

+0

die [Range.ClearContents Methode] Entfernen (https://msdn.microsoft.com/en-us/library/office/aa223828%28v=office.11%29.aspx) sollte darauf achten. – Jeeped

1

Dank einem Vorschlag von Jeepeed gemacht, führte ich eine Internet-Suche und stolperte über this site. Ich habe den Code dieser Person ein wenig modifiziert, um das zu erreichen, was ich in meiner ursprünglichen Frage brauchte, und möchte ihn teilen, falls jemand anderes auf dasselbe Problem stoßen sollte. Hier

ist der Code:

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

Interessieren Sie sich für Ergänzungen dazu? – Jeeped

0

denke ich, dass mit einer Excel-Formel besser wäre, neben der Zelle:

= IF(LEN(B2) > 60, "You have exceeded the 60-character limit by " 
    & (LEN(B2) - 60) & " characters. Please shorten your input and try again.", "")