- ベストアンサー
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 ****************************************************** 本やネットを見ているのですが、何が悪いのか私にはわかりません…。 どうかご指導をお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは 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
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
相当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文を勉強して使ったら。
お礼
文字数もいろいろで、位置もいろいろあるので、 何度もFor Each を使いました 実はこの5倍くらいの長さのものをつくっていて、その中で何度もCase文を使っているので、それはわかります。 IF文の知識がたりませんでした ありがとうございました
- kmetu
- ベストアンサー率41% (562/1346)
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文も同じようにしてください。
お礼
ありがとうございます 私の悩みに的確にお答えいただき、目が覚める思いです。
- yuujgmn
- ベストアンサー率50% (2/4)
おそらくお悩みのことと思いますので、コードだけ見てパッと思ったことを書きます。 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 おそらくこれで解決できたのではないでしょうか? 解決できない場合はコードを最後までじっくり見てみますのでお知らせください。
お礼
わかりやすく教えていただき、ありがとうございます。 まず誤りを教えていただいた上で、 丁寧により良い方法をご指導いただき、感謝です。 最後の言葉は、「よし、がんばろう」って気持ちになりました。 会社には、わかる人がほとんどいないため、一人でぶつぶついいながら格闘していた私には、とても癒される言葉でした。 ありがとうございました。
- nda23
- ベストアンサー率54% (777/1415)
>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 イヤでしょ?効率も悪いし・・・
お礼
そうですね、お恥ずかしい。書き方が間違えてました…。 caseは使い勝手の良いものですね。 これから活用します。 ありがとうございました。
お礼
なるほど! すごくシンプルでわかりやすいです! Case 31 To 33: str = "A" Case 37 To 39: str = "B" という書き方、勉強になります ありがとうございました!!