こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Excel VBA IF文がうまく動作しないわけがわかりません…

未熟な私ですが…

セルC2の文字列の6・7桁目に入っている文字により、8桁目の文字を 置き換えるものをつくりました。
例えば、セルのC2に、IRCD-311234 という値があれば
IRCD-31A234 にしなさいというものです

しかし、 ElseIf の条件式にあてはまるものがでてきても、
すべて最初のIFの条件式にしてしまい、Elseifに反応してくれません。
******************************************************
Sub 変換()
Dim DAT As Range
Dim CAR As String
If Mid(Range("C2").Value, 6, 2) = 31 Or 32 Or 33 Then
For Each DAT In Range("A1:P40")
    CAR = CStr(DAT)
If Left(CAR, 5) = "IRCD-" Then
   CAR = Left(CAR, 7) & "A" & Right(CAR, Len(CAR) - 8)
 DAT.Value = CAR
End If
Next

ElseIf Mid(Range("C2").Value, 6, 2) = 37 Or 38 Or 39 Then
For Each DAT In Range("A1:P40")
CAR = CStr(DAT)
If Left(CAR, 5) = "IRCD-" Then
CAR = Left(CAR, 7) & "B" & Right(CAR, Len(CAR) - 8)
DAT.Value = CAR
End If
Next
 End If
 End Sub
******************************************************

本やネットを見ているのですが、何が悪いのか私にはわかりません…。
どうかご指導をお願いいたします。

投稿日時 - 2009-08-20 18:51:13

QNo.5223013

困ってます

質問者が選んだベストアンサー

こんにちは
Select Case ステートメントを使ってみました、ご参考に
Sub 変換2()
  Dim DAT As Range
  Dim CAR As String
  Dim str As String

  Select Case Mid(Range("C2").Value, 6, 2)
    Case 31 To 33: str = "A"
    Case 37 To 39: str = "B"
    Case Else: Exit Sub
  End Select
  For Each DAT In Range("A1:P40")
    CAR = CStr(DAT.Value)
    If Left(CAR, 5) = "IRCD-" Then
      CAR = Left(CAR, 7) & str & Right(CAR, Len(CAR) - 8)
      DAT.Value = CAR
    End If
  Next
End Sub

投稿日時 - 2009-08-20 20:50:08

お礼

なるほど!
すごくシンプルでわかりやすいです!
    Case 31 To 33: str = "A"
    Case 37 To 39: str = "B"
という書き方、勉強になります

ありがとうございました!!

投稿日時 - 2009-08-20 22:28:08

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

相当VBAの経験と勉強しないと、と思う。
同じセル範囲Range("A1:P40")に対して、何度もFor Each  が出たりしているが、普通はやらないのでは。特別の事情があるのかな。
1つのセルを捉えたとき、そのセルに対し
If ○ Then
処理1
elseIf ▼ Then
処理2
Elseif   ■ Then
処理3
else
処理4
End IF
などの該当を判別してしまうはず。
参考
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1111751556
----
> 37 Or 38 Or 39 Then
の書き方も他言語で出来るものもあるが、VBではA=47 Or A=38を繰り返さないといけない。
ーーー
条件が多い場合は、Cace文を勉強して使ったら。

投稿日時 - 2009-08-20 21:29:17

お礼

文字数もいろいろで、位置もいろいろあるので、
何度もFor Each を使いました

実はこの5倍くらいの長さのものをつくっていて、その中で何度もCase文を使っているので、それはわかります。

IF文の知識がたりませんでした
ありがとうございました

投稿日時 - 2009-08-20 22:25:07

ANo.3

If Mid(Range("C2").Value, 6, 2) = 31 Or Mid(Range("C2").Value, 6, 2) = 32 Or Mid(Range("C2").Value, 6, 2) = 33 Then

ですね
もう1個のIF文も同じようにしてください。

投稿日時 - 2009-08-20 19:54:57

お礼

ありがとうございます

私の悩みに的確にお答えいただき、目が覚める思いです。

投稿日時 - 2009-08-20 22:29:14

ANo.2

おそらくお悩みのことと思いますので、コードだけ見てパッと思ったことを書きます。

4行目、

If Mid(Range("C2").Value, 6, 2) = 31 Or 32 Or 33 Then の部分は一つ一つ書かなくてはいけません。

If Mid(Range("C2").Value, 6, 2) = 31 Or Mid(Range("C2").Value, 6, 2) =32 Or Mid(Range("C2").Value, 6, 2) =33 Then

という具合です。

これと同様に12行目も全く同じように変更する必要があります。
...............................................................................................................................................................
このように複数条件を書く場合には「IF」を使うのではなく「Select case」を使うとすっきりします。


Sub 変換()
Dim DAT As Range
Dim CAR As String
Select Case Mid(Range("C2").Value, 6, 2) 'ここ変更
Case 31, 32, 33 'ここ変更
For Each DAT In Range("A1:P40")
CAR = CStr(DAT)
If Left(CAR, 5) = "IRCD-" Then
CAR = Left(CAR, 7) & "A" & Right(CAR, Len(CAR) - 8)
DAT.Value = CAR
End If
Next

Case 37, 38, 39 'ここ変更
For Each DAT In Range("A1:P40")
CAR = CStr(DAT)
If Left(CAR, 5) = "IRCD-" Then
CAR = Left(CAR, 7) & "B" & Right(CAR, Len(CAR) - 8)
DAT.Value = CAR
End If
Next
End Select 'ここ変更
End Sub

おそらくこれで解決できたのではないでしょうか?

解決できない場合はコードを最後までじっくり見てみますのでお知らせください。

投稿日時 - 2009-08-20 19:47:43

お礼

わかりやすく教えていただき、ありがとうございます。

まず誤りを教えていただいた上で、
丁寧により良い方法をご指導いただき、感謝です。

最後の言葉は、「よし、がんばろう」って気持ちになりました。
会社には、わかる人がほとんどいないため、一人でぶつぶついいながら格闘していた私には、とても癒される言葉でした。
ありがとうございました。

投稿日時 - 2009-08-20 22:33:26

ANo.1

>If Mid(Range("C2").Value, 6, 2) = 31 Or 32 Or 33 Then
COBOL じゃないんだから、こんな書き方は無い。32とか33は
「0ではない」=「偽ではない」なので、真になってしまいます。
Select Case Val(Mid(Range("C2").Value, 6, 2)) '正しくはValを使う
  Case 31, 32, 33
    CAR = CStr(DAT)

このように記述しましょう。
どうしてもIfが使いたければ、左辺を手抜きしないで記述します。
If Mid(Range("C2").Value, 6, 2) = 31 _
Or Mid(Range("C2").Value, 6, 2) = 32 _
Or Mid(Range("C2").Value, 6, 2) = 33 Then
イヤでしょ?効率も悪いし・・・

投稿日時 - 2009-08-20 19:47:13

お礼

そうですね、お恥ずかしい。書き方が間違えてました…。

caseは使い勝手の良いものですね。
これから活用します。

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

投稿日時 - 2009-08-20 22:36:40

あなたにオススメの質問