[[20110805164431]] 『ピリオドで区切られた範囲のチェック』(素人) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ピリオドで区切られた範囲のチェック』(素人)

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.