Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4021 / 13644 ツリー ←次へ | 前へ→

【58821】文字列が選択肢の中に含まれるかを1行で評価したい。 りった 08/11/12(水) 17:02 質問[未読]
【58822】Re:文字列が選択肢の中に含まれるかを1行で... Hirofumi 08/11/12(水) 18:25 回答[未読]
【58823】Re:文字列が選択肢の中に含まれるかを1行で... りった 08/11/12(水) 18:35 質問[未読]
【58824】Re:文字列が選択肢の中に含まれるかを1行で... kanabun 08/11/12(水) 18:36 発言[未読]
【58825】Re:文字列が選択肢の中に含まれるかを1行で... kanabun 08/11/12(水) 18:40 発言[未読]
【58826】Re:文字列が選択肢の中に含まれるかを1行で... りった 08/11/13(木) 9:08 お礼[未読]

【58821】文字列が選択肢の中に含まれるかを1行で...
質問  りった  - 08/11/12(水) 17:02 -

引用なし
パスワード
   いつもお世話になっております。

イメージとしては
if getXXX ∈ { AAA , BBB , CCC } then
といった感じに書きたいです。なにか良い書き方無いでしょうか?
(意味:getXXXの戻りが、AAA又はBBB又はCCCの場合は)


if getXXX = AAA or getXXX = BBB or getXXX = CCC then
は、getXXXを3回も書くので処理速度及びメンテナンス性の面でいまいちです。

Dim s As String
s = getXXX
if s = AAA or s = BBB or s = CCC then
は、1行でかけない点が不満です。パッと見も解かりづらい。

【58822】Re:文字列が選択肢の中に含まれるかを1行...
回答  Hirofumi  - 08/11/12(水) 18:25 -

引用なし
パスワード
   こんなでは

Option Explicit

Public Sub Test()

  Const cstrMark = ":AAA:BBB:CCC:"
  
  Dim getXXX As String
  
  getXXX = "AAA"
  
  If InStr(1, cstrMark, ":" & getXXX & ":", vbBinaryCompare) > 0 Then
    MsgBox "有ったよ!!", vbInformation
  Else
    MsgBox "無いよ!!", vbInformation
  End If
  
End Sub

【58823】Re:文字列が選択肢の中に含まれるかを1行...
質問  りった  - 08/11/12(水) 18:35 -

引用なし
パスワード
   回答有難う御座います。
でもそれでは、下記難点が有ります。
・AAA,BBB,DDDと比較出来ない。結局cstrMarkを作る行とif文で2行以上になりそう。
・getXXXの戻りが"A:B"だった場合に判定失敗しそう(試してません)

説明不足で恐縮ですが、AAAはConstのつもりで書きました。文字列自体では無いです。

【58824】Re:文字列が選択肢の中に含まれるかを1行...
発言  kanabun  - 08/11/12(水) 18:36 -

引用なし
パスワード
   ▼りった さん:
> Dim s As String
> s = getXXX
> if s = AAA or s = BBB or s = CCC then
> は、1行でかけない点が不満です。パッと見も解かりづらい。

その AAA とか BBB とか、CCC は 変数ですか?
変数なら、宣言しなくちゃ。
> Dim s As String
 Dim AAA as string
 Dim BBB as string
 Dim CCC as string
 Select Case s
  Case AAA, BBB, CCC
    Msgbox "あり"
  Case Else
    Msgbox "なし"
 End Select

> getXXXを3回も書くので処理速度及びメンテナンス性の面でいまいちです。
>
1行で書くと処理速度が速くなるわけじゃないですよ。
> if getXXX = AAA or getXXX = BBB or getXXX = CCC then
と書くより、
 if getXXX = AAA then
    Msgbox "あり"
 elseif getXXX = BBB then
    Msgbox "あり"
 elseif getXXX = AAA then
    Msgbox "あり"
 else
    Msgbox "なし"
 end if
のほうが、少なくとも判断する回数は少なくて済みます。

理由は
> if getXXX = AAA or getXXX = BBB or getXXX = CCC then
のほうは、getXXX = AAA が True(真)のときでも、
2番目、3番目の判断↓
  if getXXX = BBB ?
  if getXXX = CCC ?
も必ず実行するからです。

【58825】Re:文字列が選択肢の中に含まれるかを1行...
発言  kanabun  - 08/11/12(水) 18:40 -

引用なし
パスワード
   一行にこだわれば、

 Dim strArray
 Dim s As String
 Dim m
 strArray = [{"あ","い","う","え","お"}]
 s = "お"
 
 m = Application.Match(s, strArray, 0) '一行で判断
 
 If IsNumeric(m) Then
   MsgBox "あり"
 Else
   MsgBox "なし"
 End If

【58826】Re:文字列が選択肢の中に含まれるかを1行...
お礼  りった  - 08/11/13(木) 9:08 -

引用なし
パスワード
   回答有難う御座います。おかげさまで1行で書けました。
実際書いてるプログラムは膨大で、一部分のサンプルを元に質問させて頂いているので、質問内容が解かりにくかったかも知れません。お手数をおかけしました。
(宣言行、m・strArrayを定義する行は書きたくない。ローカル変数も増やしたくない。)

Const AAA = "dkfaj"
Const BBB = "ejfkadj"
Const CCC = "dkjaj"

Sub test()
 If IsNumeric(Application.Match("か", Array(AAA, BBB, CCC), 0)) Then ' ★
   MsgBox "あり"
 Else
   MsgBox "なし"
 End If
End Sub

Function getXXX() As String
 Dim s As String
 s = ""
 ' 〜いろんな処理〜
 getXXX = s
End Function

4021 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free