アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもこちらの識者の方々にはお世話になっています。
VBAの質問です。
IF構文でorを使って複数条件を指定したいのですが、下記のような場合、冗長な気がします。

Sub test()

IF Left$(Cells(1, 1), 1) = "あ" or Left$(Cells(1, 1), 1) = ”い" or Left$(Cells(1, 1), 1) = ”う" Then
Cells(1, 1).EntireRow.Delete

End Sub

条件式で範囲が同一の場合、例えば
IF Left$(Cells(1, 1), 1) = ”あ","い","う" Then
Cells(1, 1).EntireRow.Delete
のように、もっとスッキリした記述方法はありますでしょうか。

A 回答 (7件)

InStrを使うのもシンプルだと思いますが、先頭一文字が対象なら Like演算子 を使ってもいいですね。




If Cells(1, 1) Like "[あいう]*" Then
  MsgBox "Hit!"
End If
    • good
    • 0
この回答へのお礼

なるほど、like演算子にはそういう使い方もあるんですね。とてもわかりやすく、かつシンプルで気に入りました。
すばらしいです。
ありがとうございます。

お礼日時:2013/09/11 00:04

ご質問の趣旨からはちょっとずれるかもしれませんが。

皆さんが教えてくださっているアイディアに加えて、良かったら次のこともご参考になさってください。

必要はなくても、あえて変数を宣言して放り込んでおくと、文字数が減ってスッキリしたり、分かりやすくはなると思います。


Dim rng As Range
Dim cap As String

Set rng = Cells(1, 1)
cap = Left$(rng, 1)

If cap Like "[あいう]*" Then rng.EntireRow.Delete


あとご質問の処理の内容では出す余地がなさそうですが、With ステートメントを使うと、行数は増えますが 1 行中の文字数が減ってスッキリします。


With Worksheets(1)
  .Range("a1").Value = .Range("b1").Value & .Range("c1").Value
  With .Range("e1")
    If .Value = 0 Then .ClearContents
  End With
End With


省略形の「Range("e1") = 0」ではなく、「Range("e1").Value = 0」というふうに考えれば、With により「Range("e1")」を書かないことができるという点に注意してください。
    • good
    • 0
この回答へのお礼

1度しか使わないコードは宣言しなかったんですが、たしかに宣言したほうが見やすいこともありますね。
参考にさせていただきます。
ありがとうございます。

お礼日時:2013/09/11 00:02

例えば、



Sub Sample()
  Select Case Left$(Cells(1, 1), 1)
    Case "あ", "い", "う"
      MsgBox "処理1"
'    Case Else
'      MsgBox "処理2"
  End Select
End Sub


こんなのもアリかもしれないですね。
まだ冗長と言われるかもしれませんが。
    • good
    • 0
この回答へのお礼

select caseで一文字目を判別するんですね。
ワークシート関数も色んなやり方があって面白いと思ったんですが、VBAはそれ以上に方法が多彩ですね。
ありがとうございます。

お礼日時:2013/09/10 23:59

補足、Incharsのテスト画像

「【VBA】IF構文の条件式で範囲が同一の」の回答画像4
    • good
    • 0

IF Inchars("あ,い,う", Left$(Cells(1, 1), 1)) Then



と書くことも可能。
ただし、標準モジュールに次の関数を追加する手間があります。

Public Function Inchars(ByVal Text As String, ByVal C As String) As Boolean
  Inchars = CBool(InStr(1, Text, C, vbBinaryCompare) > 0)
End Function
    • good
    • 0
この回答へのお礼

できました。
ありがとうございます。

ユーザー定義関数(?)を使ってやる方法ですね。
なんだか少し上級者になった気がしますw

お礼日時:2013/09/10 23:56

ふつーに「マクロ的」には,例えば次のように「1つずつ検査」を必要なだけ繰り返して実現するような手です。



sub macro1()
 dim x as string
 dim a as variant
 dim h as variant

 x = left(range("A1"), 1)
 a = array("あ","い","う")

 for each h in a
  if h = x then
   msgbox "FOUND"
   exit sub
  end if
 next
 msgbox "NOT FOUND"
end sub



敢えて奇を衒うなら
sub macro2()
 dim res as variant

 res = filter(array("あ","い","う"), left(range("A1"), 1))
 if ubound(res) = -1 then
  msgbox "NOT FOUND"
 else
  msgbox "FOUND"
 end if
end sub

みたいな事もできますが,だから何?ってカンジはします。
    • good
    • 0
この回答へのお礼

ありがとうございます。
一旦arrayで配列に組み込んでからやる方法ですね。
勉強になります。

お礼日時:2013/09/10 23:54

VBAには残念ながらinclude的なものはないので、


逆に考える

inStr( "あいう", Left$(Cells(1,1)) )
    • good
    • 0
この回答へのお礼

ありがとうございます。
試してみたんですが、"引数は省略できません"のエラーがLeft$で出てしまいました。

お礼日時:2013/09/10 23:52

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