[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ピリオドで区切られた範囲のチェック』(素人)
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.