プロが教える店舗&オフィスのセキュリティ対策術

皆様こんばんは。

下記のxの中にyの有無を調べて、条件分岐したいのです。

変数xの中身: 2, 5,18,・・・nm
 カンマで区切られた半角数字(整数)が文字列として入っています。
 0(ゼロ)は含まず、1~9は数字の前に半角スペースを入れています。
 数字はランダムですが、並びは昇順で二桁までとしています。

変数yの中身:1~99
 半角数字(整数)で数値または文字列です。

セルの直接検索(FIND)も考えましたが、セル位置を特定するのも大変かなと思ってます。
 
まだ構想中で具体的にどうするか(どうなるか)を決めていないのですが
よろしくご教示下さい。

Excel2010でVBA初心者です。

質問者からの補足コメント

  • へこむわー

    (訂正)
    変数xの中身: 2, 5,18,・・・,nm
    nm(最大99)の前にカンマが抜けていました...。

      補足日時:2017/02/18 22:13
  • こんばんは。早速のご回答、誠にありがとうございます。(動作良好ですが、補足に書いてスミマセン)
    >xの中にyの有無を調べる関数を作成して呼んでいます。
    >If contains(x, y) Then
    > Function contains(x As String, y As String) As Boolean
    関数をsiffon9さんが自作したって事なのでしょうか??
    Functionって他にも作れるのでしょうか?
    関数を作るってトコロがちょっと衝撃的です...。

    >If CStr(e) = y Then
    CStr(e)はどのような意味なのでしょうか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/02/18 22:48

A 回答 (3件)

こんな感じでしょうか?


xの中にyの有無を調べる関数を作成して呼んでいます。

Sub test()
Dim x As String, y As String
x = "2, 5,18,20,30,40nm"
' y = "20" '文字列
y = 20 ' 数値

If contains(x, y) Then
MsgBox "見つかりました"
Else
MsgBox "見つかりません"
End If
End Sub




Function contains(x As String, y As String) As Boolean
Dim x1 As String
Dim e As Variant
Dim f As Boolean

x1 = Replace(x, " ", "") ' 空白を削除
x1 = Replace(x1, "nm", "") ' nm を削除

f = False
For Each e In Split(x1, ",")
If CStr(e) = y Then
f = True
Exit For
End If
Next
contains = f
End Function
この回答への補足あり
    • good
    • 0
この回答へのお礼

そのまま使えましたのでBAとします。
ありがとうございました♪
また機会があればよろしくご教示ください!

お礼日時:2017/02/24 17:56

No1の方と同じようにxの文字をばらして個々に検査する方法になります。


Option Explicit

Public Sub sample()
Dim x As String
Dim y As String
Dim z As Variant
Dim i As Long
Dim flag As Boolean
x = "2, 5,18,20,99"
y = "20"
z = Split(x, ",")
flag = False
For i = 0 To UBound(z)
If CLng(z(i)) = CLng(y) Then
flag = True
Exit For
End If
Next
If flag = True Then
MsgBox ("xの中にyが含まれています")
Else
MsgBox ("xの中にyが含まれていません")
End If
End Sub
    • good
    • 0
この回答へのお礼

こんにちは。
お礼が遅くないりすみません。
コーディングもありがとうございました。
記述する人により異なるものですね。

お礼日時:2017/02/24 17:54

No.1です。



> Functionって他にも作れるのでしょうか?

もちろん作れますよ。
プログラムの構成や規模によっては、関数やプロシージャ(Subのことね)で機能毎に分割したほうが全体の見通しが良くなりますね。

> CStr(e)はどのような意味なのでしょうか?

For Eachの中でカンマで分割した配列から一個の要素を取り出す変数eをVariant型で宣言しています。
CStrは括弧の中のデータを文字型に変換する関数です。

If CStr(e) = y では文字列を比較するので、CStr(e)と書いてeの中身を文字列型に変換することを明示しています。
明示はしなくても自動変換されて動作すると思いますが、明示することで後々プログラムをみた時に、ここで文字列の比較をしていることが判り易くなります。
今回は小さなプログラムなのであまり関係ないですが……。
要はプログラムの保守性の問題ですね。


あと、nmの前にカンマがあるのでしたら、
> x1 = Replace(x1, "nm", "") ' nm を削除
は無くても良いです。(あっても良い)
    • good
    • 0
この回答へのお礼

こんにちは。
ワークシート関数とVBAのfunctionとで「関数」が2つあるのですね。
CStrにも意味があるのがよくわかりました。
丁寧なご解説ありがとうございました♪

お礼日時:2017/02/24 17:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!