エクセルマクロでエラーが発生する問題の解決方法

このQ&Aのポイント
  • エクセルのマクロでIf thenを作成していますが、エラーが発生してしまいます。初心者であり、解決法がわかりません。以下の表のC列にGroupのコード数字に対応する製品名を入れるマクロを作成していますが、エラーが出てしまいます。基本的な間違いがあるのだと思いますが、どうすればいいでしょうか。
  • エクセルのマクロでIf thenを使用する際にエラーが出てしまいます。初心者であり、解決方法がわかりません。以下の表のC列にGroupのコード数字に対応する製品名を入れるマクロを作成しているのですが、エラーが発生してしまいます。基本的なミスがあると思いますが、どのような対処法があるでしょうか。
  • 初心者がエクセルのマクロでIf thenを使用していますが、エラーが発生してしまいます。以下の表のC列にGroupのコード数字に対応する製品名を入れるマクロを作成しているのですが、エラーが出てしまいます。基本的なミスがあるのでしょうが、どのように修正すればよいでしょうか。
回答を見る
  • ベストアンサー

エクセル マクロ If then を作っていますが、エラーがでてしまいます。

お世話になります。 マクロ初心者で初めてVBAを作っております。 本を読みながらコードを作ったのですが、作成中にエラーが出てしまい検索しても解決できませんでした。 誠に申し訳ありませんが、以下のご指導をお願いできますでしょうか。 どうぞよろしくお願いいたします。 以下の表のC列にGroup のコード数字に対応する製品名を入れる。 A  B     C 1 Group 製品 2  100 部品A 3 200    部品B 4 300    部品C 5 200    部品B 6 200    部品B 7 300    部品C Sub Product Group() With ActiveSheet .Range("C2").Select Do Until ActiveCell.Offset(0, -1).Value = "" With ActiveCell If .Offset(0, -1).Value = 100 Then .Value = "部品A" elself .Offset(0, -1).Value = 200 then .Value = "部品B" elself .Offset(0, -1).Value = 300 then .Value = "部品C" End If End With Loop End Sub 実際は複数のグループ数字が1つの部品#に相対しており行数が5000程ある為、何とかこのマクロを組みたいと思ったのですが、行き詰ってしまいました。 基本的な間違いがあるのだとは思いますが、何卒ご教示の程お願いします。

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

  • ベストアンサー
  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.4

同じところをループしてるようですね 以下のようにしてはいかがでしょう。 Sub Product_Group() With ActiveSheet .Range("C2").Select Do Until ActiveCell.Offset(0, -1).Value = "" With ActiveCell If .Offset(0, -1).Value = 100 Then .Value = "部品A" ElseIf .Offset(0, -1).Value = 200 Then .Value = "部品B" ElseIf .Offset(0, -1).Value = 300 Then .Value = "部品C" End If End With ActiveCell.Offset(1, 0).Activate 'この行を追加 Loop End With End Sub

その他の回答 (5)

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.6

> 本当に基本的な事なのでしょうが、 > ”ElseIf .Offset(0, -1).Value = 200 Then”で > 「修正候補:ステートメントの最後」 > と出てしまいます。 当方では出ないのですが… すべてコピーしてご利用されたのですよね。 何か追加しましたか?

nomamaco
質問者

お礼

kmetuさん 本当にすみません。そしてありがとうございました。 文字のチェックはしたつもりでしたが、なにか違う所があったようです。 全てコピーして、セル位置を直したら動きました。 お手数をおかけし、本当にすみません。 ありがとうございます。 お恥ずかしい話ですが初めてのマクロ作成で、一人ではどうしようもない状態になっていました。 マクロが動いたとき、本当にうれしかったです。 ありがとうございました。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.5

途中に空白行がある場合は以下のほうがいいと思います。 Sub Product_Group() Dim i As Integer Range("C2").Select For i = 2 To Range("B65536").End(xlUp).Row With ActiveCell If .Offset(0, -1).Value = 100 Then .Value = "部品A" ElseIf .Offset(0, -1).Value = 200 Then .Value = "部品B" ElseIf .Offset(0, -1).Value = 300 Then .Value = "部品C" End If End With ActiveCell.Offset(1, 0).Activate Next i End Sub

nomamaco
質問者

お礼

kmetuさん 重ねての早速のご回答ありがとうございます。 追加行入れてみようと思うのですが、別のところでコンパイルエラーが出てしまいます。 本当に基本的な事なのでしょうが、 ”ElseIf .Offset(0, -1).Value = 200 Then”で 「修正候補:ステートメントの最後」 と出てしまいます。 申し訳ありませんが、エラーの解決法ご教示お願いできませんでしょうか?

  • pentium100
  • ベストアンサー率45% (689/1517)
回答No.3

Vlookupを使って関数で処理した方が速いのではないですか? マクロを組む理由が分かりません。 別のシートでも何でもいいので以下の表を作ります。 コード 製品名 100 A 200 B 300 C 上の表がSheet2のA1:B4にあるとします。 B2セルにコード番号が「100」とありますのでこれを検索してみましょう。 C3セルに次の式を入れます =VLOOKUP(B2,Sheet2!A2:B4,2,FALSE) 部品名「A」が返ってきませんか? それともあくまで「VBAで処理するのが目的」でしょうか。

nomamaco
質問者

お礼

早速のご回答ありがとうございました。 Vlookupで試してみます。 マクロで組もうと思ったのはコードだけで20程あり、過去のファイル(シート数12)も見る必要があるため、一旦作ってしまえば楽に出来るのではないかと思った為です。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

IF文でEndIf までのブロックで、行分け(改行)には守らなければならない決まりが在ると思う。 If .Offset(0, -1).Value = 100 Then .Value = "部品A" elself .Offset(0, -1).Value = 200 then .Value = "部品B" elself .Offset(0, -1).Value = 300 then .Value = "部品C" End If 参考 http://excelvba.pc-users.net/fol6/6_1.html Thenのあとに続けて書けるのは 処理が1行で書ける場合で、該当しない場合は何もしないとき。 この点を修正してエラーが出るようだったら(見当ハズレなので、すみません)補足してください。 === 他にCASE文の利用があり、すっきりしてわかりやすいので、Googleでも「VB CASE文」で照会して勉強してください。

nomamaco
質問者

お礼

早速のご回答ありがとうございました。 改行なのですが、「elself .Offset(0, -1).Value = 200 then 」のところで、なぜか"then"がハイライトされ、「コンパイルエラー 修正候補:ステートメントの最後」と出てしまいます。 大変申し訳ありませんが、もし解決方法あるようでしたらご教示お願いします。

  • A88No8
  • ベストアンサー率52% (834/1602)
回答No.1

こんにちは  もしかして、Offsetの座標が全く変わっていないのでは? Sub Product Group()   With ActiveSheet     .Range("C2").Select     Do Until ActiveCell.Offset(0, -1).Value = ""       With ActiveCell         If .Offset(0, -1).Value = 100 Then .Value = "部品A"         elself .Offset(0, -1).Value = 200 then .Value = "部品B"         elself .Offset(0, -1).Value = 300 then .Value = "部品C"       End With     Loop   End With End Sub

nomamaco
質問者

お礼

A88No8さん 早速のご回答ありがとうございました。

関連するQ&A

  • エクセルVBAのIf ~ Thenステートメントで

    予約フォームの作成に挑戦しています。 予約日が2022年8月1日の時のみ、シート4に結果を記入して行きたいのですが、 Private Sub CommandButton1_Click() If ListBox1.Text = "44774" Then Sheet4.Select Range("C2").End(xlDown).Offset(1, 0).Select ActiveCell.Value = Reservationform.ListBox2.Value ActiveCell.Offset(0, 1).Value = Reservationform.ListBox3.Value ActiveCell.Offset(0, 2).Value = Reservationform.ListBox4.Value ActiveCell.Offset(0, 2).NumberFormat = Range("C2").NumberFormat Exit Sub End If End Sub で、とりあえず成功しています。 "44774" の部分を、"Sheet6のA2"だった時のみ結果を記入するようにしたいです。 " "の中身をそのまま変えて、 If ListBox1.Text = "sheet6.Range("A2")" Then や If ListBox1.Text = "sheet6.Cells(2, 1).Value" Then に変えてみましたがうまく行きませんでした。 どのようにしたら良いでしょうか?

  • エクセルVBAで無限ループ

    教えてください。 以下の2つのエクセルマクロはまったく同じことをさせようとしているのですが、test02の方は.Offset(1).Activateが働かないのか、無限ループに陥ってしまいます。 単にActiveCell.という記述をWith~End Withでまとめただけなのになぜこうなるのでしょうか? Sub test01() ActiveSheet.Cells(1, 1).Activate Do While ActiveCell.Value <> "" If Not IsNumeric(ActiveCell.Value) Then ActiveCell.Offset(0, 1).Value = "文字" ElseIf ActiveCell.Value > 0 Then ActiveCell.Offset(0, 1).Value = "正数" ElseIf ActiveCell.Value < 0 Then ActiveCell.Offset(0, 1).Value = "負数" Else ActiveCell.Offset(0, 1).Value = "その他" End If ActiveCell.Offset(1).Activate i = i + 1 Application.StatusBar = i Loop End Sub Sub test02() ActiveSheet.Cells(1, 1).Activate With ActiveCell Do While .Value <> "" If Not IsNumeric(.Value) Then .Offset(0, 1).Value = "文字" ElseIf .Value > 0 Then .Offset(0, 1).Value = "正数" ElseIf ActiveCell.Value < 0 Then .Offset(0, 1).Value = "負数" Else .Offset(0, 1).Value = "その他" End If .Offset(1).Activate i = i + 1 Application.StatusBar = i Loop End With End Sub

  • エクセルのマクロで

    お世話になります 下記のマクロで実行した所 100まで書式設定で保護、ロックしたいのですが b3:l3はロックするものの 4行目以降はロックしません どうしたらいいでしょうか もう1つ、このシートはいつもc3からはじめたいのですが If ActiveCell.Value >= "" Then の部分はどうしたらいいでしょうか よろしくおねがいいたします 初心者でバカな質問ですみません Sub マクロ1() Dim i As Integer For i = 1 To 100 If ActiveCell.Value >= "" Then Range("B3:l3").Select Selection.Locked = True Selection.FormulaHidden = False End If ActiveCell.Offset(1, 0).Select Next End Sub

  • Do loopのマクロ

    以下のマクロの問題点を教えていただきたいのです。 A列を上から順番に調べて、値が10のときだけBに分岐して処理を行い(処理の内容は省略してあります)、またAに戻って、空白のセルが見つかったら処理をやめる、というマクロです。 ところが、これを実行すると空白のセルが見つかってもマクロが止まりません。何が問題でしょうか。 Sub A() Cells(1, 1).Select A: Do Until ActiveCell.Value = "" If ActiveCell.Value = 10 Then GoTo B End If ActiveCell.Offset(1, 0).Select Loop B: ActiveCell.Offset(1, 0).Select GoTo A End Sub

  • 連続印刷処理前に確認しOKしてから再開するマクロ

    連続印刷マクロを作成したのですが、印刷の手前で確認を入れたいので、その処理を教えてください。 エクセルの表は項目が14列あり、999行です。 印刷は、2種類のシートに分け印刷できるようになっているのですが、確認は1度だけを考えています。 Sub 印刷_Click() Worksheets("集計・印刷").Activate '作業シート名 Range("A2").Select '番号(001~999)をこの次の"A3"セルより転記される。 Do '↓ ※1度の作業で15個の番号を最大とします。 'アクティブセルを1つ下に移動 ActiveCell.Offset(1, 0).Select '1度の作業で15枚印刷する。 '空欄であれば、プログラムを終了する 'Trim関数は前後のスペースを消去する If Trim(ActiveCell.Value) = "" Then Exit Do End If '非表示セルは印刷の対象としない If ActiveCell.EntireRow.Hidden = False Then If ActiveCell.Offset(, 2).Value = "単品" Then 'C列で単品の判断をする。 With Worksheets("A") 'Aシートへ記入 .Range("C3").Value = ActiveCell.Offset(0, 0).Value '番号 .Range("L24").Value = ActiveCell.Offset(0, 2).Value '種類 .Range("F3").Value = ActiveCell.Offset(0, 3).Value '型式 .Range("C23").Value = ActiveCell.Offset(0, 4).Value '測定日 .Range("C24").Value = ActiveCell.Offset(0, 5).Value '製造日 .Range("C9").Value = ActiveCell.Offset(0, 6).Value 'ライン .Range("C10").Value = ActiveCell.Offset(0, 7).Value '担当 .Range("C7").Value = ActiveCell.Offset(0, 9).Value '外観 .Range("C8").Value = ActiveCell.Offset(0, 10).Value '気密 '繰返し処理をしているので一度に印刷される。 .PrintOut End With ElseIf ActiveCell.Offset(, 2).Value = "複数品" Then'C列で複数品の判断をする。 With Worksheets("B") 'Bシートへ記入 .Range("C3").Value = ActiveCell.Offset(0, 0).Value '番号 .Range("L24").Value = ActiveCell.Offset(0, 2).Value '種類 .Range("F3").Value = ActiveCell.Offset(0, 3).Value '型式 .Range("C23").Value = ActiveCell.Offset(0, 4).Value '測定日 .Range("C24").Value = ActiveCell.Offset(0, 5).Value '製造日 .Range("C9").Value = ActiveCell.Offset(0, 6).Value 'ライン .Range("C10").Value = ActiveCell.Offset(0, 7).Value '担当 .Range("C7").Value = ActiveCell.Offset(0, 9).Value '外観 .Range("C8").Value = ActiveCell.Offset(0, 10).Value '気密 .Range("C11").Value = ActiveCell.Offset(0, 23).Value '(1)min .Range("C12").Value = ActiveCell.Offset(0, 24).Value '(1)max .Range("F7").Value = ActiveCell.Offset(0, 25).Value '(2)min .Range("F8").Value = ActiveCell.Offset(0, 26).Value '(2)max '繰返し処理をしているので一度に印刷される。 .PrintOut End With End If End If Loop End Sub

  • マクロよ動け

    VBA 難民です。 Excel で、左のセルが空白の場合、印刷文字を見えなくするつもりのマクロを作ってみましたが、知らん顔をされます。声の掛け方がまだよくわかってないのです。 こっちを向かせる方法を教えて下さい。よろしくお願いします。 Sub MacroWhiter() Dim a As Variant Dim b As Variant a = ActiveCell.Value b = ActiveCell.Offset(0, -1).Value '一つ左のセルの値 Range("B1").Activate 'ここから始める Do Until IsEmpty(ActiveCell.Value) '空きセルまで続ける If b = 0 Then 'ゼロの場合 ActiveCell.Font.Color = 2 '文字を白色にする ActiveCell.Offset(1, 0).Activate '下の行に移る End If Exit Do Loop '繰り返す a = ActiveCell.Value

  • エクセルのマクロについて

    Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "ア") = 0 Then If InStr(.Cells(i, "D"), "ア(半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub このエクセルマクロはC列に「ア」があって、D列に「ア(半角)」の文字がない場合はメッセージというマクロなのですが、このマクロをア~ンまで同じ作業をしたいのですが、ひとまとめにマクロを組む事はできるのでしょうか?できる場合どのようにすれば良いでしょうか? 下記のようにして見たのですができませんでした。 Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "[ア-ン]") = 0 Then If InStr(.Cells(i, "D"), "[ア-ン](半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub

  • 列幅、行の高さを指定するマクロ

    元マクロ初心者(今はほとんど忘れています)です。 列幅、行の高さを変更するマクロを以前作りました。 セルに指定する列幅を入力するのですが、 最近100以上の値の時はスキップされることに気づきました。 100以上の値でも処理されるようにするにはどうすればよいでしょうか。 Sub 列幅変更マクロ() ' ' Macro1 Macro ' マクロ記録日 : 2004/1/31 ユーザー名 : ' 列幅の変更 ' Keyboard Shortcut: Ctrl+l ' If MsgBox("→:列幅を変更します。右の方向にセル内の数値に従って処理しています。一番右のセルに半角で「@」を終わりの印として入力してください。", vbOK) = 1 Then Do Until ActiveCell.Value = "@" If ActiveCell.Value < 100 Then If ActiveCell.Value > 0 Then Selection.ColumnWidth = ActiveCell.Value End If End If ActiveCell.Offset(0, 1).Select Loop End If End Sub Sub 行の高さ変更マクロ() ' ' Macro2 Macro ' マクロ記録日 : 2004/2/1 ユーザー名 : ' 行の高さ変更 ' Keyboard Shortcut: Ctrl+p ' If MsgBox("↓:行の高さを変更します。下の方向にセル内の数値に従って処理しています。一番下のセルに半角で「@」を終わりの印として入力してください。", vbOK) = 1 Then Do Until ActiveCell.Value = "@" If ActiveCell.Value < 100 Then If ActiveCell.Value > 0 Then Selection.RowHeight = ActiveCell.Value End If End If ActiveCell.Offset(1, 0).Select Loop End If End Sub

  • Excel VBAフォーム 登録ボタンの作成方法

    いつもお世話になっています。 初めて、Excelのフォームで入力画面を作りました。 複数の項目があって、それを最後に[登録]ボタンをクリックで 表に入れたいのですが、一度にまとめて実行する方法が分かりません。 アドバイスよろしくお願いいたします。 Private Sub cmd_1() Dim i As String If man.Value = True Then ActiveCell = man.Caption End If If woman.Value = True Then ActiveCell = woman.Caption End If ActiveCell.Offset(0, 1).Select End Sub Private Sub cmd_2() Dim i As String If man.Value = True Then ActiveCell = Yes.Caption End If If woman.Value = True Then ActiveCell = No.Caption End If ActiveCell.Offset(0, 1).Select End Sub Private Sub cmd_downlist() Dim ListNo As Long ListNo = group.ListIndex ActiveCell.Value = group.List(ListNo, i) ActiveCell.Offset(0, 1).Select End Sub Private Sub cmd_comment() ActiveCell = comment.Text ActiveCell.Offset(1, -3).Select End Sub

  • Excelの目次作成のマクロ

    Excel 2000 で本の目次を作りたいと、思いネットで下記ののようなマクロを見つけました。 Sub 索引作成()   Dim R As Range, R2 As Range, LastFound As Range   Dim Found As Boolean   Range("C2", Range("D65536").End(xlUp).Offset(1, 0)).Clear   For Each R In Range("A2", Range("A65536").End(xlUp))     Found = False     Set LastFound = Range("C65536").End(xlUp)     For Each R2 In Range("C2", LastFound)       If R2.Value = R.Value Then         R2.Offset(0, 1).Value = R2.Offset(0, 1).Value & "," & R.Offset(0, 1).Value         Found = True       End If     Next     If Found = False Then       LastFound.Offset(1, 0) = R.Value       LastFound.Offset(1, 1) = R.Offset(0, 1).Value     End If   Next End Sub このマクロを使うと下記のような結果になるのですが、頁数の桁が多い場合(1000ページ以上)や、項目名の重複が多い場合は上手く動きません。  A    B    C    D 項目名  頁 A     1 B     2 C     3 D     4 A     5 B     6 C     7 D     8   ↓上記マクロを使うと  A    B    C    D 項目名  頁 A     1    A    1,5 B     2    B    2,6 C     3    C    3,7 D     4    D    4,8 A     5 B     6 C     7 D     8 となりますが、頁が1000桁以上になると A B      C     D 項目名  頁 A     1000    A    100,010,04 B     1001    B    100,110,05 C     1002    C    100,210,06 D     1003    D    100,310,07 A     1004 B     1005 C     1006 D     1007 のようになります。 頁が1000桁以上になる場合や、項目名の重複が多くなる場合でも上手く動くマクロは無いものでしょうか。 何卒、宜しくお願いいたします。

専門家に質問してみよう