• ベストアンサー

繰り返しのマクロで変数について

Sheets("東京").Select Dim i x = Sheets("東京").Range("X1").Value For i = 1 To x 処理内容です Next i Sheets("千葉").Select Dim j x = Sheets("千葉").Range("X1").Value For j = 1 To x 処理内容です Next j このようなマクロを作っています 作業対象シートが複数ありまして (この例で言うと「東京」シートと 「千葉」シート) それらのシートに対してのマクロを まとめて記述したいのですが 同一マクロでは変数が同じものは使えないため わざわざ変数を複数使っています 「i.j」のように。 今後作業対象シートが増えていくたびに どんどんマクロが長くなっていくので うまく記述する方法はありませんでしょうか? 「処理内容です」の部分は まったく同じ内容です (変数以外) 宜しくお願い致します

  • ennkai
  • お礼率54% (284/525)

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

  • ベストアンサー
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

変数 x が何度も使えて、i,j が使えない理由ってなんでしょうか? Sub sample() Dim shAry As Variant Dim i As Integer, cnt As Integer, x As Integer shAry = Array("東京", "名古屋", "大阪") For cnt = LBound(shAry) To UBound(shAry) Sheets(shAry(cnt)).Select x = Range("X1").Value For i = 1 To x '処理内容です Next j Next End Sub

ennkai
質問者

お礼

回答が遅くなってもうりわけありません 望むとおりの結果が得られました 素人の私にも分かりやすい記述で 勉強になりました ありがとうございます

その他の回答 (4)

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.5

#2 訂正です。 >Next j Next i でした。

  • fly_moon
  • ベストアンサー率20% (213/1046)
回答No.4

変数は入れ物にすぎません。 Sheets("東京")で使用しても中身を入れ替えればSheets("千葉")でも同じものがしようできます。 例えば <処理内容> シートの1行目~10行目まで連番をふる <マクロ> Sub Renban() Dim r As Integer For r = 1 To 10 Range("A" & r) = r Next End Sub を各シートを選択してから行えば、選択されているシートのA列に連番がはいります。 これをシートを順に選択しながら行うとコードは一まとめにできます。 なので処理の部分はこういうマクロを作って、シートを替えるマクロを別に作って、その中から、処理のマクロを呼べばいいのです。 <シートをかえるマクロの例> Sub sheet_change() Dim ws As Worksheet For Each ws In Worksheets ws.Select Call renban Next End Sub これでBOOK内の全てのSheetのA列に10までの連番が振られます。もし処理したくないシートが存在するなら、Forの中にIfやSelectで分岐するか、処理するシートの名前を指定してやって、Callでよぶのがよいと思います。

ennkai
質問者

お礼

回答ありがとうございます シート名を変える内容まで教えてくださって ありがとうございました いずれ使わせていただく事があるとおもいますので 勉強させてもらいますね 本当にありがとうございました

回答No.3

シートをシート名ではなく、item番号を受ければ、可能です。 以下に、例を示します。 Sub シートの名前() Dim j As Integer Dim シート数 As Integer Dim シート名() As String シート数 = Sheets.Count ReDim シート名(シート数) For j = 1 To シート数 シート名(j) = Worksheets(j).Name Next j For j = 1 To シート数 x = Sheets(j).Range("X1").Value For j = 1 To x '処理内容です Next j End Sub

ennkai
質問者

お礼

回答ありがとうございます シートカウントの命令があることを 初めて知りました 今後のために勉強させていただきます 本当にありがとうございました

回答No.1

シート名ではなく Sheet1、Sheet2 といったオブジェクト名でまわせばいいんじゃないでしょうか。

ennkai
質問者

お礼

回答有難うございます 教えていただいた方法は最初に 思いついたのですが シート名を変えないでする方法は やっぱりないものでしょうか?

関連するQ&A

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

    よろしくおねがいします 各々のシートのX1セルを値を参照して ゼロ以外の時は 印刷の処理をして ゼロの時は処理をしない という内容を書きたく思います。 このままで記述だとX1セルの値がゼロの場合 いきなりsubを抜けてしまうのですが 1,2枚目でゼロの場合 その次のシートにきちんと処理が 継続したいのですが どこを修正したらよろしいでしょうか? Sub マクロ() Dim shAry As Variant Dim i As Integer, cnt As Integer, x As Integer shAry = Array("東京", "千葉", "群馬") For cnt = LBound(shAry) To UBound(shAry) Sheets(shAry(cnt)).Select x = Int(((Range("x1").Value) - 1) / 5) + 1 If x = 0 Then GoTo ゼロの場合の処理 Else MsgBox "印刷枚数は " & x & "枚です" ここにいんさつの処理があります End If Next Exit Sub ゼロの場合の処理: MsgBox "印刷する内容はありません" End Sub

  • Excel 繰り返しマクロ

    下記のようなマクロを使ってn個あるシートの内容を「集計」シートにコピーさせるようにしました。 (自動マクロとの組合せなので、スマートではないかもしれませんが) でも、これだと「集計」シートもコピー作業を行ってしまうので、 「集計」シートはコピー作業をしないように除外したいのですが、どうしたら良いのでしょう? 実際にはシート数は30程度、コピペ項目は1シートあたり30項目程度あります。 よろしくお願いします。 ------------------------- Sub テスト2() ' For i = 1 To Worksheets.Count '案件番号等コピー ' Sheets(i).Select Range("D3").Select Application.CutCopyMode = False Selection.Copy Sheets("集計").Select Range("A4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False '案件名 Sheets(i).Select Range("F3").Select Application.CutCopyMode = False Selection.Copy Sheets("集計").Select Range("B4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False '国名 Sheets(i).Select Range("E3").Select Application.CutCopyMode = False Selection.Copy Sheets("集計").Select Range("C4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False '選択セルの解放 Application.CutCopyMode = False '行挿入 ' Sheets("集計").Select Rows("4:4").Select Selection.Insert Shift:=xlDown Next i End Sub

  • マクロの処理速度が遅くなってしまいました

     今までエクセル2000を使用していたのですが、エクセル2003にバージョンアップして、以下の処理速度を検証したところ、処理が遅くなってしまいました。内容はsheet2にあるデータを変数に格納して簡単な計算をした後にsheet1に入力するということを5回繰り返し、それぞれの処理にかかる時間をsheet3に表示するというものです。 Sub タイム計測()   Dim myStart As Single, myGoal As Single   Dim j As Integer   Application.ScreenUpdating = False   Sheets(1).Select   Cells.Clear     For j = 1 To 5       myStart = Timer         Call サンプル       myGoal = Timer - myStart       Sheets(3).Select       Cells(j, 1) = myGoal       Sheets(1).Select     Next     Sheets(3).Select   Application.ScreenUpdating = True End Sub Sub サンプル()   Dim i As Integer, j As Integer   Dim Data As Variant, KeKKa(1 To 2000, 1 To 199) As Variant   Data = Range(Sheets(2).Cells(1, 1), Sheets(2).Cells(2000, 199))   For i = 1 To 2000     For j = 1 To 199       KeKKa(i, j) = Data(i, j) + Data(i, j)     Next   Next   Range(Cells(1, 1), Cells(2000, 199)) = KeKKa End Sub エクセル2000のときは1回当り平均して概ね0.7秒位で処理していたのですが、エクセル2003にすると1.4秒位かかってしまいます。処理速度が遅くなってしまうとバージョンアップした意味がないのですが、原因や改善策があればどなたか教えていただけないでしょうか?よろしくお願いします。

  • Excelマクロ:変数を使って範囲を指定してコピーするには?

    マクロ勉強中の初心者です。(OS:WindowsXP Excel2002) データの範囲を指定してコピーしたいと思っています。 cellsを使って、【変数を用いた】 記述の仕方を、教えて下さい。 変数を用いない場合は、以下のようなマクロで正常に動作しました。 【変数を用いない場合】   Sheets("Sheet2").Select Range("F3:K3").Select Selection.Copy Sheets("Sheet1").Select Range("C3").Select ActiveSheet.Paste

  • グラフマクロで系列を変数にする方法を教えてください

    エクセルのグラフマクロについて質問します。 系列のxの値(Yの値も)の設定で、 グラフ化したいワークシートと範囲を変数にすることはできますか? 目的は、複数あるシートの複数のセルをグラフ化したい、というものです。 変数にてシート名と範囲を指定したいです。 ↓のようなプログラムを作成してみましたが、どうもうまく動きません。 12行目で止まってしまいます。 13行目はでたらめですが、範囲も変数bにできないかなぁと、勝手にイメージで作ってみました。 Sub () n = Cells(Rows.Count, "A").End(xlUp).Row For i = 2 To n Sheets("SHEET1").Select Range("A" & i).Select a = ActiveCell.Value Sheets(a).Select Charts.Add ActiveChart.ChartType = xlXYScatter ActiveChart.SetSourceData Source:=Sheets(a).Range("V22") ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(1).XValues = "=sheets(a)!R2C4:R5C4" ActiveChart.SeriesCollection(1).Values = "=sheets(a)!range(b)" ActiveChart.Location Where:=xlLocationAsObject, Name:=Sheets(a) Next i End Sub 当方、マクロかじりたての初心者です。 どなたか、よろしくおねがいします!

  • excel2007マクロに関しまして

    excel2007マクロに関して不明な点があるので教えて頂きたいです。 シートが50枚ありそれぞれのシートのN列4~15行に対し そのシートのC列4~15行の値を60倍したものを記載したいのですが 下記入力内容中の Range("N " & j ).Select のところでRange メソッドの失敗が生じてしまいます。 その他にも不備があればご指摘頂きたいです。 宜しくお願いします。 Sub Macro6() ' ' Macro6 Macro ' Dim i, j As Integer For i = 1 To 50 With Sheets("ds1_" & i) Range("N3").Select ActiveCell.FormulaR1C1 = "Q(cum/m)" For j = 4 To 15 Range("N " & j ).Select ActiveCell.FormulaR1C1 = "=RC[-11]*60" Next j End With Next i End Sub

  • Excelマクロ シート名を変数で指定

    Excelマクロの初心者です。 Sheet1~50を、変数を用いて順に選択したく Dim i as Integer For i = 1 to 50 Sheets("Sheet"&i).Select Next i としたところ、 『実行時エラー'9':インデックスが有効範囲にありません』となってしまいます。 勉強不足なものでどこがいけないのか、どう修正すればよいかわからず困っています。 よろしくお願いします。

  • エクセルマクロについて助言下さい。

    エクセルマクロについて助言下さい。 ★やりたい事 シート名を指定しアクティブにする BOOOKに複数のセルがあり、シート名は日付(1・2など) 但し、必ず連続ではなく1~31までのシートが存在します。 現在のマクロ↓ シート名を取得し関数で指定のシートが存在するか確認しています。 作業シートのC1セルが0で指定シートなし 0でないで指定シートあり(処理開始)としてます。 作業2のI3セルに日付データがあります。 Sub 抽出() 'シート名を取得する Sheets("作業").Select Dim i As Integer Dim mySheetCnt As Integer Dim mySheetNam As String    mySheetCnt = ThisWorkbook.Sheets.Count For i = 1 To mySheetCnt mySheetNam = Sheets(i).Name Sheets("作業").Cells(i, 1) = mySheetNam Next i   Range("A1").Select If ActiveCell.Value = "" Then 'A1が空白の場合の処理 MsgBox "指定の日付のシートが存在しません" Exit Sub End If Sheets("作業").Select Range("C1").Select If ActiveCell.Value = 0 Then 'C1が0の場合の処理 MsgBox "指定の日付のシートが存在しません" Exit Sub End If Sheets("作業2").Select Range("I3").Select Sheets(ActiveCell.alue).Select End Sub このコードだと3と指定すると左から3枚目にあるシートが選択されます。 3枚目ではなくシート名が 3 を選択したいのです。。 分かりにく説明で申し訳ありませんが、教えてください。

  • マクロ 繰り返し offset

    マクロについての質問です。 私自身まだ勉強中でまだ初心者です。 マクロを作ってみたのですが、自分の思い通りに動いてくれません。 どなたか詳しい方ご教授いただけませんか? 下記にマクロのせておきます。 Sheets("Sペストリ").Select For i = 1 To 10 Range("D3").Select ActiveCell.Offset(0, 1).Select If ActiveCell.Value = "" Then Exit For Else Selection.Copy Sheets("印刷").Select Range("A1").Select ActiveCell.Offset(1, 0).Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False End If Next i End Sub 私がやりたいことは、SペストリというシートのD3セルを選びそこから右にコピーしながらブランクが来るまでOFFSETし、印刷シートのA1セルから下にコピーしたセルの情報んペーストOFFSETしていく感じにしたいのですがうまくいきません。 よろしくお願いいたします。

  • マクロについて教えてください

    マクロの超初心者です。 数式を入力しているのではなく、配付物をエクセルで作成しているのですが、同じもの(氏名や項目は違いますが)を100枚ほど作成しているのでマクロを・・・と思ったのですがやり方が全く分かりません。 sheet1からsheet2に下記のようにデータを写したいのですが、やり方を教えてください。 ●氏名が入力されています sheet1(A9) → sheet2(C2) sheet1(E9) → sheet2(C5) sheet1(I9) → sheet2(C8) ●項目1 sheet1(A8) → sheet2(E3) sheet1(E8) → sheet2(E6) sheet1(I8) → sheet2(E9) ●項目2 sheet1(A18~D18の結合セル) → sheet2(E2) sheet1(E18~H18の結合セル) → sheet2(E5) sheet1(I18~L18の結合セル) → sheet2(E8) と反映させたいのですが、250行あるのですが、 簡単にマクロで出来ないでしょうか?? ちなみに↓コレが上記の内容で作ってみたものです。 わかりずらい質問でスイマセン。 Range("A9").Select Selection.Copy Sheets("sheet2").Select Range("C2").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("E9").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("C5").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("I9").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("C8").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("A8").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("E3").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("E8").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("E6").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("I8").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("E9").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("A18:D18").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("E2").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("E18:H18").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("E5").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("I18:L18").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("E8").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False End Sub

専門家に質問してみよう