• ベストアンサー

VBA マクロ エラー1004 アプリケーション定義またはオブジェクト定義のエラー

VBAで正当表と入力表の正誤判定を一気に行いたいのですが If Cells(a, b).Value = Cells(c, d).Value Thenの部分で エラー1004、アプリケーション定義またはオブジェクト定義のエラーと出てしまいます。 エラーの対処の仕方を調べたのですがわかりませんでした。 教えていただけるとありがたいです。 以下作ったプログラムです。 Sub 正誤判定() Dim a Dim b Dim c Dim d Dim e Dim i Dim j Dim x Dim y Dim hokan Dim ytate Dim xyoko a = 3 b = 21 c = 3 d = 43 e = 2 i = 1 j = 1 Do While j < 261 Do While i < 11 If Cells(a, b).Value = Cells(c, d).Value Then a = a + 1 c = c + 1 If Cells(a, b) = Cells(c, d) Then hokan = Cells(e, b).Value ytate = Range("B2:S15").Find(hokan, lookat:=xwhole).Row + 15 xyoko = Range("B2:S15").Find(hokan, lookat:=xwhole).Column Cells(ytate, xyoko).Value = Cells(ytate, xyoko).Value + 1 Else End If Else End If a = a - 1 c = c - 1 b = b + 1 d = d + 2 i = i + 1 Loop a = a + 3 c = c + 3 e = e + 3 j = j + 1 Loop End Sub

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

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

質問者ののマナーとして、こんなの回答者に読ませて、処理内容を割り出させるのでなく、どのセル範囲とどのセル範囲をくらべて、どういうロジック(3行おきとか)でどう比較してとかを、文章で判りやすく解説したものを載せるべきだ。解読時間がかかってしょうがない。 それに行数・列数を少なくしたモデル例を作って、そのコードで質問すべきだ。回答者でテスト実例を作ろうにも列・行が多いと作っていられない。 回答者は質問者の職場などでの義務付けられ教育役ではないから、それぐらい質問者ですべきだ。 ーー コード作成スキルとして 少し読み解くと変数を乱発しすぎだと思う。そのため解読が難しい。 列と行を表すi,j2つだけで2重ループで繰り回しできそうに思う。 それに1行下を見るときIf Cells(a + 1, b) =で良いのに、一旦足して、処理後1引いてもとへ戻すなど複雑になるばかりだ。 >b = b + 1 d = d + 2 はなぜ不統一なのか理解できなかった。 ーー #1のご回答でOKならもう良いが、でなければ (1)Range("B2:S15") (2)U3-AP(?)XX ?? 22列? (3)AQ3-BL(?) XX ?? 22列? 3行ごとにまとめて考えて、第1行が等しく、かつ第2行が等しければ、第1行の語句で、Range("B2:S15").を探し、直下行と等しいかチェック。 など文章で読者に教えてよ。 ーー 私が短くしようとしてやった結果。途中で放棄したので動かないだろうが、コードについて、私の言い分に耳を傾ける気があるなら参考にしてください。 コードをすっきりさせれば、自ずとエラー原因は判る、エラーは無くなると思う。 Sub test01() '--初期化 '--U3 a = 3 'cells(a,b) b = 21 '---AQ3 c = 3 'cells(c,d) d = 43 '-- For j = 3 To 260 Step 3 For i = 1 To 10 Step 2 If Cells(a, b).Value = Cells(a, b + 22).Value Then '1行下行を見る If Cells(a + 1, b) = Cells(a + 1, b + 22) Then '下行も等しければ、 hokan = Cells(a, b).Value ytate = Range("B2:S15").Find(hokan, lookat:=xwhole).Row + 15 xyoko = Range("B2:S15").Find(hokan, lookat:=xwhole).Column Cells(ytate, xyoko).Value = Cells(ytate, xyoko).Value + 1 Else End If Else End If b = b + 1 ' ??? d = d + 2 ' ??? Next i '-- Next j End Sub

atmarashi
質問者

お礼

大変失礼な質問の仕方で申し訳ありません。 それにもかかわらず回答していただきありがとうございます。 正解の表が以下のように並んでまして(×はとうし番号、○は数値) × × × ・・・ ○ ○ ○ ・・・ ○ ○ ○ ・・・ × × × ・・・ ○ ○ ○ ・・・ ○ ○ ○ ・・・ ・・・ 入力データが以下のように並んでいます × × × × × ・・・ ○ × ○ × ○ ・・・ ○ × ○ × ○ ・・・ × × × × × ・・・ ○ × ○ × ○ ・・・ ○ × ○ × ○ ・・・ ・・・ データは10列260行程度づつ並んでいるというもので、 さらにとうし番号を探して正解なら指定の場所に1足す というものを作りたかったのです。 回答していただいたものをまだ試していませんが、 本当に申し訳ありませんでした。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 #2の回答者です。 お急ぎなのは分かるのですが、#3のimogasiさんのご指摘のとおり、とても、ちょっとでは、一つずつ数値を入れて、数値の状態を追いかけていくのは、回答者側では、これ以上、エラーを修正するのは、可能なことは可能ですが、回答者側が、試行錯誤で、これはダメです、それはダメです、という繰り返しになってしまうのです。(もしかしたら、出来る人がいるかもしれませんが、その時は、その方にお任せします。) 今回は、Offset プロパティを一切使わずに、Cellsプロパティの引数の増減で、セルを動かしているので、余計にややこしいです。 2例: ------------------------------- If Cells(a, b).Value = Cells(c, d).Value Then   If Cells(a, b).Offset(1).Value = Cells(c, d).Offset(1).Value Then -------------------------------  Set r = Range("B2:S15").Find(hokan, LookAt:=xlWhole)           If Not r Is Nothing Then            r.Offset(15).Value = r.Offset(15).Value + 1           End If それと、このコードは、もともとインクリメンタルなのですから、Do ~ Loop 型で増減するよりも、For i = .. To __ 型のほうがよいです。 一種の数列なので、次のセル、その次のセル.... というような動きを、言葉で説明していただいたほうがよいのです。コードでは追いきれない部分があります。最後がどこまで行くのか見えないのです。 最終的には、プログラム上で、数列を作ってあげるだけのことです。 レイアウトも、端に、並びだけでは、解読できないのです。 #3の回答のお礼の中の説明では、良く分からないので、マクロから解読した範囲ですと、  データは、  U2 ~AE260 か? 2行目は、おそらくは項目名か?  照合データは、AQ2 ~BI260 ? (または、~ BI262)  一つおきに、2行を照合をしていくということは分かりました。  カウントするのは、項目名  C19 ~C33 まで。 こんなところですね。 この質問は、ちょっと、回答者側の負担が大きいです。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 >Range("B2:S15").Find(hokan, lookat:=xwhole).Row + 15 × lookat:=xwhole lookat:=xlWhole >If Cells(a, b).Value = Cells(c, d).Value Then のエラーは、 >a = a - 1 >c = c - 1 >b = b + 1 >d = d + 2 >i = i + 1 列数より前に、Cells の引数の演算の過程の計算違っていませんか? a は、最初に3 を入れたわけですね。 だから、i が、4 になれば、a =0, c = 0 になるのですから、Cells(a, b) は、0 以下はありませんから、実行時エラーが発生します。

atmarashi
質問者

お礼

ありがとうございます。 演算の計算過程間違っていました。 そしてxwholeの指摘もありがとうございます。 一行したの値を比べてまた戻してというのをやりたかったのです。 以下のようにしてみました。 If Cells(a, b).Value = Cells(c, d).Value Then a = a + 1 c = c + 1 If Cells(a, b) = Cells(c, d) Then   … a = a - 1 c = c - 1 Else End If Else End If

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

ループの中でbは1ずつ、dは2ずつ増やしていますね。ループは何回、回りますか? bかdの値が256以上になりそうです。 Office2003までは列数は256までしかないので、あり得ないセルを指定するためではないですか? デバッグモードになったときにb,dの変数にカーソルを合わせると値が見られますので、確認してください

atmarashi
質問者

お礼

ありがとうございます。 dとbの変数を定義する場所間違えてました。 dとbは10回ループしたかったので以下のようにしました。 Do While j < 261 b = 21 d = 43 Do While i < 11

関連するQ&A

  • VBA アプリケーション・オブジェクト定義のエラー

    ある行と別の行と同じ内容の文章が入っている場合、それを削除するマクロをくんでいますが、 アプリケーション・オブジェクト定義のエラーとのことで作動してくれません。。。 以下のような記述なのですが、アドバイスをいただけたら幸いです。 よろしくお願いいたします。 Sub 重複削除() Dim dataend Cells(Rows.Count, 5).End(xlUp).Select dataend = ActiveCell.Row For i = 2 To dataend - 1 For k = 1 To dataend - i If Cells(2, i).Value = Cells(2, i + k).Value Then '''''''''''''''''''''ここでひっかかる Rows(i + 1).Select Selection.Delete End If Next Next End Sub

  • VBA アプリケーション定義またはオブジェクト定義のエラーです

    VBA初心者です。 仕事中、暇な時にVBAの勉強をしています。 あるファイルのフォーマットを指定されたフォーマットに変換するプログラムを作成しています。 実行後、「アプリケーション定義またはオブジェクト定義のエラーです」と出て、先に進めません。 どなたが分かる方、ご教授お願い致します。 以下ソース Private Sub CommandButton1_Click() ' 変数定義 Dim openFileName As String Dim priorYearBudget As String, thisYearBudget As String, increaseAnddecrease As String Dim bigSection As String, mediumSection As String, smallSection As String Dim fileLastRow As Long, buf As Long, index As Long Dim head As String ' 初期化 index = 2 ' ファイル名取得 openFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls") If openFileName <> "False" Then ' ファイルが存在したらファイルを開く Workbooks.Open openFileName ' 項目を変数に格納 ' bigSection = Sheets(1).Cells(1, 3) ' mediumSection = Sheets(1).Cells(1, 4) ' smallSection = Sheets(1).Cells(1, 5) priorYearBudget = Sheets(1).Cells(1, 6) thisYearBudget = Sheets(1).Cells(1, 7) increaseAnddecrease = Sheets(1).Cells(1, 8) ' ファイルの最終行を取得(データが格納されている行) fileLastRow = ActiveSheet.Cells.SpecialCells(xlLastCell).Row ' ワークシートの追加 Worksheets.Add after:=Worksheets("Sheet1") ' セルの幅指定 Columns("A").Select Selection.ColumnWidth = 70 Columns("B:D").Select Selection.ColumnWidth = 13 Columns("A").Select ' 幅設定で選択されたセルを解除 range("A1").Select ' 新規に追加されたワークシートに項目を設定 Sheets(2).Cells(1, 1).Value = "勘定科目" Sheets(2).Cells(1, 2).Value = priorYearBudget Sheets(2).Cells(1, 3).Value = thisYearBudget Sheets(2).Cells(1, 4).Value = increaseAnddecrease ' 元ファイルの見出しの形式を変更 For headCnt = 1 To fileLastRow head = Sheets(1).Cells(headCnt, 1) bigSection = Sheets(1).Cells(index, 3) midiumSection = Sheets(1).Cells(index, 4) smallSection = Sheets(1).Cells(index, 5) If head <> "" Then ' 項目設定 Sheets(2).Cells(headCnt, 1).Value = "【" & head & "】" End If If bigSection <> "" Then ' 大区分設定 Sheets(2).Cells(buf, 1).Value = bigSection←ここでエラー発生 ElseIf midiumSection <> "" Then ' 中区分設定 Sheets(2).Cells(buf, 1).Value = midiumSection ElseIf smallSection <> "" Then ' 小区分設定 Sheets(2).Cells(buf, 1).Value = smaillsection End If ' Sheets(2).Cells(cnt, 1).Value = head ' head = Sheets(1).Cells(cnt, 1) index = index + 1 buf = buf + 1 Next headCnt ' 元ファイルの金額をそのままコピー For budgetCnt = 2 To fileLastRow Sheets(2).Cells(budgetCnt, 2).Value = Sheets(1).Cells(budgetCnt, 6) Sheets(2).Cells(budgetCnt, 3).Value = Sheets(1).Cells(budgetCnt, 7) Sheets(2).Cells(budgetCnt, 4).Value = Sheets(1).Cells(budgetCnt, 8) Next budgetCnt Else MsgBox "キャンセルされました" Exit Sub End If End Sub 補足 エラーが発生する箇所をコメントアウトすると、正常に動作します。 よろしくお願い致します。

  • マクロに関するエラー(オブジェクトが必要です。)

    マクロは始めてで、いろいろ調べながら作ってみたのですが、 Set検索値の行でオブジェクトが必要ですというエラーが出て、 先に進めなくなりました。 申し訳ないのですが、何方かエラーの対処法を教えていただけないでしょうか。 よろしくお願いします。 ========================== Sub test() Worksheets("2月分").Activate Dim 検索値 As Integer Set 検索値 = Worksheets("2月分").Cells(4, 18) Worksheets("テスト").Activate Dim B As Range Dim C As Range For Each B In Range("B13,B413") ' 第一条件 If B.Value >= 検索値 Then GoTo Continue End If ' 第二条件 If B.Offset(0, 1).Value < 検索値 Then ' Offset(0, 1) は B列の隣のC列の値を取得 GoTo Continue End If Dim aValue As String aValue = B.Offset(0, 2).Value Worksheets("2月分").Cells("D19").Value = aValue Continue: Next End Sub

  • 現マクロに列の塗りつぶし追加したい

    マクロについては素人の私です。 図を参照いただきたいですが、J2にリストで「入金済み」と入力したとき下記のマクロでは F2 G2 I2 J2がグレーに塗りつぶしています。 但しE2には次のような式が入っています。 =IF(OR(B2="",C2=""),"",TEXT(B2,"yymmdd")&C2) このような式が入っていてもE2の塗りつぶしは可能でしょうか。可能ならば追加したいです。不可能ならE2は除きます。 もし可能ならばこれを B2 C2 D2 E2 もグレーでセルを塗りつぶすのを追加したいが下記のマクロをどうすればよろしいでしょうか。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim i As Long Dim r As Byte i = Sheets("入金記入").Range("B65536").End(xlUp).Row + 1 r = Target.Row If Target.Value = "入金済" Then With Sheets("入金記入") .Cells(i, 2).Value = Date .Cells(i, 3).Value = Cells(r, 3).Value .Cells(i, 4).Value = Cells(r, 4).Value End With End If End Sub ご指導の程、よろしく御願いします。

  • VBA オブジェクト定義エラー

    VBA初心者です。 アプリケーション定義エラーまたはオブジェクト定義エラーが出ました。 原因を教えてください。 A=2800 B=3300 委託料=AとBの合計の5% Cell(5,j)のセルにAとBの合計の5%の数値"305"を入力したいです。 Sub syouhinbubetu() Dim Sheetobj As Worksheet Dim A As Integer Dim B As Integer Dim 委託料 As Integer Set Sheetobj = ThisWorkbook.Worksheets("Sheet1") With Sheetobj A = .Cells(3, j) B = .Cells(4, j) 委託料 = .Cells(5, j) For j = 3 To 6 .Cells(5, j) = (A + B) * 0.05 Next j End With End Sub 定義は、きちんと整数の定義にしているはずなのですが、どうしてでしょうか? それから、もう一つ教えてください。 C/Dの値をセルに入れるのは次の式でよいと思いますが、 .Cells(7,j)=C/D その数値が少数になる場合四捨五入をした値(小数点以下すべて切り捨て)を入れる場合はどのような式になりますか? 初心者過ぎて申し訳ありません。 VBAの基本の本で勉強したのですが、それを応用して実践する場合にどのようなプログラムになるのかが分かりません。 良い本があれば紹介していただけないでしょうか。 私が勉強した本は、「世界で一番簡単なExcel VBAのe本」です。 分かりやすい応用編の本があれば教えてください。 たくさんの質問で申し訳ありませんが、よろしくお願いいたします。

  • VBA PrintArea に引数を使いたい

    お世話になります 入力ファイルのある項目を抽出したデータを出力ファイルに同一フォーマットで出力しています。 この時印刷範囲の指定を行ってますが、経験値により概算で印刷されるであろう枚数を PrintAreaに指定していて、現状では抽出データの編集されたページ以降も何枚か印刷 の対象に入っているため、ムダな紙がプリントされてしまいます。 そこでディテイルカウントなる物を設け、改ページ毎カウントアップして印刷時に、プリントエリアを指定 するところで使いたいのですが、実行時エラー'1004'PrintArea が設定できませんのエラーが出て しまいます。 指定でよい方法があったらご教示願います。以下VBAの内容です。 Sub P_Print() ' Dim D_cnt As Integer Dim sh1 As Worksheet '添字 Dim sh2 As Worksheet 'd ; 入力データ、エクセルファイルの最終行番号 Dim d As Integer 'i ; 入力データ読込件数 Dim i As Integer 'j ; 出力側シートのラインカウンタ Dim j As Integer ' (5 -> 54行の間のループ) Dim K As Integer 'k ; 出力側シートのライン行 ' (実際に書き込む行) If 諸表印刷.記録A.Value = True Then Windows("記録(A).xls").Activate End If If 諸表印刷.記録B.Value = True Then Windows("記録(B).xls").Activate End If If 諸表印刷.記録C.Value = True Then Windows("記録(C).xls").Activate End If Sheets("原紙").Select Sheets("原紙").Copy Before:=Sheets(2) Sheets("原紙 (2)").Select Set sh2 = Worksheets("原紙 (2)") Windows("データ 2013年度").Activate Set sh1 = Worksheets(combo_sel) '諸表印刷フォームで選択されたシートをセット d = sh1.Range("A65536").End(xlUp).Row K = 5 j = 5 For i = 2 To d If sh1.Cells(i, "O") = P_sel Then    If j < 55 Then 'sh2.Cells(k, "A") = sh1.Cells(i, "A") 'sh2.Cells(k, "B") = sh1.Cells(i, "B") 'sh2.Cells(k, "C") = sh1.Cells(i, "C") 'sh2.Cells(k, "D") = sh1.Cells(i, "D") 'sh2.Cells(k, "E") = sh1.Cells(i, "E") 'sh2.Cells(k, "F") = sh1.Cells(i, "F") 'sh2.Cells(k, "G") = sh1.Cells(i, "G") K = K + 1 j = j + 1    Else '改ページ処理、Detail1行目の編集 K = K + 8 j = 5 'sh2.Cells(k, "A") = sh1.Cells(i, "A") 'sh2.Cells(k, "B") = sh1.Cells(i, "B") 'sh2.Cells(k, "C") = sh1.Cells(i, "C") 'sh2.Cells(k, "D") = sh1.Cells(i, "D") 'sh2.Cells(k, "E") = sh1.Cells(i, "E") 'sh2.Cells(k, "F") = sh1.Cells(i, "F") 'sh2.Cells(k, "G") = sh1.Cells(i, "G")     K = K + 1   j = j + 1   D_cnt = D_cnt + 1 ←ここでディテイルカウント +1 End If End If Next i If 諸表印刷.記録A.Value = True Then Windows("記録(A).xls").Activate ActiveSheet.PageSetup.PrintArea = "$A$1:$N$(D_cnt*58)" ←ここでエラーが出る End If If 諸表印刷.記録B.Value = True Then Windows("記録(B).xls").Activate ActiveSheet.PageSetup.PrintArea = "$A$1:$N$(D_cnt*58)" ←ここでエラーが出る End If If 諸表印刷.記録C.Value = True Then Windows("記録(C).xls").Activate ActiveSheet.PageSetup.PrintArea = "$A$1:$N$(D_cnt*58)" ←ここでエラーが出る End If End sub

  • ExcelのVBAがオーバーフローに!?

    読んで頂きありがとうございます。 以前に質問しました時に回答を頂き凄く助かっていたのですが、何故か「オーバーフロー」と表示されてしまいます。 ひょっとしたら桁なのかも知れません。 下記のVBAを教えて頂きしようしていました。 Option Explicit Sub Test() Dim c(), p(), q(), i, j, l, r, k As Long r = Range("B2").End(xlDown).Row l = Range("D2").End(xlDown).Row ReDim c(r - 2), p(r - 2), q(r - 2) For i = 1 To r - 2 c(i) = Cells(i + 2, 2).Value p(i) = Cells(i + 2, 3).Value q(i) = i + 2 Next i For i = 1 To r - 3 For j = i + 1 To r - 2 If c(i) > c(j) Then k = c(i) c(i) = c(j) c(j) = k k = p(i) p(i) = p(j) p(j) = k k = q(i) q(i) = q(j) q(j) = k End If Next j Next i For i = 1 To r - 2 Cells(i + 2, 7).Value = c(i) For j = 3 To r If Cells(j, 4).Value = c(i) Then Cells(i + 2, 8).Value = p(i) - Cells(j, 5).Value If p(i) - Cells(j, 5).Value <> 0 Then Range("B" & q(i)).Interior.ColorIndex = 6 Range("D" & j).Interior.ColorIndex = 6 End If Exit For End If Next j Next i For i = 3 To r k = 0 For j = 3 To l If Cells(i, 2).Value = Cells(j, 4).Value Then k = 1 Exit For End If Next j If k = 0 Then Range("B" & i).Interior.ColorIndex = 35 End If Next i For i = 3 To l k = 0 For j = 3 To r If Cells(i, 4).Value = Cells(j, 2).Value Then k = 1 Exit For End If Next j If k = 0 Then Range("D" & i).Interior.ColorIndex = 35 End If Next i End Sub デパックのClickすると15行目辺りの「k = c(i)」が黄色くなります。 正直言ってマクロとか全く解りませんが、コピーして使っていました。 どこをどう変更すれば良いのか教えて頂ければ助かります。 よろしくお願いします。

  • EXCEL VBAの配列でわかりません。

    こんなコードがあるのですが、最後の他のシート(作業中シート)に書き込もうとするとエラーになってしまいます。”Sheets("作業中").”を抜くと同じシートに結果は返ってくるのですが…。コードの内容は、ある範囲のある列から空白ではないセルを探し出してその行のデータを配列で汲み取り、他のシートに一括で洗い出すというものです。 Sub 作業中() Dim myRow As Long Dim Data As Variant Dim WC() As Variant Dim WCE() As Variant myRow = Range("H1").CurrentRegion.Rows.Count Data = Range("H1:M" & myRow).Value For i = 1 To myRow If Data(i, 5) <> "" Then a = a + 1 Else b = b + 1 End If Next ReDim WC(a) ReDim WCE(b) c = 0 d = 0 For i = 1 To myRow If Data(i, 5) <> "" Then WC(c) = Range("H" & i & ":K" & i).Value c = c + 1 Else WCE(d) = Range(Cells(i, 8), Cells(i, 11)).Value d = d + 1 End If Next For i = 0 To a Range(Cells(i + 1, 15), Cells(i + 1, 18)).Value = WC(i) Next For i = 0 To b Range(Cells(i + 1, 19), Cells(i + 1, 22)).Value = WCE(i) Next e = Range(Cells(1, 15), Cells(a, 18)).Value Sheets("作業中").Range(Cells(1, 1), Cells(a, 4)).Value = e End Sub ちなみに同じシートから↓のコードを実行するとうまくいきます。 なぜ~??わからな~い??おしえてくださーい!! Sub test() Dim a As Variant a = Range("H1:K4") Sheets("作業中").Range("N1:Q4") = a End Sub

  • Excel  VBAのマクロについて

    以下のようなマクロを作りました。 P4に開始番号P6に終わりの番号があるのですが、P4=P6、つまり、一つだけのシートを作成する分には問題なく動きます。しかしP4に1、P6に5と範囲を増やすとエラーが出て動きません。どこをなおしたらよろしいでしょうか? Option Explicit Sub 一括() Dim I As Worksheet Dim SheetName As String Dim Prompt As String Dim Col As Integer Dim Cell As Range Dim Row As Long Dim hani As Long For hani = Range("P4").Value To Range("P6").Value Set I = ActiveSheet SheetName = Cells(hani + 4, "K").Value & "(" & Cells(hani + 4, "B") & ")" Prompt = SheetName & "が存在します。" Sheets("基本シート").Copy After:=Sheets("基本シート") On Error GoTo 100 ActiveSheet.Name = SheetName On Error GoTo 0 Range("X3") = I.Cells(hani + 4, "B") Range("E8") = I.Cells(hani + 4, "C") Range("A13") = I.Cells(hani + 4, "D") For Col = 0 To 8 Step 4 Set Cell = I.Cells(hani + 4, "D").Offset(, Col) If Cell > 0 Then Prompt = "該当する日付がありません。" & Cell.Address On Error GoTo 100 Row = WorksheetFunction.Match(Cell, [A:A], 0) On Error GoTo 0 Cells(Row, "E") = I.Cells(hani + 4, "E").Offset(, Col) Cells(Row, "H") = I.Cells(hani + 4, "F").Offset(, Col) If Col < 8 Then Cells(Row, "Y") = I.Cells(hani + 4, "G").Offset(, Col) End If End If Next Col Next hani End 100 If Err <> 1004 Then Error Err End End If MsgBox Prompt, vbCritical Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True Sheets(1).Select End Sub

  • excel;マクロ;表現をもっと縮小したい

    質問します。下記のようなモジュールで中に同様の数字のみが順に変わるブロック繰り返しが多数あるのですが、もっと簡略化した表現 が可能でしょうか。よろしくお願いします。 Sub usb_count() d = Range("A65536").End(xlUp).Row j = 3 For i = 2 To d Select Case Cells(i, "B") Case Sheets("sheet2").Cells(4, "A") Sheets("sheet2").Cells(4, "B").Value = Sheets("sheet2").Cells(4, "B").Value + 1 If Cells(i, "K").Value = "USB" Then Sheets("sheet2").Cells(4, "C").Value = Sheets("sheet2").Cells(4, "C").Value + 1 Else Sheets("sheet2").Cells(4, "D").Value = Sheets("sheet2").Cells(4, "D").Value + 1 ' End If ‘------------------------------------------------------------------------------------------------------------------------------------ Case Sheets("sheet2").Cells(5, "A") Sheets("sheet2").Cells(5, "B").Value = Sheets("sheet2").Cells(5, "B").Value + 1 If Cells(i, "K").Value = "USB" Then Sheets("sheet2").Cells(5, "C").Value = Sheets("sheet2").Cells(5, "C").Value + 1 Else Sheets("sheet2").Cells(5, "D").Value = Sheets("sheet2").Cells(5, "D").Value + 1 End If ‘----------------------------------------- ‘以下上記の‘-----------から‘-----------で囲まれたブロックが( )内の数字が6から20まで繰り返され続く が略す End Select Next i End Su

専門家に質問してみよう