セルが文字列 (現時点では 2 つのうちの 1 つ) で始まり、その後にコロンが続き、それ以外 (空白ではない) であることを確認する必要があります。
すなわち:
IP Address:1.2.3.4
FQDN:a.b.c.d
したがって、これらの文字列と「:」のいずれかがセルを開始していることを確認する必要があります。「:」の周りにスペースが存在する可能性があります。
セルが文字列 (現時点では 2 つのうちの 1 つ) で始まり、その後にコロンが続き、それ以外 (空白ではない) であることを確認する必要があります。
すなわち:
IP Address:1.2.3.4
FQDN:a.b.c.d
したがって、これらの文字列と「:」のいずれかがセルを開始していることを確認する必要があります。「:」の周りにスペースが存在する可能性があります。
「確保」の意味がわからない…
これにより、セルが Excel 関数の 2 つの開始値のいずれかを持つかどうかがチェックされます。
=IF(OR(LEFT(A1,5)="FQDN:",LEFT(A1,11)="IP Address:"),TRUE,FALSE)
ただし、コロンの周りの間隔は考慮されていません。そのためには、私があまり得意ではない正規表現です。
-- Tushar Mehta のサイトからコードを取得します: http://www.tmehta.com/regexp/add_code.htm
次に、次のような Excel 関数を使用します。
=regexpfind(A1,"^FQDN\s*:\s*")
=regexpfind(A1,"^IP Address\s*:\s*")
または、これらを次のように 1 つの数式にマージすることもできます。
=regexpfind(A1,"^(FQDN|IP Address)\s*:\s*")
セルが A4 の場合は、Data/Validation でこれを試してください。カスタム式:
=((COUNTIF(A4,"fqdn*")+COUNTIF(A4,"ip address*"))*COUNTIF(A4,"*:*")>0)
注意: これは大文字と小文字を区別しません。
VBAソリューションが必要な場合は、UDFとしてまたはVBAから使用できる関数がここにあります
Option Explicit
Option Base 1
Function CorrectColonPlace(StringtoCheck As String, StartStrings As Variant) As Variant
Dim iPos As Long
Dim j As Long
Dim StrStart As String
'
' return 0 if stringtocheck fails, else the position of the colon
CorrectColonPlace = 0
On Error GoTo FuncFail
iPos = InStr(StringtoCheck, ":")
If iPos > 1 Then
If iPos < Len(Trim(StringtoCheck)) Then
'' assume that StartStrings is either a Range or a 2-dimension single-column array
'' containing the strings to be found at the start of stringtocheck
If IsObject(StartStrings) Then StartStrings = StartStrings.Value2
StrStart = Trim(Left(StringtoCheck, iPos - 1))
For j = 1 To UBound(StartStrings)
If StrStart = Trim(StartStrings(j, 1)) Then
CorrectColonPlace = iPos
Exit For
End If
Next j
End If
End If
FuncFail:
End Function
したがって、答えの 1 つとして与えられた正規表現のアプローチが、私の解決策の基礎となりました。提供されたリンクからコードをコピーし、別のモジュールに貼り付けました。次に、RegExpFind の小さなラッパーを作成しました。これは、基本的に一致を実行し、パターンが成功したかどうかを true または false で返します。
Function RegExpTest(FindIn, FindWhat As String, _
Optional IgnoreCase As Boolean = False)
Dim n As Long
Dim resultsArray As Variant ' Defined as single variant for the benefit of excel 97
Dim result As Boolean
' Don't break on errors. Easier to check if Err<>0
On Error Resume Next
Err.Clear
result = False
resultsArray = RegExpFind(FindIn, FindWhat, IgnoreCase)
' Check if the returned data is an array before proceeding.
If IsArray(resultsArray) = True Then
n = UBound(resultsArray)
If Err.Number = 0 Then
If LBound(resultsArray) <= UBound(resultsArray) Then
result = True
End If
End If
End If
RegExpTest = result
End Function
現在、カスタム検証で直接使用することはできないため、ワークシートがメタデータからオンザフライで生成される (事前に何も作成されない) ことを考えると、 hereの 2 番目の提案に従うことになりました。
私がそれを行った方法は、次の VBA コードを用意することでした (データ検証ルールを作成する方法から抜粋):
Range(Cells(firstIndex, validationFormulaCellRef), Cells(lastIndex, validationFormulaCellRef)).Formula = _
"=RegExpTest(INDIRECT(""D""&ROW()), ""^(FQDN|IP Address)\s*:\s*([\w\d\.]+)$"", TRUE)"
Dim validationFormula As String
validationFormula = "=" & validationFormulaCellName & firstIndex & "=TRUE"
' Now, setup custom validation to check that the referenced cell's value is True
With fieldRange.Validation
.Delete
.add Type:=xlValidateCustom, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, _
Formula1:=validationFormula
.IgnoreBlank = False
.InCellDropdown = False
.InputTitle = ""
.ErrorTitle = "Input Error"
.InputMessage = "This field must start with either 'FQDN' or 'IP Address', plus a colon ':'."
.ErrorMessage = "This field must start with either 'FQDN' or 'IP Address', plus a colon ':'."
.ShowInput = True
.ShowError = True
End With
数式 (実際に機能する) を未使用のセル (EV [validationFormulaCellName] = 152 [validationFormulaCellRef]) に貼り付け、行のはるか先に配置し、データ セルのカスタム検証を設定して、数式セルの値が True かどうかを確認します。 value is the number of the first row I'm inserting, so I end up with a validation formula that like "=EV10=TRUE". 検証式 soas で INDIRECT(..) 構文を使用して、セル参照を生成しますその特定の行については、固定 (例: EV10) のセル ref は各行に対して自動的に調整されないため (すべてが EV10 を参照します) 逆に、検証式は固定されています (例: =EV10=TRUE) が調整されます。挿入時に行ごとにこれらの動作が異なる理由がわかりません。
将来的には、検証する必要がある値 (FQDN と IP アドレス) を、さまざまなデータ (列挙型など) を格納する非表示のワークシートに貼り付けることが理にかなっています。そうすれば、ハードコーディングせずにリストからプログラムで構築できます。
これが最も簡単な方法かもしれません。セル A1 の値をチェックしているとします。
=IF(ISERR(FIND(":",A1)),"Bad!",IF(FIND(":",A1)<>LEN(A1), "OK", "Bad!"))
まず、この式は、セル A1 にコロンがあることを確認します。そうでない場合、それは不良セルです。含まれている場合は、コロンが最後の文字ではないことを確認します。最後の文字の場合、コロンの後にテキストがないため、不良セルです。コロンの後にテキストがあれば、それは良いセルです。お役に立てれば!
- 編集 -
コロンが最初の文字ではないことを確認するには、次の式を使用します。
=IF(ISERR(FIND(":",A1)),"Bad!",IF(OR(FIND(":",A1)=LEN(A1), FIND(":",A1) = 1), "Bad!", "OK"))"Bad!"))
この式では、コロンの前に文字列が必要です。ただし、2 つの文字列のみを確認する必要がある場合は、明示的に確認する方がよいでしょう。
話しているセルに他の人が何も入力できないようにしたい場合は、カスタムのデータ検証式を使用できます。手順は次のとおりです。
「式」ボックスに、次の式をコピーします。
=IF(NOT(ISERR(FIND(":",A1))), AND(FIND(":",A1)<>LEN(A1),FIND(":",A1) <> 1), FALSE)
必要なセルを A1 に置き換えます。これは私の他の回答と同じ式です。特定の文字列ではなく、テキスト、コロン、その他のテキスト (この順序で) があることのみをチェックします。文字列「IP アドレス」と「FQDN」を明示的に確認するには、データ検証ダイアログでこの式を他の誰かの式に置き換えます。
もう1つの解決策があります(文字列が にあると仮定A1
):
=IFERROR(IF(AND(SEARCH(":",A1)>1,SEARCH(":",A1)<LEN(TRIM(A1))),"GOOD","BAD"),"BAD")
これは以下を処理します:
サンプル ファイルは共有されています (別のオプションを使用): https://www.dropbox.com/s/5rxzyzgkg8biffg/StringWithColon.xlsx