ExcelVBAのマクロでデータが25項目目で終了する理由を教えてください

このQ&Aのポイント
  • ExcelVBAのマクロでデータが25項目目で終了する理由が分かりません。マクロは正しく動作しているようですが、25項目目以降のデータが反映されません。
  • マクロを編集して運用した結果、データが25項目目までは正しく反映されるのですが、それ以降のデータは反映されません。25項目目で終了する理由が分かりません。
  • ExcelVBAのマクロを編集し、データが25項目目で終了する問題に遭遇しました。マクロの構文を確認しても解決策が見つかりません。25項目目で終了する理由を教えてください。
回答を見る
  • ベストアンサー

ExcelVBAが25項目目で終了する。

以前に以下の様な質問を致しました。    ↓ 下記の様なデータがあるときに、部活が「野球」でかつクラブは「囲碁」に入っている生徒の学籍番号を別のシート(Sheet2)のB3から下に順にリスト化するマクロがどうしても出来なくて困っています。 <sheet1>    A      B      C       D    E 1 学籍番号 学年    名前     部活   クラブ 2 2222222   1   山田 太郎  野球   囲碁 3 9854923   2   吉田 次郎  剣道   絵画   4 1111111   3   佐藤 三郎  野球   囲碁 5 8888883   1   米山 権蔵  卓球   囲碁 <ご回答いただいた内容> Sub test() Dim i, k As Long Dim ws As Worksheet Set ws = Worksheets(2) k = 2 For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 4) = "野球" And Cells(i, 5) = "囲碁" Then k = k + 1 ws.Cells(k, 2) = Cells(i, 1) End If Next i End Sub 上記、マクロを多少編集し、運用してみた結果、項目が25項目目までは正しく反映されるのですが、それ以降のデータは一切反映されないことが判明しました。 構文とにらめっこしても何故25項目目で終了するのかが分からなかったので、もしお分かりになれば教えて頂ければ幸いです。 もし情報が不十分なら、追って私のオリジナルもアップするように致します。

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんばんは! おそらく私が前回投稿した張本人だと思います。 (昨日の晩飯のおかずも覚えていないので・・・) 考えられる原因はNo.1さんとNo.2さんがすでに仰っていますので、 他の原因として考えられるとすれば、 D列・E列セルにちゃんと「野球」「囲碁」と表示されていても空白等、 目に見えない余分なものがある可能性があります。 そして前回のコードは変数の宣言部分に不備がありました。 仮に、D・E列に余計なものがあっても「野球」・「囲碁」という文字があれば Sheet2に表示するコードにしてみました。 ↓のコードに変更してマクロを実行してみてください。 Sub Sample() Dim i As Long, cnt As Long Dim wS As Worksheet Set wS = Worksheets("Sheet2") cnt = 2 For i = 3 To Cells(Rows.Count, 1).End(xlUp).Row If InStr(Cells(i, 4), "野球") > 0 And InStr(Cells(i, 5), "囲碁") > 0 Then cnt = cnt + 1 wS.Cells(cnt, 2) = Cells(i, 1) End If Next i End Sub ※ これでもダメならごめんなさいね。m(_ _)m

dio2000
質問者

お礼

何度もありがとうございます。色々とした結果一部範囲指定に誤りがあることが判明致しました。その部分を修正すると25行目以降も正常に処理が出来ました。有難う御座いました。

dio2000
質問者

補足

tom04 様 確かに以前に教えて頂いたものです。その節は大変お世話になりました。また今回も私の力不足で再度お答えいただく形になり申し訳ありません。 確かにおっしゃる通りの空白部分も疑いましたが正しく反映される部分と同じデータを引っ張ってくるように設定していますので、可能性は低いかと思います。 まずは再度、ご教授頂きましたマクロを活用させていただきたいと思います。また、その上でご報告させて頂きます。

その他の回答 (3)

  • ss-ak
  • ベストアンサー率58% (23/39)
回答No.4

1です。 直接の回答ではないのですが、VBAには簡単に使える、かなり良いデバッガがついています。 変更後のソースを抜粋するのが手間でしたら、それを使って自分で動きを追ってみる方が、早くて確実かもしれません。VBAのデバッガは難しいものではないので、VBAを今後も使われるのでしたら、使ってみることをおすすめします。 ご参考までに。

dio2000
質問者

補足

アドバイス有難うございます。私のやり方が不十分かもしれませんが、それもやってみましたが問題の項目は一処理ですべて終わってしまいまして、VBA自体は正常に働いている(つもりの)ようです。当然、エラーも出ません。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

Sheet2のA列に25行目までデータがあって それ以降データがないならそのせいかも? ⇒マクロを実行した際にSheet1がアクティブでなく Sheet2がアクティブだと起こりうる。

dio2000
質問者

補足

ご回答ありがとうございます。 25行目以降にもビッチリデータは入っております。 ⇒マクロを実行した際にSheet1がアクティブでなくSheet2がアクティブだと起こりうる。 とのことですが、他のケースでもアクティブSheetの問題で25行目までだけ正確に反映されるということが起こりうるのでしょうか?

  • ss-ak
  • ベストアンサー率58% (23/39)
回答No.1

このソースを見た限りでは、実際のデータでは、25項目目以降のA列の値が全て空になっている、という原因しか思い当たりません。 変更後のソースでは、転記している値はA列以外、ということですか? 変更後のソースと、実際の表の書式を提示していただければ、確実なことが言えるかもしれません。 実は、これはマクロなしでも行えます。 オートフィルタで、条件に合う行を抽出して、抽出結果の学籍番号をコピー&ペーストすれば、目的の結果が得られます。 余談:教えてもらったものを加工して、それを「オリジナル」と称するのは、教えてくれた人に、非常に失礼です。正しい意味をご存知ないだけだろうと思いますが、かなりまずい誤用なので、注意された方がよいかと。

dio2000
質問者

お礼

大変失礼しました。 ちなみに編集したものは他のマクロや関数とも連動しており、オートフィルタだけでは解決できない部分がありまして… ちなみに当然25列目以降も値はビッチリ入っています。 私が加工したものをここに記載するのと、あまりに量が多くなりますので、ベースは崩さず編集出来ましたら再度うかがわせて頂きます。本当に有難うございます。

関連するQ&A

  • Excel 2007 マクロ 別シートの情報を反映する方法

    Excel 2007 マクロ 別シートの情報を反映する方法 Sheet1とSheet2があります。 Sheet1のD列とSheet2のM列で同じ値があれば、 Sheet1のE列の値をSheet2のN列に反映するマクロを 作成しました。 下記が正しいと思っていたのですが、エラーメッセージは出ずに 値が反映されません。 マクロに問題点があればご指摘ください。 よろしくお願いいたします。 Sub Rist() Dim i, j As Long Dim ws1, ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") For i = 2 To ws1.Cells(Rows.Count, "D").End(xlUp).Row For j = 2 To ws2.Cells(Rows.Count, "M").End(xlUp).Row If ws2.Cells(j, "M") = ws1.Cells(i, "D") Then ws2.Cells(j, "N") = ws1.Cells(i, "E") End If Next j Next i End Sub

  • エクセル2003 別シートの項目を集計したいVBA

    仕事でエクセル2003を使っています。 超初心者なので、うまく説明ができませんがお許しください。 Sheet1に、印刷シートとして「名前」「フリガナ」「住所」「電話番号」「性別」などのデータを入力しています。 これを1回ずつデータを入力して印刷をしています。 印刷をするときに、入力したデータをリストにするためにSheet2へコピーするというマクロを作りました。 ↓こんな風に作ってみました。 Sub 正方形長方形2_Click() Call macro01 Call macro02 End Sub Sub macro01() Dim ws1 As Worksheet, ws2 As Worksheet Dim x As Long, y As Long Set ws1 = Sheets("Sheet1") Set ws2 = Sheets("Sheet3") x = ws2.Cells(Rows.Count, "b").End(xlUp).Row + 1 y = ws1.Cells(Rows.Count, "b").End(xlUp).Row ws1.Cells(21, "g").Resize(y, 9).Copy ws2.Cells(x, "b").PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False End Sub Sub macro02() Worksheets("Sheet1").PrintOut End Sub ここから本題なのですが… ふと、リストの件数をSheet1に出せないものか?と思ったのです。 マクロを実行することで、Sheet2にデータが増えてその増えたデータの項目の合計件数をSheet1に反映させて印刷する。 「別シートの項目を集計する」で検索してみたのですが、私には難しすぎて理解できずいろんな方の回答をもアレンジできません。 なにとぞ、ご教授いただきますようお願いします。

  • EXCELVBAセル選択方法教えてください。

    Sub マクロ() ' Dim i, j, k As Long Dim ws As Worksheet Set ws = Worksheets("Sheet1") k = ws.Cells(Rows.Count, 1).End(xlUp).Row If k > 1 Then ws.Rows(2 & ":" & k).ClearContents  上記はマクロの構文です。 最終行は変数でデータのある最終行の行番号を得て、 2行目からデータのある最終行の行 の行全体をクリアするものですが、 行全体でなく A~C列のデータをクリアする構文教えてください。

  • Excel マクロの一部改造の方法を教えて下さい。

    先日、tom04さんから下記のマクロを教えていただきました。 sheet1のセルA1にsheet2のセルA1からA??までの項目を順次入れ、sheet1を印刷するものです。 これに、追加でsheet1のセルB1にも項目を追加したいのです、データーはsheet2のB1から入れておくこととします。 下記のマクロを教えて下さった、tom04さんの目にとまれば幸いですが、内容を理解して頂いた方ならどなたでも回答頂ければ幸いです。よろしくお願い致します。 改造して頂きたいマクロは下記です。 Sub test() 'この行から Dim i As Long Dim ws1, ws2 As Worksheet Set ws1 = Worksheets("sheet1") '←Sheet名は適宜変更してください Set ws2 = Worksheets("sheet2") '←こちらのSheet名も適宜変更 For i = 1 To ws2.Cells(Rows.Count, 1).End(xlUp).Row ws1.Range("A1") = ws2.Cells(i, 1) '←Sheet1のA1セルに名前を表示 ws1.PrintOut Next i End Sub 'この行まで

  • Excel 2007 マクロのIF構文について

    Excel 2007 マクロのIF構文について Sheet1からSheet2にIF構文を使用して、 必要な情報を転記するマクロです。 下記マクロで実現できているのですが、IF構文が多く もっと効率的なマクロがあるのではないかと考えています。 IF構文が2つありますが、1つにまとめるマクロがありましたら お教えください。 Sub Rist() Dim i, j As Long Dim ws1, ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") '「Sheet1」シートを更新 Worksheets("Sheet1").Range("A1").ListObject.QueryTable.Refresh BackgroundQuery:=False '「Sheet1」シートから「Sheet2」シートに転記 For i = 2 To ws1.Cells(Rows.Count, 1).End(xlUp).Row For j = 2 To ws2.Cells(Rows.Count, 13).End(xlUp).Row '「Sheet1」シートのL列から「Sheet2」シートのS列に転記 If ws2.Cells(j, "M") = ws1.Cells(i, "A") Then ws2.Cells(j, "S") = ws1.Cells(i, "L") End If '「Sheet1」シートのG列から「Sheet2」シートのQ列に転記 If ws2.Cells(j, "M") = ws1.Cells(i, "A") Then ws2.Cells(j, "Q") = ws1.Cells(i, "G") End If Next j Next i End Sub

  • 置換のマクロ

    すみません、基礎的なことかもしれませんが、 調べてもわかりませんでした… 下記マクロで、今はwS1のA列に置換したい文字があった場合 置換をしてくれますが、 A列だけではなく、wS1のシート全体を指定する為にはどのように書き換えればいいでしょうか…? Replace(wS1.Cells(i, "A"), wS2.Cells(k, "A") の wS1.Cells(i, "A") を Aではなく、シート全体の指定に変えたいのです。。 Sub 置換() Dim i As Long, k As Long, wS1 As Worksheet, wS2 As Worksheet Set wS1 = ActiveSheet Set wS2 = Worksheets("置換") Application.ScreenUpdating = False For i = 1 To wS1.Cells(Rows.Count, "A").End(xlUp).Row For k = 1 To wS2.Cells(Rows.Count, "A").End(xlUp).Row If InStr(wS1.Cells(i, "A"), wS2.Cells(k, "A")) > 0 Then wS1.Cells(i, "A") = Replace(wS1.Cells(i, "A"), wS2.Cells(k, "A"), wS2.Cells(k, "B")) End If Next k Next i Application.ScreenUpdating = True End Sub 過去の質問↓の回答にあったマクロから、少し変えて使わせていただいています。 http://okwave.jp/qa/q8293972.html

  • Excel マクロ 重複チェックについて

    Excel マクロ 重複チェックについて Sheet3のA列とB列に製品番号が入っています。 A列とB列を比較して、A列と同じ番号がB列に2個以上ある場合のみ C列にフラグ「1]を入れたいです。 Sub RetsuCheck() Dim i As Long Dim ws1 As Worksheet Set ws1 = Worksheets("Sheet3") '「Sheet3」シートでA列とB列の重複をチェック。 For i = 2 To ws1.Cells(Rows.Count, 1).End(xlUp).Row If ws1.Cells(i, "A") = ws1.Cells(i, "B") Then ws1.Cells(i, "C") = 1 End If Next i End Sub 1個の場合には上記マクロで解決するのですが、 2個以上の場合にどうようなマクロを記載すればよいのか アドバイスを頂けませんでしょうか。 よろしくお願いいたします。

  • シート1の氏名をシート2に反映

    sheet1の氏名をsheet2の日付、記号(A,B,C)にマッチした位置に入力させたいのですが下記コードで他で試したのですがうまくいきません。どなたかコードが解る方よろしくお願いします。 Sub 入力() Dim i As Long, j As Long, k As Long, L As Long Dim wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") i = wS2.Range(wS2.Cells(6, 1), wS2.Cells(8, 1)) j = wS2.Cells(3, Columns.Count).End(xlToLeft).Column Range(wS2.Cells(3, 2), wS2.Cells(i, j)).ClearContents On Error Resume Next For i = 2 To wS1.Cells(Rows.Count, 4).End(xlUp).Row If WorksheetFunction.CountA(wS1.Rows(i)) > 1 Then For j = 2 To wS1.Cells(i, Columns.Count).End(xlToLeft).Column If wS1.Cells(i, j) <> "" Then k = WorksheetFunction.Match(wS1.Cells(i, 4), wS2.Range(wS2.Cells(6, 1), wS2.Cells(8, 1)), False) L = WorksheetFunction.Match(wS1.Cells(5, j), wS2.Rows(3), False) wS2.Cells(k, L) = wS1.Cells(i, j) End If Next j End If Next i End Sub

  • エクセル:マクロの手直し

    お世話になります。 以前ここで教えてもらったマクロのシート名のつけ方をすこし手直ししたいのでアドバイスください。 以下のマクロは、1シート目を決まった行数分に分割し各シートに振り分けるものです。今のマクロではシート名は分割1、分割2…分割10…などなりますが、Worksheets(1) のシート名+3桁の連番(001,002…010…)などとしたい。 Worksheets(1) のシート名が「総務課」の場合、総務課001,総務課002…総務課010…となるのが理想です。 このようにするためにはマクロをどのように修正すればよいか教えてください。 Sub シート分割()  Dim WS1 As Worksheet  Dim WS2 As Worksheet  Dim i As Integer  Dim Bunkatsu As Integer  Set WS1 = Worksheets(1) 'コピー元のデータシート  Set WS2 = WS1  Bunkatsu = 1  Application.ScreenUpdating = False  For i = 7 To WS1.Cells(Rows.Count, 1).End(xlUp).Row Step 25   Set WS2 = Worksheets.Add(After:=WS2)   WS2.Name = "分割" & Bunkatsu   WS1.Rows("1:6").Copy WS2.Cells(1, 1)   WS1.Rows(i & ":" & i + 24).Copy WS2.Cells(7, 1)   Bunkatsu = Bunkatsu + 1  Next  Application.ScreenUpdating = True End Sub

  • 全部黄色になってしまいます

    下記のマクロを作成しました。 1.Sheet1のA列の数字を1つずつ検索して、sheet2にその数字があれば、sheet2のそのセル赤くする。 全部あればすべてのセルが赤くなり、無いところがあれば白いままというマクロ 2.sheet1羅列を検索してsheet2に無い場合、逆にsheet1のその数字(検索してなかった数字)を黄色にする。 困っていることは、何も数字の無いところが全部黄色になってしまいます。 sheet1の空白のところは処理せずにそのまま白くあって欲しいのですがどのようにすればいいでしょうか? ●sheet1のA列に下記のような数字が羅列(200行程)しています。 238062 238075 238096 238210 91518 238230 123456 789123 456789 ●sheet2のA列に下記のような数字が羅列しています。 91518 238062 238075 238096 238210 Sub 赤色付け() Set WS1 = Worksheets("Sheet1") Set WS2 = Worksheets("Sheet2") Dim RowPos As Integer Dim i As Integer For RowPos = 1 To 200 If WorksheetFunction.CountIf(Range(WS2.Cells(1, 1), WS2.Cells(200, 1)), WS1.Cells(RowPos, 1)) > 0 Then i = WorksheetFunction.Match(WS1.Cells(RowPos, 1), Range(WS2.Cells(1, 1), WS2.Cells(200, 1)), 0) WS2.Cells(i, 1).Interior.ColorIndex = 3 ELSE WS1.Cells(RowPos, 1).Interior.ColorIndex = 6 End If Next End Sub

専門家に質問してみよう