[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ピリオドで区切られた範囲のチェック』(素人)
1〜20までの数値以外や「..」「最後がピリオドで終わってない」などがあった場合エラーとしたいのですが
1.2.3. → OK
10.11 → エラー
1.23.3. → エラー
4.15..19. → エラー
教えて下さい。
Alt+F11を押して、挿入-->標準モジュールを選択。
出てきた画面に下記コードをコピペして閉じる。
ワークシート上で、=IsNumChk(A1) と入力します。
OKの場合はTrue、エラーの場合はFalseが返ります。
(ROUGE)
Function IsNumChk(txt As String) As Boolean
Dim x, i As Long
x = Split(txt, ".")
If x(UBound(x)) = Empty Then
IsNumChk = True
For i = 0 To UBound(x) - 1
Select Case x(i)
Case 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
Case Else
IsNumChk = False
End Select
Next
End If
End Function
無理やり数式で。
A1に元の値があるとして
=IF(AND((1<=(0&TRIM(MID(SUBSTITUTE(A1,".",REPT(" ",100)),ROW(INDIRECT("1:"&(LEN(A1)-LEN(SUBSTITUTE(A1,".","")))))*100-99,100)))*1)
*(20>=(0&TRIM(MID(SUBSTITUTE(A1,".",REPT(" ",100)),ROW(INDIRECT("1:"&(LEN(A1)-LEN(SUBSTITUTE(A1,".","")))))*100-99,100)))*1),
RIGHT(A1,1)="."),"OK","エラー")
って入力してShiftキーとCtrlキーを押しながらEnterキーを押してみて。
式の両側が{}が囲まれたらOKだよ。
追記
Excelが2007以降だったら
=IF(AND((INT(((0&TRIM(MID(SUBSTITUTE(A1,".",REPT(" ",100)),ROW(INDIRECT("1:"&(LEN(A1)-LEN(SUBSTITUTE(A1,".","")))))*100-99,100)))-1)/20)=0)
,RIGHT(A1,1)="."),"OK","エラー")
ってしてみて。
(春日野馨)
ROUGEさんのコードとほぼ同じだけどこんなのでも。
Function IsNumChk(txt As String) As Boolean
Dim x As Variant, i As Long
x = Split(txt, ".")
If x(UBound(x)) = Empty Then
For i = 0 To UBound(x) - 1
IsNumChk = False
If Not IsNumeric(x(i)) Then Exit For
If x(i) < 1 Or x(i) > 20 Then Exit For
IsNumChk = True
Next
End If
End Function
(ぶらっと)
データ数は20個までとする。
=IF((MIN(CEILING(MID(SUBSTITUTE(TRIM(A1)&REPT("020.",20),".","0"&REPT(" ",100)),ROW($A$1:$A$20)*100-99,100),200))=200)*(MAX(CEILING(MID(SUBSTITUTE(TRIM(A1)&REPT("020.",20),".","0"&REPT(" ",100)),ROW($A$1:$A$20)*100-99,100),200))=200)*(RIGHT(A1)="."),"OK","エラー")
{Ctrl]+{Shift]+{Enter]で確定 (NB)
=IF(COUNTIF(A1,"*..*"),"エラー",IF(AND(ISERR(FIND(".0","."&A1)),MAX(INDEX(MID(SUBSTITUTE(A1&20&REPT(".20",40),".",REPT(" ",100)),(ROW($1:$40)-1)*50+1,100)*1,))<=20),"OK","エラー"))
(GobGob) 110806 13:23 修正
やり方いろいろということで、イベントでチェックする案です。
下記をシートモジュールにおいて、「チェック範囲」で定義した範囲範囲でデータを 入力してみてください。
既に入力してある内容をチェックしたい場合は、チェック範囲のセルをコピーして、 そのまま貼り付けてみてください。
Private Sub Worksheet_Change(ByVal Target As Range)
Const チェック範囲 = "D2:D1000" '★★★ ここは実際に合わせて変更してください。
If Intersect(Range(チェック範囲), Target) Is Nothing Then Exit Sub
Dim r As Range
For Each r In Intersect(Range(チェック範囲), Target)
NumAndDotCheck r
Next
End Sub
Private Sub NumAndDotCheck(r As Range)
r.Interior.ColorIndex = xlNone
If r.Value = "" Then Exit Sub
Dim numArr
numArr = Split(r.Value & "20", ".")
For Each n In numArr
If n = "" Then
r.Interior.ColorIndex = 3
Exit Sub
End If
If CStr(CInt(n)) <> CStr(n) Then
r.Interior.ColorIndex = 3
Exit Sub
End If
If CInt(n) < 1 Or CInt(n) > 20 Then
r.Interior.ColorIndex = 3
Exit Sub
End If
Next
End Sub
(Mook)
=IF(AND(COUNTIF(A1,"*..*")=0,RIGHT(A1)=".",SUMPRODUCT(COUNTIF(A1,"*"&ROW(A21:A10000)&"*"))=0),"OK","エラー") (NB9
NBさんの案が簡単だね。
0以下対応。
=IF(AND(RIGHT(A1)=".",COUNT(INDEX(FIND("."&ROW($1:$20)&".","."&A1&"."),))=LEN(A1)-LEN(SUBSTITUTE(A1,".",))),"OK","エラー")
(GobGob)
こっちのほうが解りやすいしスッキリかもね。
=IF(LEN(A1)=SUMPRODUCT(ISNUMBER(FIND("."&ROW($1:$20)&".","."&A1&"."))*(LEN(ROW($1:$20))+1)),"OK","エラー")
(GobGob)
1.2.2 2.2.3 1.2.3.4.5.5.5.5.
同じ数字が並ぶとNGだね。。。
最終案
=IF(SUMPRODUCT(LEN(A1)-LEN(SUBSTITUTE((SUBSTITUTE(SUBSTITUTE("@"&A1,".",".@"),"@"&ROW($1:$20)&".",)),"@",)))=LEN(A1),"OK","エラー")
※0以下対応。 ※ピリオド以外の文字でもエラー。
(GobGob)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.