[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『半角の正の整数判定(1,2,3,…)をする関数を自作したい』(マリオ)
半角の正の整数判定(1,2,3,…)をする関数を自作したいです。
'正の整数(PositiveInteger)
イメージは、次のような感じです。
Sub Main() If IsPositiveInteger(str)=True Then 【処理1】 End Sub
Public Function IsPositiveInteger(ByVal str As String) As Boolean 正規表現のCreateObject("VBScript.RegExp")を使った処理 End Function
できれば、Functionで正規表現を使いたいです。 正規表現を使わない方法もあれば、それも知りたいです。
************************************************************
次なら簡単なんですが… 数字判定 If IsNumeric(x) Then
正の数字判定 If Sgn(x)=1 Then
< 使用 Excel:Excel2013、使用 OS:Windows 8.1 >
'御参考:正規表現を使わない方法 Dim flg As Boolean, n As Variant, i As Integer If Val(str) = 0 Or StrConv(Val(str), vbNarrow) <> str Then IsPositiveInteger = False: Exit Function '"0"や"01"はFalseとする For i = 1 To Len(str) flg = False For Each n In Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9") If Mid(str, i, 1) = n Then flg = True Next n If Not flg Then IsPositiveInteger = False: Exit Function Next i IsPositiveInteger = True End Function (mm) 2016/03/15(火) 12:47
'御参考:正規表現 Dim i As Integer, RE Set RE = CreateObject("VBScript.RegExp") RE.Pattern = "[0-9]" If Val(str) = 0 Or StrConv(Val(str), vbNarrow) <> str Then IsPositiveInteger = False: Exit Function '"0"や"01"はFalseとする For i = 1 To Len(str) If Not RE.test(Mid(str, i, 1)) Then IsPositiveInteger = False: Exit Function Next i IsPositiveInteger = True End Function (mm) 2016/03/15(火) 13:19
ネット検索すると、 【正規表現 数値チェック】 http://ips.nekotype.com/1350/
こんなパターンで一発みたいですね。
^([1-9][0-9]*)$
(半平太) 2016/03/15(火) 13:49
こんな感じかな
Sub test() Dim e For Each e In Array(10, -10, "100.00", 100.01) MsgBox e & " is " & IIf(IsPositiveInteger(e), "", "not ") & " an integer" Next End Sub
'正規表現 Function IsPositiveInteger(ByVal txt As String) As Boolean With CreateObject("VBScript.RegExp") .Pattern = "^\d+(\.0+)?$" IsPositiveInteger = .test(txt) End With End Function
'VBA built-in function Function IsPositiveInteger2(ByVal txt As String) As Boolean IsPositiveInteger2 = Int(Abs(txt)) = txt End Function (seiya) 2016/03/15(火) 17:43
こんにちは。
ふだん正規表現など使わないので、資料と首っ引きで作ってみました。 pattern = "^[1-9](\d)*(,(\d){3})*(.\d+)?$" 書き上げてふと見ると、なんとご要望は「整数」じゃない ですか(ガ〜ン
しかも、いまのパターンでは 300000,000が通ってしまう。 (\d)*(,(\d){3})*の部分をカンマのあるパターンないパターンに分ければいいのは分かるのだが、 それでは面白くない。できればワンセンテンスで実現したいという野望を抱き さらに考えてみます。
せっかく書いたので一応そのままアップしておきます。
実務的には、もとの文字列からカンマと小数点をreplaceしたうえで 半平太さんのパターンを適用するのが パターンもシンプルで分かりやすくて良さげです。 ( 佳 ) 2016/03/15(火) 18:39
マリオさん
もし桁区切り(カンマ)も考慮するであれば
.Pattern = "^([1-9]\d{0,2}(,\d{3})*|[1-9]\d*)(\.0+)?$"
に変更してください。 (seiya) 2016/03/15(火) 19:23
To mmさん
'正規表現を使わない方法について ★If Val(str) = 0 Or StrConv(Val(str), vbNarrow) <> str Then なるほど(^^♪
上記のIf処理では、 Val関数の返り値 ex.) 「あ」→「0」 ex.) 「01」→「1」 さらに、半角判定もしてるのですね。
数字には、正の整数以外の数字(小数点「.」、マイナス「-」を含む数字)もあるから、 さらに、For〜nextで調べてるんですかね。 ******************************************************* '正規表現を使う方法について
正規表現、あまり理解してないのですが、 正規表現を使わない方法と発想は同じなのが分かります。
******************************************************* IsPositiveIntegerを次のMainで呼び出してみました。
Sub Main() Dim str As Variant str = Range("A1").Value If IsPositiveInteger(str) = True Then MsgBox "正の整数ですよ(A1セル)" End Sub
mmさん、ありがとうございます。たいへん勉強になりましたm(_ _)m (マリオ) 2016/03/15(火) 19:55
To 半平太さん
ありがとうございますm(_ _)m 正規表現苦手ざんす(^^♪ サクラエディタでは、よく使うけど。
エクセルの学校に投稿するとき、行のはじめに半角スペースを入れたいので(^^♪ 正規表現による置換 置換前「^」 置換後「半角スペース文字」 してます(^^♪
(マリオ) 2016/03/15(火) 19:59
To seiya さん
ありがとうございます。 はじめ、Array(0, "01", "10.00")にして ?って思いました。
.Pattern = "^([1-9]\d{0,2}(,\d{3})*|[1-9]\d*)(\.0+)?$" にしたら、「0」「"01"」は正の整数でなくなりました(#^^#)
「10.00」を正の整数から除外するには、どうするんですかね? 小数点「.」を含むものは全部除外できますか? 正規表現、苦手ざんす(+_+) (マリオ) 2016/03/15(火) 20:00
自分で、いろいろ考えてみたのですが、正規表現を使わないなら、こんなのでもいいかもです。 mmさん、seiyaさんのコードがヒントになりました。
Public Function IsPositiveInteger(ByVal str As String) As Boolean Dim flg As Boolean, x As Long '半角判定 If StrConv(str, vbNarrow) <> str Then Exit Function x = CLng(str)'Clng:表示形式、文字列に対応するため If IsNumeric(x) And x = Int(x) And x >= 1 Then IsPositiveInteger = True End Function (マリオ) 2016/03/15(火) 20:02
そういうことでしたら
.Pattern = "^(\d{1,2}(,\d{3})*|\d+)$"
でよさそうな... (seiya) 2016/03/15(火) 20:06
こっちです (上記編集できず...) .Pattern = "^(\d{1,3}(,\d{3})*|\d+)$"
(seiya) 2016/03/15(火) 20:09
To seiyaさん 対応が早すぎます(^^♪
考えてみたら、「10.00」を正の整数から除外する必要ないかな〜。微妙なとこ。 .Pattern = "^(\d{1,3}(,\d{3})*|\d+)$" も試してみました。ん〜難解な文字が並んでますね(^^♪さっぱり分かりませんが…。 ありがとうございま〜す!(^^)!
(マリオ) 2016/03/15(火) 20:13
To 佳さん
ありがとうございます。試してみました。 .pattern = "^[1-9](\d)*(,(\d){3})*(.\d+)?$" ん〜。
素直なのは、mmさんの If Val(str) = 0 Or StrConv(Val(str), vbNarrow) <> str Then _ IsPositiveInteger = False: Exit Function の後、 文字列に、カンマ「,」、小数点「.」,マイナス「-」がないなら、 IsPositiveInteger = Trueにする方法なのかな〜??
だから、「0〜9」の文字も使わずに、正規表現で調べられるかもかも?
正規表現で、どう表現するのか分かりません…(汗)。
(マリオ) 2016/03/15(火) 20:26
ほとんのどパターンが出尽くしている様相ですが、無理やり。 カンマ混在はOKにしています。
Function IsPositiveInteger(str As String) As Boolean Dim n As Variant
If Len(str) = LenB(StrConv(str, vbFromUnicode)) Then If IsNumeric(str) Then n = CDbl(str) If Sgn(n) = 1 Then If Int(n) = n Then IsPositiveInteger = True End If End If End If
End Function
(β) 2016/03/15(火) 21:20
> 正規表現で、どう表現するのか分かりません…(汗)。
それは回答側で考えます。
あなたのイメージする「半角の正の整数」とは何なのか、言葉でご説明ください。 そこが不明瞭だから、いろんな回答が出ちゃうのです。
(半平太) 2016/03/15(火) 21:33
'strが、正の整数ならTrueを返す Public Function IsPositiveInteger(ByVal str As String) As Boolean Dim flg As Boolean, x As Long
If StrConv(str, vbNarrow) <> str Or IsNumeric(str) = False Then Exit Function If str = Int(str) And str >= 1 Then IsPositiveInteger = True End Function
'strが、正の整数またはゼロならTrueを返す Public Function IsPositiveInteger_Zero(ByVal str As String) As Boolean Dim flg As Boolean, x As Long
If StrConv(str, vbNarrow) <> str Or IsNumeric(str) = False Then Exit Function If str = Int(str) And str >= 0 Then IsPositiveInteger_Zero = True End Function (マリオ) 2016/03/15(火) 22:11
To βさん ありがとうございます。
To 半平太さん すいません。気が回りませんでした。
「半角の正の整数」 明確にすると次のようになります。
■整数のうち、正で負は含まない。 ■ゼロを含まない。 ■100,000は整数←カンマを含んでもOK 「,」 ■100.000は整数←小数点があるがOK 「.」
ex.) -2 , 100.123 などは整数ではありません。
(マリオ) 2016/03/15(火) 22:26
こんなのはダメですよね? 「,12,87」「,,,,」「1,2,3」 (マリオ) 2016/03/15(火) 22:28
もう出してあるよね?
.Pattern = "^([1-9]\d{0,2}(,\d{3})*|[1-9]\d*)(\.0+)?$" (seiya) 2016/03/15(火) 23:08
To seiyさん そうでした。
「,12,87」「,,,,」「1,2,3」は、「not an integer」になりました。
ありがとうございます。
(マリオ) 2016/03/16(水) 00:14
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.