• ベストアンサー

マクロFor Each ~ In Nextについて

いつも回答して頂き感謝しています。 下記のマクロで列を一つづつとばしながら繰り返し処理したいのですがどうすればよろしいでしょうか? For Each h In .Range(.Range("C3"), .Range("IV3").End(xlToLeft)) Set s = Worksheets(h.Value) Next End(xlToLeft))の後ろに Step 1 を入れたらOKと思ったのですが、エラーがかかるので違うみたいです。さっぱりわかりません。御指導の程宜しくお願い致します。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

For Each Nextループで「1つおき」なんて機能はありません。 作成例1: dim c as long for c = 3 to .range("IV3").end(xltoleft).column step 2 set s = worksheet(cells(3, c).value) next c 作成例2: dim h as range for each h in .range(.range("C3"), .range("IV3").end(xltoleft)) if h.column mod 2 = 1 then set s = worksheets(h.value) end if next

kero1192kero
質問者

お礼

返事が遅れて申し訳ありません。 変数h をいろんな場所で使っているので、作成例2を参考に作り直しました。思っていた通りの動作でした。ありがとうございました。 ネットでみましたが、ここで使われているmodの意味がいまいち分かりません。出来れば教えて頂きたいのですが?宜しくお願いします。

その他の回答 (2)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

ここで使っているmodは,演算子と言います。 res = A1 + B1 (足し算) res = C1 & D1 (文字列の結合) などの計算式で使用している+や&の仲間です。 VBAのヘルプで演算子と入れて検索し,「演算子の概要」のトピックスからリンクしている各種演算子の解説を一読してみてください。VBAではどんな記号を使ってどんな計算が出来るのか,演算子の優先順位はどうなっているのかなどを理解します。 mod演算子は剰余演算子とも言いますが,割り算した余りを整数で求めます。

kero1192kero
質問者

お礼

ネットで確認してみます。アドバイスありがとうございました。

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.2

これは・・セル番地を動かすのではなく、 列番号を動かしてやる方が「わかりやすい」かもしれませんね。 For h = 3 To .Cells(3, .Columns.Count).End(xlToLeft).Column Step 2   Set s = Worksheets(.Cells(3, h).Value) Next くらい。 前にWithが有り、変数hは長整数、変数sはワークシートで宣言してあるのが条件ですね。 マメ知識(ご存知でしょうけれど)。 For 変数 = X To Y Step Z 「Xから始めてZを足しながらYに達するまで」と言う意味です。 Z=1であれば省略可能です(=Step 1 なら省略可能)。 「一つずつ飛ばしながら=2を足しながら」と言うのなら「Step 2」と指定してやります。 Each~In を使ってセル番地などで指定する場合は、 「セル番地には数字を足せない」ので受け付けてもらえない、 と考えると目安になるかもしれません。

kero1192kero
質問者

お礼

自分が質問した記述にSTEPは使えなかったのですね。初めて知りました。No.1の作成例2を拝借し、無事思っていた通りの動作が出来ました。ありがとうございました。

関連するQ&A

  • セルに対してFor Each~In~Nextを使う

    セルに対してFor Each~In~Nextを使う事は出来ない? シートやブックに対してループする時は Sub aaa() Dim w As Worksheet For Each w In Worksheets MsgBox w.Name Next End Sub 等を使いますが、 A1に「あ」 A2に「い」 A3に「う」 が入っている場合、 Sub bbb() Dim i As Long For i = 1 To Range("a65536").End(xlUp).Row MsgBox Cells(i, 1) Next End Sub で、全ての値を取得できますが、 For~to~nextではなく セルに対してFor Each~In~Nextを使う方法があれば教えてください。 上記のように Dim w As Worksheetは宣言できますが Dim c As Workcellとはできませんでした。 なぜわざわざFor~to~nextでできる事をFor Each~In~Nextでやりたいかと言うと、 シートやブックはFor~to~nextでできるのに、セルはFor~to~nextができない理由を知りたいからです。 ご回答よろしくお願いします。

  • このコード(For Each…)ですが、うまく実行できません!

    EXEL 2002 です。 下記コードなのですが、 うまくできません、 「For Each…」の下2行がエラーとなります。 何卒、ご教示よろしくお願い致します。 -------------------- Sub 下方表の各列を上方へ貼付る() '下方の表の各列を、上方に貼り付ける Dim r As Range With Worksheets(Worksheets.Count - 1) For Each r In .Range("G40:Z40") .Range(r.Offset(0, 0), .Range(r.Offset(0, 0)).End(xlDown)).Copy _ .Range (r.Offset(-38, 1)) Next r End With End Sub

  • 置換マクロ 続きです…

    http://okwave.jp/qa/q8444285.html ↑こちらでご質問をさせていただき、置換シートA列に置換元、B列に置換後データを入れておくことで、置換が一度にできるマクロを作っていただいたのですが、 ブック全体ではなく、現在アクティブなシートだけ、置換をすることは可能でしょうか…? いま、このマクロを実行すると、ブック全体が置換され、元の置換シートのA列や、置換できればしたくないシートもすべて置換されてしまいます。 回答を閉め切ってしまい、新規でご質問となってしまいました。 すみません、、自分でもいろいろと調べてやってみたのですが、 どうしてもよくわからず… どうぞ、よろしくお願い致します。 ● 作っていただいたマクロ ● sub macro1()  dim h as range  for each h in worksheets("置換").range("A1:A" & worksheets("置換").range("A65536").end(xlup).row)   cells.replace what:=h.value, replacement:=h.offset(0,1).value, lookat:=xlpart  next end sub

  • 教えて For Each R In Target

    いつもお世話になっております よろしくお願いします ネットで見つけたマクロなのですが、どなたか解説していただけないでしょうか Private Sub Worksheet_Change(ByVal Target As Range)  Dim R As Range For Each R In Target With R 条件判断と処理 End With Next R End Sub

  • エクセル、マクロの事で・・・?(2)

    昨日、質問した者です。 http://okwave.jp/qa/q7374907.html 以下のマクロを教えてもらいました。 昨日の質問では、エクセルのA列にフォルダ名、B列にファイル名、それぞれフォルダとtxtを出力するマクロを教えてもらいました。 そこでもう一つ質問があるのですが、C列の内容をテキストに出力する場合はどうすればいいのでしょうか? 度々の質問で申し訳ありませんが、教えていただけないでしょうか? よろしくお願いします。 sub macro1()  dim myPath as string  dim h as range  on error resume next  mypath = thisworkbook.path  worksheets(1).select  for each h in range("A1:A" & range("A65536").end(xlup).row)   mkdir mypath & "\" & h.value   open mypath & "\" & h.value & "\" & h.offset(0, 1).value & ".txt" for output as #1   close #1  next end sub

  • エクセルマクロFor Eachを1回で処理したい

    エクセル2013です。 以下のようなマクロを作成しました。 For Each が2回、回る為、処理時間が長いです。 For Each を1かいで済ませたくif文をandでつなげば といろいろ試しましたが、うまくできません。 For Each を1回で済ませるにはどうすればいいでしょうか? よろしくお願いします。 Sub 出荷済削除() Dim 対象セル As Range Dim 対象色 As Long Dim 対象色2 As Long Dim 最終行 Dim 最終列 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 Application.ScreenUpdating = False '画面切替停止 対象色 = Range("B8").Interior.Color 'セルB8の色を基準色とする For Each 対象セル In Range(Cells(10, 17), Cells(最終行, 最終列)) If 対象セル.Interior.Color = 対象色 Then 対象セル.ClearContents '基準色と同じ色のセルの値をクリアする Next 対象セル 対象色2 = Range("A8").Interior.Color 'セルB8の色を基準色とする For Each 対象セル In Range(Cells(10, 17), Cells(最終行, 最終列)) If 対象セル.Interior.Color = 対象色2 Then 対象セル.ClearContents '基準色と同じ色のセルの値をクリアする Next 対象セル Application.ScreenUpdating = True '画面切替停止解除 End Sub

  • VBA For Eachでセル内の文字列を一個ずつ取り出すには

    エクセル2000です。 たとえばA1セル内の文字列を一個ずつ取り出す場合、 Sub test01() For i = 1 To Len(Range("A1").Value) Cells(i, "B").Value = Range("A1").Characters(i, 1).Text Next End Sub このように最初から最後の文字まで何番目で指定することはわかるのですが、これをFor Each で回すにはどうしたらよいでしょうか? (⌒o⌒)? お教えください。 Sub test02() For Each ch In Range("A1").Characters i = i + 1 Cells(i, "B").Value = ch Next End Sub ではエラーになります。

  • 2つのマクロを1つにしたい

    いつもお世話になっております。 今回もよろしくお願いいたします。 (1)14のシートがあるのですが、データーのある2から14までのシートを印刷する。 (2)上記のうち、c列のデーターで連続しているセルを結合する。 (1)と(2)を合わせて1つのマクロにしたいのですが、アクティブシート1つにしか(2)のマクロが動きません。 下記のコードの間違いを教えてください。 Sub 契約書目次印刷() Dim Sh As Worksheet Dim t As Long Dim i As Range t = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row 'データーのあるシートだけ印刷 For Each Sh In Worksheets(Array(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)) If Sh.Range("A2").Value <> "" Then '連続データーセル結合 For Each i In Range("C1:C" & t) If i.MergeArea(1).Value = i.Offset(1).Value Then Range(i.MergeArea, i.Offset(1)).Merge End If Application.DisplayAlerts = False Next i End If Sh.PrintPreview Next Sh End Sub

  • For Each ~ Nextステートメント

    今、1つのブックに200前後のワークシートがあるとします。 For Each ~ Nextステートメントを使って以下のようなプログラムを全てのワークシートに適用したいと考えています。 Sub test() Dim mySht As Worksheet For Each mySht In Worksheets If Range("A2").Value <> "1990/01/31" Then Rows("2:2").Select Selection.Insert Shift:=xlDown Range("A2").Select ActiveCell.FormulaR1C1 = "1990/01/31" End If If Range("A3").Value <> "1990/02/28" Then Rows("3:3").Select Selection.Insert Shift:=xlDown Range("A3").Select ActiveCell.FormulaR1C1 = "1990/02/28" End If ・・・(中略)・・・ Next End Sub しかし、これを実行しても、うまくいきません。 全てのワークシートについて、必ずしもA2のセルが 1990/01/31であるとは限らないことが原因かとは思うんですが、自身ではどうしてもうまくプログラムを書くことが できません。良いお知恵を拝借できればと思います。

  • エクセルマクロFor Eachの処理が長い

    エクセル2013です。 皆さんに教えていただいて以下のマクロが完成しました。 サンプルデータ 30行、7列ではあっという間に処理ができたのですが 本番環境 800行、50列ですと 処理時間が長く 青丸がくるくる回っていて、2分後にくらいで終わります。 もう少し早く処理する方法はありますでしょうか? Findで検索して、一括削除? (それはマクロでできるのでしょうか?) よろしくお願いします。 Sub 出荷済削除() Dim 対象セル As Range Dim 対象色 As Long Dim 対象色2 As Long Dim 最終行 Dim 最終列 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 Application.ScreenUpdating = False '画面切替停止 対象色 = Range("B8").Interior.Color 'セルB8の色を基準色とする 対象色2 = Range("A8").Interior.Color 'セルB8の色を基準色とする For Each 対象セル In Range(Cells(10, 17), Cells(最終行, 最終列)) If 対象セル.Interior.Color = 対象色 Or 対象セル.Interior.Color = 対象色2 Then 対象セル.ClearContents Next 対象セル Application.ScreenUpdating = True '画面切替停止解除 End Sub

専門家に質問してみよう