• ベストアンサー

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

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

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.4

こんにちは 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

dengennao
質問者

お礼

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

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.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文を勉強して使ったら。

dengennao
質問者

お礼

文字数もいろいろで、位置もいろいろあるので、 何度もFor Each を使いました 実はこの5倍くらいの長さのものをつくっていて、その中で何度もCase文を使っているので、それはわかります。 IF文の知識がたりませんでした ありがとうございました

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.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文も同じようにしてください。

dengennao
質問者

お礼

ありがとうございます 私の悩みに的確にお答えいただき、目が覚める思いです。

  • yuujgmn
  • ベストアンサー率50% (2/4)
回答No.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 おそらくこれで解決できたのではないでしょうか? 解決できない場合はコードを最後までじっくり見てみますのでお知らせください。

dengennao
質問者

お礼

わかりやすく教えていただき、ありがとうございます。 まず誤りを教えていただいた上で、 丁寧により良い方法をご指導いただき、感謝です。 最後の言葉は、「よし、がんばろう」って気持ちになりました。 会社には、わかる人がほとんどいないため、一人でぶつぶついいながら格闘していた私には、とても癒される言葉でした。 ありがとうございました。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.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 イヤでしょ?効率も悪いし・・・

dengennao
質問者

お礼

そうですね、お恥ずかしい。書き方が間違えてました…。 caseは使い勝手の良いものですね。 これから活用します。 ありがとうございました。