マクロでループ構文がうまく使えません

このQ&Aのポイント
  • マクロ初心者がF列~AD列の間で特定の処理を行いたい
  • 処理の内容は「あいう」の指定sheetと「えお」の指定sheetの値を加算して貼り付ける
  • 地道に書いていくことで形としては動くが、ループ構文を用いてスマートに書きたい
回答を見る
  • ベストアンサー

マクロでループ構文がうまく使えません。。

マクロ初心者です! 下記の動きを実現したく、マクロを組んでいます。 F列~AD列の間で、1列おきに下記処理を行う 「あいう」の指定sheetのF25→F42までの値をコピー →「えお」の指定sheetのF25→F42までの値をコピー →「貼り付け先ファイル」のF25→F42に上記2つの値を加算で貼り付け 下記の記述をF列、H列、、と地道に書いていくことで 形としては動くようになったのですが、これはループ構文を用いることができるのでは? と思って試行錯誤をしているところです。が、上手くいきません。 どのようにしたらうまく動くのか、知識のある方からお力を借りたいです。。 よろしくお願いします。。 Sub マクロ() Const xAdr As String = "(F25:F42)" Dim buf As String buf = Dir("C:某フォルダ\*あいう*.xlsm") With Workbooks("貼り付け先ファイル.xlsm").Worksheets("貼り付け先シート") Workbooks(buf).Worksheets("シート#1").Range(xAdr).Copy .Range(xAdr).PasteSpecial Paste:=xlPasteValues buf = Dir("C:\某フォルダ\*えお*.xlsm") Workbooks(buf).Worksheets("シート#2").Range(xAdr).Copy .Range(xAdr).PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd End With End Sub

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1616/2455)
回答No.2

Cells(25, i), Cells(42, i) は文字列変数として利用することはできませんので 直接 Workbooks(buf).Worksheets("シート#1").Range(Cells(25, i), Cells(42, i)).Copy にしてください。 以下はコピー貼り付けの所だけですが Dim i As Long これは↑↑Longがいいです。 With Workbooks("貼り付け先ファイル.xlsm").Worksheets("貼り付け先シート") For i = 6 To 30 Step 2 Workbooks(buf).Worksheets("シート#1").Range(Cells(25, i), Cells(42, i)).Copy .Range(.Cells(25, i), .Cells(42, i)).PasteSpecial Paste:=xlPasteValues Next i End With これでコピー貼り付けをF列からD列まで一つ飛ばしで行います。なお、動作確認はしていませんので何かしら落ちがあるかもしれません。 なお、 buf =Dir("C:某フォルダ\*あいう*.xlsm") ではファイルは開かないので tmp="C:某フォルダ\" & buf にしてtmpのファイルをコピー貼り付けのコードの前で開いてください。 用が終わったら.Closeも忘れずに。

samugetan-chan
質問者

お礼

こちら参考になせていただき、無事希望する動きを実現することができました! ありがとうございます!

その他の回答 (4)

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.5

単に2つのブックのシート間の足し算? 2つのブックを開く必要はありません。セルの指定はRC形式です。 1行おきの偶数列(G列とか)に何も入力が無ければ、1行マクロになりそうです。 Sub Add2Sheets()  Dim c As Integer, cc As String  For c = 0 To 24 Step 2   Worksheets("貼り付け先シート").Range("F25").Offset(0, c).Select   cc = "R25C" & (6 + c) & ":R42C" & (6 + c)   Selection.Consolidate Sources:=Array( _     "'C:某フォルダ\[*あいう*.xlsm]シート#1'!" & cc, _     "'C:某フォルダ\[*えお*.xlsm]シート#2'!" & cc), _     Function:=xlSum, TopRow:=False, LeftColumn:=False, CreateLinks:=False  Next End Sub

  • kkkkkm
  • ベストアンサー率65% (1616/2455)
回答No.4

コピー貼り付けだと遅い感じがしたのでコピー貼り付けじゃないモードで 貼り付け先ファイルに加算していきます。画面表示を止めていますので終了までセルの値は変化しません。 もしエラーで止まった場合 Sub TestErr() Application.ScreenUpdating = True End Sub これを実行してください。画面表示オフになっているのをオンにします。 Sub Test() Dim buf As String, i As Long, j As Long, k As Long Dim FileName(1 To 2) As String, FilePath As String Dim ShName(1 To 2) As String Dim wb As Workbook FilePath = "C:\某フォルダ\" FileName(1) = "*あいう*.xlsm" ShName(1) = "シート#1" FileName(2) = "*えお*.xlsm" ShName(2) = "シート#2" Application.ScreenUpdating = False For k = 1 To UBound(FileName) With Workbooks("貼り付け先ファイル.xlsm").Worksheets("貼り付け先シート") buf = Dir(FilePath & FileName(k)) Do While buf <> "" buf = FilePath & buf Set wb = Workbooks.Open(FileName:=buf, UpdateLinks:=0, ReadOnly:=True, IgnoreReadOnlyRecommended:=True) For i = 6 To 30 Step 2 For j = 25 To 42 .Cells(j, i).Value = .Cells(j, i).Value + wb.Worksheets(ShName(k)).Cells(j, i).Value Next j Next i wb.Close Set wb = Nothing buf = Dir() Loop End With Next k Application.ScreenUpdating = True End Sub

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

Workbookの課題を、テストデータ作成が手数なので、 同一WorkbookのSheet1とSheet2の課題に変えてやってみました。 参考になれば。 また「F列~AD列の間」という条件を、F~J列3列に少なくしました。 これは原案に変更が簡単ですが。 ーーー 例データ Sheet1 F-J列 2-12行 10 11 12 10 11 12 10 11 12 10 11 12 10 11 12 10 11 12 10 11 12 10 11 12 10 11 12 10 11 12 10 11 12 Sheet2 F-J列 2-12行 20 30 40 20 30 40 20 30 40 20 30 40 20 30 40 20 30 40 20 30 40 20 30 40 20 30 40 20 30 40 20 30 40 標準モジュールに コード Sub test07() Dim cl As Range Dim sh(3) Set sh(1) = Worksheets("Sheet1") Set sh(2) = Worksheets("Sheet2") For i = 1 To 2 For Each cl In sh(i).Range("F1:J1") If cl.Column Mod 2 = 0 Then MsgBox sh(i).Name sh(i).Range(sh(i).Cells(2, cl.Column), sh(i).Cells(12, cl.Column)).Copy Worksheets("Sheet3").Cells(2, cl.Column).PasteSpecial Paste:=xlPasteValues, Operation:=xlPasteSpecialOperationAdd End If Next Next i End Sub Rangeの()内でもシートの限定sh(i).は入れた方がよい。 実行結果 Sheet3 F-J列 2-12行 30 41 52 30 41 52 30 41 52 30 41 52 30 41 52 30 41 52 30 41 52 30 41 52 30 41 52 30 41 52 30 41 52 2シート分計数が、各列で加算されている。 ーー 上記で、要修正点 ● ("F1:J1")  は ("F1:AD1")  に ● 基データについて   Set sh(1) = Worksheets("Sheet1")   Set sh(2) = Worksheets("Sheet2") は、各々実際のデータのある、別々のブックのシート名に修正してください。 結果シートも修正のこと。

  • kkkkkm
  • ベストアンサー率65% (1616/2455)
回答No.1

Range("F25:F42") は Range(Cells(25,6),Cells(42,6)) と指定することができます。 構文は Range(Cells(Row,Column),Cells(Row,Column)) なので列が変更されていくのでしたらColumnの部分をループ変数にすればループで処理ができます。

samugetan-chan
質問者

補足

ご教示いただいた内容を参考に、下記マクロを書いて実行してみましたが、 「オブジェクト定義のエラーです。」とエラーになってしまいました。 記述方法に誤り等ありましたら、ご指摘いただけるととてもうれしいです。。 Sub マクロ() Dim i As Integer For i = 6 To 30 Step 2 Dim xAdr As String xAdr = "Cells(25, i), Cells(42, i)" Dim buf As String buf = Dir("C:某フォルダ\*あいう*.xlsm") With Workbooks("貼り付け先ファイル.xlsm").Worksheets("貼り付け先シート") Workbooks(buf).Worksheets("シート#1").Range(xAdr).Copy .Range(xAdr).PasteSpecial Paste:=xlPasteValues buf = Dir("C:\某フォルダ\*えお*.xlsm") Workbooks(buf).Worksheets("シート#2").Range(xAdr).Copy .Range(xAdr).PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd End With Next i End Sub

関連するQ&A

  • マクロのワイルドカードの使い方&ループ記述について

    マクロ初心者です! 下記の動作を実現したいのですが、 「(下記★の)フォルダが見つかりません。移動や削除が行われた可能性があります。」とエラーが出ます。 初心者のためエラーの理由がわからず、そもそも記述が間違っているのかも不明な状況です。 知識をお持ちの方がいらっしゃれば、下記動きを実現するために、どこを修正する必要があるのか、 ご教示いただけますと幸いです。。。 実現したい動きとしては以下です。 ・・・・・・・・・・・・・・・・・・・・・・・・・・・ ファイル名に「あいう」を含むファイルを開く →F25:F42の値をコピー …(1) ファイル名に「えお」を含むファイルを開く →F25:F42の値をコピー …(2) (1)と(2)を加算して、貼り付け先ファイルのF25:F42に貼り付け →以上の動きをF列~AC列まで1列おきに行う。 ※以上のすべてのファイルは同じフォルダ内に格納されています。 ・・・・・・・・・・・・・・・・・・・・・・・・・・・ そして、書いてみたマクロは以下です。 Sub マクロ() Dim i As Integer For i = 5 To 28 Step 2 Dim xAdr As Range Set xAdr = Range(Cells(25, i), Cells(42, i)) Dim ex As New Excel.Application Dim wb As Workbook Dim wbA As Workbook Dim sPath Dim sPathA Dim r As Range Dim sht As Worksheet With Workbooks("貼り付け先ファイル.xlsm").Worksheets("指定sheet") sPath = "C:\Users\指定フォルダ\*あいう*.xlsm" ★ Set wb = ex.Workbooks.Open(Filename:=sPath, UpdateLinks:=0, ReadOnly:=True, IgnoreReadOnlyRecommended:=True) wb.Worksheets("指定シート").Range(xAdr).Copy .Range(xAdr).PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd Call wb.Close sPathA = "C:\Users\指定フォルダ\*えお*.xlsm" Set wbA = ex.Workbooks.Open(Filename:=sPath, UpdateLinks:=0, ReadOnly:=True, IgnoreReadOnlyRecommended:=True) wbA.Worksheets("指定シート").Range(xAdr).Copy .Range(xAdr).PasteSpecial Paste:=xlPasteValues Call wbA.Close End With End Sub どうぞよろしくお願いいたします。。

  • 複数シートをループさせてマクロを簡素化したい

    win7 Excel2007 でマクロ作成中の初心者です。 シート数の変動する複数シートの特定範囲を一枚のシートに右列方向に、値を貼り付けたいです。 自動記録でコード作成しましたが、もっと簡素化して軽くしたいです。 シートに対するループ等の作成ができません。どうかご指導お願いします。 Sub 勤怠最終データ作成() Worksheets(1).Select '1番左のシートを選択 ActiveSheet.Unprotect Range("B29:BM60").Select '複写範囲はすべて同じ Selection.Copy Sheets("総括").Select '値の貼り付けシートはすべて同じ Range("A2").Select '値の貼り付け先 Selection.PasteSpecial Paste:=xlPasteValues ’-------------------------------------- Worksheets(2).Select '2枚目のシートを複写 ActiveSheet.Unprotect Range("B29:BM60").Select Selection.Copy Sheets("総括").Select 最終セルの選択 '値の貼り付け先 Selection.PasteSpecial Paste:=xlPasteValues ’-------------------------------------- Worksheets(3).Select '3枚目のシートを複写 ActiveSheet.Unprotect Range("B29:BM60").Select Selection.Copy Sheets("総括").Select 最終セルの選択 Selection.PasteSpecial Paste:=xlPasteValues ’-------------------------------------- Worksheets(4).Select '4枚目のシートを複写 ActiveSheet.Unprotect Range("B29:BM60").Select Selection.Copy Sheets("総括").Select 最終セルの選択 Selection.PasteSpecial Paste:=xlPasteValues 以下省略 End Sub

  • 異なるワークシートに値を貼り付けるマクロ

    数式の入ったワークシートから値のみをコピー&ペーストしたいのですが、うまくいきません。 どこにxlPasteValuesを入れたらいいのでしょうか?よろしくお願いします。 Sub copypaste() Dim bk As Workbook Set bk = Workbooks("‘貼り付け先.xlsm") Workbooks("Book1.xlsm").Worksheets("Sheet1").Range("B2:F6").Copy bk.Worksheets("Sheet1").Range("B2:F6")

  • VBA初心者です。値を貼り付け について質問です。

    VBA初心者です。 値を貼り付け について教えてください。 Sub test() With Workbooks("A.xls").Worksheets("sheet1") .Range("A1").Copy Workbooks("Bxls").Worksheets("sheet1").Range("B2") .Range("A2").Copy Workbooks("B.xls").Worksheets("sheet1").Range("B4") End With End Sub コピーする方に計算式が入っているので 値を貼り付け したいのですが、どうすればいいのでしょうか? PasteSpecial Paste:=xlPasteValues を使ったらよいというところまではわかったのですが・・・。 教えてください!よろしくお願いします!

  • Select Case の使い方について

    エクセルのバージョンは2003です。 Worksheets("様式2")のセルをコピーしてWorkbooks("件数.xls").Worksheets("件数")のセルに数値のみを張り付ける作業を Select Caseを使って組んでいるのですが数が多くて打ち切れません。 WS2からコピーするセルは変わらずWB1へ貼り付けする場所は列がずれて行きます。 myNoは1~30までで、1の場合はC列に数値を貼り付けし、2の場合はD列に数値を貼り付けし、3の場合はE列に数値を貼り付けし・・・ といった具合に列をずらして貼り付けを行いたいのです。 よろしくお願いします。 Dim myNo As Integer Set WS2 = Worksheets("様式2") Set WB1 = Workbooks("件数.xls").Worksheets("件数") myNo = Workbooks("件数.xls").Worksheets("一覧").Range("V7").Value Select Case myNo Case Is = 1 'Worksheets("様式2")からWorkbooks("件数.xls").Worksheets("件数")へ数値のみコピー WS2.Range("T7").Copy WB1.Range("C4").PasteSpecial Paste:=xlPasteValues WS2.Range("T8").Copy WB1.Range("C7").PasteSpecial Paste:=xlPasteValues WS2.Range("T10").Copy WB1.Range("C13").PasteSpecial Paste:=xlPasteValues WS2.Range("T11").Copy WB1.Range("C16").PasteSpecial Paste:=xlPasteValues WS2.Range("T13").Copy WB1.Range("C22").PasteSpecial Paste:=xlPasteValues WS2.Range("T14").Copy WB1.Range("C25").PasteSpecial Paste:=xlPasteValues WS2.Range("T16").Copy WB1.Range("C31").PasteSpecial Paste:=xlPasteValues WS2.Range("T17").Copy WB1.Range("C34").PasteSpecial Paste:=xlPasteValues WS2.Range("T18").Copy WB1.Range("C37").PasteSpecial Paste:=xlPasteValues WS2.Range("T69").Copy WB1.Range("C5").PasteSpecial Paste:=xlPasteValues WS2.Range("T70").Copy WB1.Range("C8").PasteSpecial Paste:=xlPasteValues WS2.Range("T72").Copy WB1.Range("C14").PasteSpecial Paste:=xlPasteValues WS2.Range("T73").Copy WB1.Range("C17").PasteSpecial Paste:=xlPasteValues WS2.Range("T75").Copy WB1.Range("C23").PasteSpecial Paste:=xlPasteValues WS2.Range("T76").Copy WB1.Range("C26").PasteSpecial Paste:=xlPasteValues WS2.Range("T78").Copy WB1.Range("C32").PasteSpecial Paste:=xlPasteValues WS2.Range("T79").Copy WB1.Range("C35").PasteSpecial Paste:=xlPasteValues WS2.Range("T80").Copy WB1.Range("C38").PasteSpecial Paste:=xlPasteValues

  • このVBAの処理を速くしたいのですが…

    お世話になります data.xlsmとBook1-Book25.xlsxの 合計26ファイルを開いた状態で 以下のマクロを実行しています 私が使っているマシンでは 10分くらいかかるのですが この時間を短くすることは 出来ますでしょうか? Sub copy() Application.ScreenUpdating = False Workbooks("Book1.xlsx").Worksheets("Sheet1").Range("A1:D1048576").copy Workbooks("data.xlsm").Worksheets("Sheet1").Range("A1").PasteSpecial Paste:=xlPasteValues Range("G1:K1048576").Clear Range("A1:E1048576").copy Range("G1:K1048576").PasteSpecial Paste:=xlPasteValues Range("I2").ClearContents Range("I1048576").End(xlUp).ClearContents Range("A2:D1048576").Clear Range("O1:Q1").copy Range("S1048576").End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues あとは上記をBook2,Book3と変えてBook25まで同じ式を記入 End Sub

  • マクロでのワイルドカードの使い方について

    マクロ初心者です! 下記の動きを実現したいです。 (1)ファイル「*あいう*」(※)の「シート#1」のF5→AE24までの値をコピー →上記の値をすべて加算し、「貼り付け先ファイル」のF5→AE24に貼り付け ※「某フォルダ」に存在する、ファイル名に「あいう」を含むすべてのファイル(ファイル数は可変)が対象 (2)上記を同様の動きを、範囲のすべてのセルでなく、 (F25:F42)、(H25:H42)、、~(AD25:AD42)と1列ごとに対して行う 方々で知識のある方からご助力いただき、 下記の「それっぽい」記述までは辿り着いたのですが、上手く動かず。。 また、(1)と(2)は1つにできるのでは?とも推測してますが、どのように書けば間違いないのかわからない状況です…! 知識のある方から、間違いや改善点などご教示いただけたらとてもうれしいです。 Sub (1)() Dim folder As String Dim dws As Worksheet Dim sfile1 As String Dim swb1 As Workbook Dim adr As String folder = "C:\Users\某フォルダ\" Set dws = ThisWorkbook.Worksheets("貼り付け先シート") sfile1 = Dir(folder & "*あいう*.xlsm") If sfile1 = "" Then Exit Sub Set swb1 = Workbooks.Open(folder & sfile1) adr = Range(Cells(5, 6), Cells(24, 31)).Address(0, 0, 1) swb1.Sheets("シート#1").Range(adr).Copy dws.Range(adr).PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd swb1.Close False End Sub Sub (2)() ((1)と同じ宣言) Dim c As Integer folder = "C:\Users\某フォルダ\" Set dws = ThisWorkbook.Worksheets("貼り付け先シート") sfile1 = Dir(folder & "*あいう*.xlsm") If sfile1 = "" Then Exit Sub Set swb1 = Workbooks.Open(folder & sfile1) For c = 6 To 30 Step 2 adr = Range(Cells(25, c), Cells(42, c)).Address(0, 0, 1) swb1.Sheets("シート#1").Range(adr).Copy dws.Range(adr).PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd Next swb1.Close False End Sub

  • Excel2007 VBA 転記について

    ご指導のほどお願いします。 見積書からボタン300をクリックするとFAX送付状(テンプレート).xlsに下記内容が転記するように書いたのですが、質問させてください。 ("見積書").Range("c6")→("Sheet1").Range("e14")に貼り付けはうまく行きますが 本当は("見積書").Range("c6")&("見積書").Range("c8")=&"の件"を("Sheet1").Range("e14")に貼り付けしたいのです。 C6セル「○○○工場」 C8セル「○○○作業」 の件 ↑をE14セルに「○○○工場 ○○○作業の件」 として貼り付けたいです。 Sub ボタン300_Click() Workbooks.Open "\FAX送付状\FAX送付状(テンプレート).xls" ThisWorkbook.Worksheets("見積書").Range("a4").Copy Workbooks("FAX送付状(テンプレート).xls").Worksheets("Sheet1").Range("f6").PasteSpecial Paste:=xlPasteValues ThisWorkbook.Worksheets("見積書").Range("i8").Copy Workbooks("FAX送付状(テンプレート).xls").Worksheets("Sheet1").Range("AD9").PasteSpecial Paste:=xlPasteValues ThisWorkbook.Worksheets("見積書").Range("c6").Copy Workbooks("FAX送付状(テンプレート).xls").Worksheets("Sheet1").Range("e14").PasteSpecial Paste:=xlPasteValues  ActiveSheet.Range("F9").Value = Date End Sub ご指導のほどお願いします。

  • Excelマクロのことで教えて下さい

    初歩的なことですみません。 E列の値をF列に値を入れるために下記のマクロを組みました。 Sub test() Worksheets("Sheet1").Select Dim i As Long For i = 2 To Cells(Rows.Count, 4).End(xlUp).Row Range("F2").Value = "=E2/1024/1024" Cells(i, 6).FillDown Range(Cells(2, 6), Cells(i, 6)).Copy Range("F2").PasteSpecial Paste:=xlValues Next i End Sub ところがF列に「値のみを貼り付け」をした時に、途中から同じ値のみがコピーされてしまい困っています。 (画像参照) うまく貼り付けることができるマクロをお教え下さい。 よろしくお願いいたします。

  • WorkbookのCopyについて

    Workbookのコピーについて教えてください。 下記のマクロにセル内の数式もコピーしたいのですが、出来ないで困ってます。 値と数式をコピーする、マクロを入れると指定した範囲にコピーされません。 Sub CopyWorkbookToWorkbook() Windows("sheet2.xls").Activate Workbooks.Open Filename:="D:\book1.xls" Workbooks("book1.xls").Worksheets("sheet1").Range("A6:k1000").Copy Workbooks("book2.xls").Worksheets("sheet1").Range("A6").PasteSpecial    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks :=False,Transpose:=False          Workbooks("book1.xls").Close End Sub よろしくお願いします。

専門家に質問してみよう