• ベストアンサー

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/17068)
回答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は使い勝手の良いものですね。 これから活用します。 ありがとうございました。

関連するQ&A

  • エクセル VBAで

    変動する数値が、セル A1に入る状況で、 該当シートに Private Sub Worksheet_Change(ByVal Target As Range) If Range("A1").Value = 1 Then Range("C62").Value = "○" ElseIf Range("A1").Value = 2 Then Range("C62:C63").Value = "○" ElseIf Range("A1").Value = 3 Then Range("C62:C64").Value = "○" ElseIf Range("A1").Value = 4 Then Range("C62:C65").Value = "○" ElseIf Range("A1").Value = 5 Then Range("C62:C66").Value = "○" ElseIf Range("A1").Value = 6 Then Range("C62:C67").Value = "○" ElseIf Range("A1").Value = 7 Then Range("C62:C68").Value = "○" ElseIf Range("A1").Value = 8 Then Range("C62:C69").Value = "○" ElseIf Range("A1").Value = 9 Then Range("C62:C70").Value = "○" ElseIf Range("A1").Value = 10 Then Range("C62:C71").Value = "○" ElseIf Range("A1").Value = 11 Then Range("C62:C72").Value = "○" ElseIf Range("A1").Value = 12 Then Range("C62:C73").Value = "○" ElseIf Range("A1").Value = 13 Then Range("C62:C74").Value = "○" ElseIf Range("A1").Value = 14 Then Range("C62:C75").Value = "○" ElseIf Range("A1").Value = 15 Then Range("C62:C76").Value = "○" End If End Sub と言ったマクロを記述しましたが、 動作がどうにも重くて困っています。 一度、プレビューをした後は特に遅くなります。 何か良い解決方法はありますでしょうか?

  • エクセルVBAを修正したい

    数字を入力すると記号に変換になるマクロを 元ファイルを修正して作成したいのですが、 同一シートにC9:M33,C9:Y25,O27:Y29といった 範囲の異なる表がある場合はセル範囲をどのように記述すれば良いでしょうか? StartCol = 4 '開始列 EndCol = 20 '終了列 BlankCount = 0 I = 16 '開始行 L = 14 '行の指定 Do While Len(Range("B" & CStr(I)) & Range("C" & CStr(I))) > 0 For J = StartCol To EndCol If Len(ActiveSheet.Cells(L, J).Value & ActiveSheet.Cells(L + 1,J).Value) > 0 Then tmp = "" If ActiveSheet.Cells(I, J).Value = "×" Or ActiveSheet.Cells(I,J).Value = "中止" Then Else If Len(ActiveSheet.Cells(I, J).Value) = 0 Then K = -1 Else K = ActiveSheet.Cells(I, J).Value End If Select Case K Case 0 tmp = "×" Case 1 To 14 tmp = "△" Case Is >= 15 tmp = "○" End Select End If Next I = I + 1 If Len(Range("B" & CStr(I)) & Range("C" & CStr(I))) = 0 Then L = I + 1 I = I + 3 End If Loop End Sub

  • エクセルvba IFについて(複数条件)

    エクセルvbaでのifの構成について教えてください。 (1)*あいうえお   →あいうえお (2)あいうえお*   →あいうえお (3)*あいうえお*   →あいうえお     に変換させたいです。 以下のマクロを作りました。 Sub test() Dim c As Range For Each c In Selection.Cells If InStr(c, "*") = 1 Then c = Mid(c, InStr(c, "*") + 1) ElseIf InStrRev(c, "*") > 0 Then c = Left(c, InStrRev(c, "*") - 1) End If Next End Sub これだと(1)(2)はできるのですが、(3)は2回実行しないと全ての*が削除できないです。 1回の実行で「あいうえお」ができるようにするにはどうしたらよいのでしょうか。 本当は、 ****あいうえお**  →あいうえお のように、*(半角)や*(全角)が文字の前後についている場合、すべての*(半角)と*(全角)削除したいのですが(できれば1回の実行で)、そのようなことは可能なのでしょうか。 midやleftの作り方も間違っていれば、それもご教授ください。 よろしくお願いします。

  • エクセル VBAマクロ if文 はどうすれば?

    先ほど質問したのですが、さらにわからなくなったのでお願いします 先ほどの質問 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ http://okwave.jp/qa/q7236338.html >変数と式の両立は難しいでしょうからどうすればよいのでしょう?  ⇒関数では出来無いのはエクセルの常識ですのでマクロ(VBA)組込みになります。 一例です。 対象シートタブ上で右クリック→コードの表示→以下のコード貼り付けてA1に枚数を入力して お試しください。 サンプルコード Private Sub Worksheet_Change(ByVal Target As Range) 単価 = 5 If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub If IsNumeric(Target.Value) And Target.Value > 0 Then  Application.EnableEvents = False  Target.Value = Target.Value * 単価  Application.EnableEvents = True End If End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ↓変更&応用したのですが、、、、 EX:(セル)    セル番号  用紙種類1~3       用紙種類    C12   A3モノクロ1     D12  A3カラー1    C13   A3モノクロ2     D13  A3カラー2    C14   A3モノクロ3     D14  A3カラー3 ※金額の違いは、モノクロとカラーの値段が違うだけ  1~3は金額的な違いはない とあった場合、 ためしに先ほどのを応用して用いたのですが 変更点は、用紙サイズ、カラーの有無による金額        出力先セルの番号 Private Sub Worksheet_Change(ByVal Target As Range) を Private Sub A4_mono_1(ByVal Target As Range) Private Sub A4_mono_2(ByVal Target As Range) ・             ・            ・ と変更したのですがうまく動作しなかったのですが、 どういった点が悪かったのでしょうか? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 最終的な質問↓ 上記のものはVBAマクロ文は基本1つのみなので、if文で作らなくてはいけないということが分かったのですが、そこでさらに疑問が浮かびました、 Private Sub Worksheet_Change(ByVal Target As Range) If or(target.columns = C12:C14) Then 単価1 = 7.6 If Intersect(Target, Range("C12:C14")) Is Nothing Then Exit Sub If IsNumeric(Target.Value) And Target.Value > 0 Then Application.EnableEvents = False Target.Value = Target.Value * 単価1 Application.EnableEvents = True単価1 = 7.6 elseif or(target.columns = D12:D14) Then 単価2 = 30.6 If Intersect(Target, Range("D12:D14")) Is Nothing Then Exit Sub If IsNumeric(Target.Value) And Target.Value > 0 Then Application.EnableEvents = False Target.Value = Target.Value * 単価2 Application.EnableEvents = True End If End Sub としたっ場合全く式になっていません どのようにすればよいのでしょう?

  • エクセルVBAを修正したい

    数字を入力すると記号に変換になるマクロを 元ファイルを修正して作成したいのですが、 以下の記述が理解できません。 具体的にどのような処理をしているのか教えて下さい。 Do While Len(Range("C" & CStr(I)) & Range("D" & CStr(I))) > 0 For J = StartCol To EndCol If Len(ActiveSheet.Cells(12, J).Value & ActiveSheet.Cells(13, J).Value) > 0 Then tmp = "" If ActiveSheet.Cells(I, J).Value = "×" Or ActiveSheet.Cells(I, J).Value = "中止" Then ' ActiveSheet.Cells(I, J).Value = "中止" 'ActiveSheet.Cells(I, J + 1).Value = "" Else If Len(ActiveSheet.Cells(I, J).Value) = 0 Then K = -1 Else K = ActiveSheet.Cells(I, J).Value End If Select Case K Case 0 tmp = "×" Case 1 To 9 tmp = "△" Case Is >= 10 tmp = "○" Case Is < 0 tmp = "**" End Select

  • エクセルVBAで最小値を求めたいのですが

    下記はある表の最大値を求めるものですが 同様の条件で最小値を求めようと思い 「MAX」の箇所を「MIN」差し替えてできると思っていたのですが 最小値がのかわりに「0」が表示されてしまいます。 そのように修正すればよいでしょうか? private sub worksheet_change(byval Target as excel.range)  if target.cells(1) = "" then exit sub  if target.address = "$A$1" then   Range("C10:C65536").ClearContents   With Range(Cells(9 + Range("A1").Value, "C"), Cells(Range("A65536").End(xlUp).Row, "C"))    .FormulaR1C1 = "=MAX(RC2:R[" & -Range("A1").Value + 1 & "]C2,FALSE)"    .Value = .Value   End With  elseif target.address = "$E$1" then   Range("G10:G65536").ClearContents   With Range(Cells(9 + Range("E1").Value, "G"), Cells(Range("E65536").End(xlUp).Row, "G"))    .FormulaR1C1 = "=MAX(RC6:R[" & -Range("A1").Value + 1 & "]C6,FALSE)"    .Value = .Value   End With  end if end sub

  • エクセル VBAで

    はじめまして。 VBA初心者です。 エクセルVBAで以下のことをしようとしていますが、 「型が一致しません」とエラーが出ます。 何がおかしいのでしょうか。 やろうとしていることは、以下のようなことです。 G2に入っている値を参照し>0なら、H2に”上昇”と表示。 <0なら、”下降”、=0なら”トンボ”と表示させ、G3以降も G列にデータが入っている限りそのように表示したいと思っております。 よろしくお願いいたします。 Sub 陰陽() If Range("G2:G10000").Value > 0 Then Range("H2:H10000").Value = "上昇" ElseIf Range("G2:G10000").Value < 0 Then Range("H2:H10000").Value = "下降" ElseIf Range("G2:G10000").Value = 0 Then Range("H2:H10000").Value = "トンボ" End If End Sub

  • VBAでIF文を作成したが、もう少しまとめたい。

    以下のようなVBAを作成しました。 動作に問題はないのですが、 もっと簡単にまとめることができる気がしますが、うまくできません。 何かやりかたはあるのでしょうか。 宜しくお願い致します。 If Cells(5, 1).Value = Cells(1, 1).Value Then Cells(100, 100).Select ActiveCell.FormulaR1C1 = Cells(5, 1) End If If Cells(6, 1).Value = Cells(1, 1).Value Then Cells(100, 100).Select ActiveCell.FormulaR1C1 = Cells(6, 1) End If If Cells(7, 1).Value = Cells(1, 1).Value Then Cells(100, 100).Select ActiveCell.FormulaR1C1 = Cells(7, 1) End If If Cells(8, 1).Value = Cells(1, 1).Value Then Cells(100, 100).Select ActiveCell.FormulaR1C1 = Cells(8, 1) End If If Cells(9, 1).Value = Cells(1, 1).Value Then Cells(100, 100).Select ActiveCell.FormulaR1C1 = Cells(9, 1) End If If Cells(10, 1).Value = Cells(1, 1).Value Then Cells(100, 100).Select ActiveCell.FormulaR1C1 = Cells(10, 1) End If

  • マクロ A1のセルの値を見て、B1に値を入力したい。

    エクセルのマクロでA1の値が1ならばB1にaを、2・3・4ならばbを、5ならばCを、それ以外は「該当無し」と入れたいのですが下のマクロではうまく行きません。ぜひご指導ください。 Sub If Left(Cells(1, 1).Value, 1) = 1 Then Cells(2,1).Text = "a" ElseIf Left(Cells(1,1).Value, 1) = 2 Or _ Left(Cells(1,1).Value, 1) = 3 Or _ Left(Cells(1,1).Value, 1) = 4 Then Cells(2,1).Text = "b" ElseIf Left(Cells(z, 37).Value, 1) = 5 Then Cells(2,1).Text = "c" Else: Cells(z, 40).Text = "該当無し" End If End Sub

  • エクセルマクロ if文を繰り返したい

    マクロ初心者です。 以下のようなマクロを作ったのですが、 これをE34まで繰り返しの処理をしたいです。 どこにどんな文章を挟んでいいのかわかりません。 Sub けいさん() If Workbooks("日報.xls").Worksheets("お手本").Range("O22") = "A" Then Workbooks("test.xls").Worksheets("II-1(1)").Range("E11") = "" ElseIf Workbooks("日報.xls").Worksheets("お手本").Range("O22") = "B" Then Workbooks("test.xls").Worksheets("II-1(1)").Range("E11") = "" ElseIf Workbooks("日報.xls").Worksheets("お手本").Range("O22") = "D" Then Workbooks("test.xls").Worksheets("II-1(1)").Range("E11") = "" ElseIf Workbooks("日報.xls").Worksheets("お手本").Range("C22") = "" Then Workbooks("test.xls").Worksheets("II-1(1)").Range("E11") = "" Else Workbooks("日報.xls").Worksheets("お手本").Range("C22").Copy Workbooks("test.xls").Worksheets("II-1(1)").Range("E11").PasteSpecial End If End Sub

専門家に質問してみよう