エクセルでマクロを使った同一処理を列方向に繰返す方法

このQ&Aのポイント
  • VBAを使用して、エクセルでマクロを使った同一処理を列方向に繰り返す方法について説明します。
  • 具体的には、添付図の表でB2店について品名・数量・金額を、4行目~10行目まで、金額の多い順に並べ替え、金額の合計をセルD2に記入するマクロを実装する方法を解説します。
  • さらに、この処理をE5店、H8店……と3列ずつ例えば20ブロック処理するプログラムについても説明します。
回答を見る
  • ベストアンサー

エクセルでマクロを使った同一処理を列方向に繰返す?

VBAの初心者です。マクロを使った同一処理を各列ブロック(3列が1単位)毎に 繰り返して列方向に多数のブロックまで行うVBAはどのようなものになるのでしょうか。 具体的には添付図のような表で、B2店について品名・数量・金額を、4行目~10行目まで、金額の多い順に並べかえた後、金額の合計をセルD2 に記入するマクロ(この記述は下記のようになりましたが)、この処理をE5店、H8店……と3列ずつ例えば20ブロック処理するプログラムはどのようにしたらよいでしょうか(20ブロック目の列番号はBG,BH,BIです)。どなたか教えていただけないでしょうか。 Sub 多い順と合計() Range("B3:D10").Select Selection.Sort Key1:=Range("D4"), Order1:=xlDescending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin Range("D2").Select ActiveCell.FormulaR1C1 = "=SUM(R[2]C:R[18]C)" Range("B2").Select End Sub

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

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

こんにちは! せっかくNo.2さんがヒントを出してくださっているので、 余計なお世話かもしれませんが・・・ Sub 並び替え() Dim j As Long For j = 2 To Cells(3, Columns.Count).End(xlToLeft).Column Step 3 With Cells(3, j) .Resize(8, 3).Sort key1:=.Offset(, 2), order1:=xlDescending, Header:=xlYes .Offset(-1, 2) = WorksheetFunction.Sum(.Offset(1, 2).Resize(7)) End With Next j End Sub こんな感じではどうでしょうか?m(_ _)m

qwer098123
質問者

お礼

お答え有難うございます。 ともかく試させていただきました。すっきりです。 読み解くのにまだ勉強しなければいけないところがありますが 今回実際に直面しているのは、1ブロックあたりのマクロ処理がもっと 長いのですが、いただいた式で、セルの表現をきちっとおさえて適用 しようと思います。助かりました。

その他の回答 (2)

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.2

マクロの記録で得られたコードだと思いますが、 Range("B3:D10").Select をCellsを使って同じことをさせると Range(Cells(3, 2), Cells(10, 4)).Select Range("D4")は Cells(2, 4) Range("D2").Select はCells(2,4).Select と使ってできます。 試しに Sub Test() For i = 2 To 32 Step 3 Range(Cells(3, i), Cells(10, i + 2)).Select MsgBox "選択位置の変更" Next End Sub を試してみてください。今のコードをどうのようにすれば良いか 参考にしてみてください。

qwer098123
質問者

お礼

早速にお答え有難うございます。 試してみました。なるほどMsgBox "選択位置の変更"がはいっているので ステップがつかめました。活用させていただきたいと思います。

回答No.1

RangeをCellsにして For~next を使ってみた Sub 多い順と合計2()    Dim n As Long    For n = 0 To 57 Step 3        Range(Cells(3, 2 + n), Cells(10, 4 + n)).Sort Key1:=Cells(4, 4 + n), Order1:=xlDescending, Header:=xlGuess, _        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _         :=xlPinYin        Cells(2, 4 + n).FormulaR1C1 = "=SUM(R[2]C:R[18]C)"    Next n End Sub

qwer098123
質問者

お礼

早速に回答有難うございます。 試してみましたら、一瞬で目的としていたことができました。 まだ式は全ては読みきっていないので、後でしっかり理解したいと思います。

関連するQ&A

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

    マクロ初心者です。 A~D列の表が少ない時100行、多い時400行あり、同じ操作を何回か繰り返すため、できればマクロで処理したいと思っています。 マクロ記録で作成したのですが、最終行が一定ではないため行数が増えると上手く作動しません。 どこを修正したらいいでしょうか。ご教示いただければ幸いです。 Sub Macro1() ' ' Macro1 Macro ' ActiveCell.FormulaR1C1 = "=SUBSTITUTE(RC[-1],""集計"","""")" Range("G2").Select Selection.AutoFill Destination:=Range("G2:G4"), Type:=xlFillDefault Range("G2:G4").Select Range("H2").Select ActiveCell.FormulaR1C1 = "=SUMIF(R2C1:R13C1,RC[-1],R2C2:R13C2)" Range("H2").Select Selection.AutoFill Destination:=Range("H2:H4"), Type:=xlFillDefault Range("H2:H4").Select Range("H5").Select ActiveCell.FormulaR1C1 = "=SUM(R[-3]C:R[-1]C)" Range("H6").Select End Sub ちなみに作成したいマクロ 1.F列にA列の「集計」を取り出して、G列にF列の「集計」文字を取り除く。 2.H列にB列「数」を計算する 3.H列の最終行に合計を出す。

  • エクセル マクロ 足し算

    いつもお世話になります。マクロ勉強中の初心者です。 マクロの足し算を教えてください。 A列  B列  C列 ・・・・  1   2    3  4   5    6  7   8    9 という数字のデータがあります。 これらのA列の合計、B列の合計・・・など列の合計を出すマクロはわかるのですが、  作成したVBA    Range("a4") = Application.WorksheetFunction.Sum(Range("a1:a3")) A列の合計(A1~A3)とB列の合計(B1~B3)とC列(C1~C3)の合計を、D4に合計させる方法を 教えてください。 どうぞよろしくお願いします。

  • Excell : 現在のカーソルがある行の特定の列に値を書き込むマクロ

    現在のカーソルがある行の特定の列に値を書き込むマクロの書き方を教えてください。以下は20行めのA列、B列にa, b を書き込むものですが、最初のRange("A20").Selectをカレント行に設定するコードを書けばいいのでしょうか?具体的な記述を教えてください。よろしくお願いします。 Sub Macro4() Range("A20").Select ActiveCell.FormulaR1C1 = "a" Range("B20").Select ActiveCell.FormulaR1C1 = "b" Range("C20").Select End Sub

  • (マクロ)カット&ペーストを列毎に繰り返したい

    下のように、A列から50列目までデータが入力されています。 各列、データは上から順に詰まっている状態です。 C列のように1つもデータが入力されていない列もあります。 ------------------------------------------ A列 B列 C列 D列 ・・・ Z001 Z003 Z004 Z002 Z005 ------------------------------------------ これを、「B列から順にデータをカットして、A列最終行の下にペーストする」という作業を、各列毎に50列目まで繰り返したいと思っています。 完成イメージは下記のようになります。 ------------------------------------------ A列 B列 C列 D列 ・・・ Z001 Z002 Z003 Z004 Z005 ------------------------------------------ 下記のようにマクロを組みましたが、無限ループになっているのか、強制終了となってしまいます。 どういうふうにマクロを組めばいいのでしょうか? 宜しくご教授お願いいたします。 Sub ADD() Dim i, j As Long For j = 2 To 50 '列番号指定 'B列1行目から順にセルが空白でなければカットする。 i = 1 Do While Cells(i, j).Value <> Empty Cells(i, j).Select Selection.Cut 'A列の最終行の1つ下の行に貼り付ける。。 Range("A1").Select Range(Selection, Selection.End(xlDown).Offset(1, 0)).Select ActiveSheet.Paste i = i + 1 Loop Next End Sub

  • エクセル マクロでの繰り返し処理について

    エクセル初心者です。エクセル2010を使用しています。 とあるホームページから、ページをコピーして、エクセルに「テキストで貼り付け」をおこない、 A列に8行の項目が入ります。この8行と次の8行の間には、自然に空白行が1行ずつ入ります。 これは、完全に手作業です。 次に、下記の作業を、マクロの自動記録を相対参照で行います。 上記のエクセルのデータを、1つめの8行のデータをコピーして(A1からA8)、C1に「行と列を入れ替え」を選択してC1からJ1に貼り付けます。 その後は、次のデータのまとまりのA10のセルに移ります。これをCtrl+a を押し続けることで、数百件か多いときは4000件ほどの並べ替えをしています。 「データがある間は、この処理を繰り返す。」 というマクロにしたいのですが、参考書等を見ながらチャレンジしてもうまくいきません。 わかる方、教えていただけますか。 以下が、マクロの自動記録でできた物です。データの個数は数百のこともあれば4000件のこともあります。 Sub 行列入れ替え8行() ' ' 行列入れ替え8行 Macro ' ' Keyboard Shortcut: Ctrl+a ' ActiveCell.Range("A1:A8").Select Selection.Copy ActiveCell.Offset(0, 2).Range("A1").Select Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True ActiveCell.Offset(9, -2).Range("A1").Select End Sub どうぞ、ご指導よろしくお願いいたします。

  • エクセルで列抽出できる関数かマクロを探しています。

    エクセルで列抽出できる関数かマクロを探しています。 マクロ初心者です。 表の形は、 A1  B1  C1  D1  E1 容量 0.1 5.5 11 22 形式 NF30 NF63 NF125 NF250 カバー TCS … と、電気部品のモータ容量と定格電流で抽出したいのです。 行で抽出するととても見づらく、列で一気に見れるように (制御器選定スケールの様に)したいのです。 スケールだけで形式は選定できるのですが、カバーも選定するために 毎回カタログで確認するのは仕事の効率が良くなく 表を作成しようと思いたったのですが・・・ いろいろ探してみたのですが、今のところ見つからず 今試しているのが、表を一度コピーして列行を入れ替えて 別シートにコピーしたものを作成してからオートフィルタをかけて 抽出したデータを別シートにもう一度列行を入れ替えて貼り付けする 方法しか考え出せていません。 質問なんですが、 上記のように列抽出できる関数やマクロがあるのか? それとも一度行抽出に変えて最後に列に戻すやり方の方が良いのか? 又、そのやり方を初心者なりに作成してみたのですが 1回目は出来ても、容量が変わるとエラーが出てきて出来ません。 Sub Macro1() Range("A31").Select ActiveCell.FormulaR1C1 = "=Sheet1!R5C2" Range("J31").Select ActiveCell.FormulaR1C1 = "=Sheet1!R6C2" Range("J32").Select ActiveWindow.SmallScroll Down:=-9 Range("A1:X24").Select Range("A1:X24").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _ Range("A30:X31"), Unique:=False ActiveWindow.SmallScroll Down:=-12 Selection.Copy Sheets("Sheet1").Select Range("F1").Select Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True Sheets("Sheet3").Select Application.CutCopyMode = False ActiveSheet.ShowAllData End Sub たぶん、行列の入れ替えが上手くいかないのかなとは素人ながらに考えて 色んなサイトで調べてみていじってみるのですが、なかなか上手くいきません。 皆様、宜しくお願いいたします。

  • Excelで、A列、B列の値を新しいシートに3行ごとにどんどん貼り付け

    Excelで、A列、B列の値を新しいシートに3行ごとにどんどん貼り付ける。 という事をしたいのですが、VBAを始めたばかりなので上手く書くことが出来ません。 例)    A列   B列   101  りんご    102  ぶどう   103  オレンジ   104   桃   105  バナナ      ・      ・      ・ これを別のシートに    A列   B列   101  りんご (2行あける)   102  ぶどう (2行あける)   103  オレンジ (2行あける)    104   桃 (2行あける)    105  バナナ      ・      ・      ・ と表示したいのです。 現在は下記のようなリンクで表示していますが、 件数が少ない時は4件から多い時は800件と幅があります。 出来れば表の一番下(空欄になる部分)まで繰り返し処理をしたいと思っています。 セルの中身が表示されるならリンクでもコピーでも構いません。 現在のマクロ Sub Macro2() Worksheets("Sheet2").Select Range("C11").Value="=Sheet1!A2" Range("C14").Value="=Sheet1!A3" Range("C17").Value="=Sheet1!A4" Range("C20").Value="=Sheet1!A5" Range("C23").Value="=Sheet1!A6" Range("H11").Value="=Sheet1!B!" Range("H14").Value="=Sheet1!B2" Range("H17").Value="=Sheet1!B3" Range("H20").Value="=Sheet1!B4" Range("H23").Value="=Sheet1!B5" End sub 45行分まで書いたところで途方に暮れております。 よろしくお願いいたします。

  • エクセル マクロの2変数処理

    10年以上前にちょっとかじった素人です。使っているテキスト本が古い様です。 以下のようなエクセル表(例題)です。 もともとの表の作り方に問題があるのですが、変更できません。 A 列=欄番, B列=識別CodeB、C列=識別CodeC、D列=店名、E列=地域、F列=商品名、G列=売り単価、H=仕入れ単価、I=差益 注) I=差益は合計欄のみに入力されております。 A、 B 、C 、D    、 E 、 F   、 G 、 H 、 I 、 1、B1、C1、関東商店、関東、はさみ、100、90、 2、  、 、      、   、クリップ 100、90 3、                (合計) 200、180、20 4、B2,C2,関西商店、関西、 ノート、100、90、 5、                クリップ 100、90、 6、                消しゴム100、90、 7、                (合計) 300、270、30 8、B3、C3、沖縄商店、沖縄、ペン   100、90 9、                (合計) 100、90、10 欄番1は6行目から始まっております。 (合計)の文字は入力されておらず空欄です。 商品の数量は不定です。 差益は合計欄に合計が入れてあり、個々にはありません。 B列のコードの有無を条件にDとEの店名、地域を(合計)欄のD,とEに貼り付けたいのですが、 行数が不定なので合計金額の有無を条件にD,とEに貼り付けようとしたところ、コピーまでできましたが貼り付けができません。解決方法を教えてください。 よろしくお願いします。 注)Selection.PasteのOperation:=からは手打ちで足しました。 Sub CopyPaste() Dim n As Long Dim m As Long Dim jbNOM As Variant Dim prAMT As Variant n = 6 m = 7 Do While Range("A" & n).Value <> "" jbNOM = Range("B" & n).Value prAMT = Range("I" & m).Value If jbNOM <> "" Then Range("D" & n & ":E" & n).Select Selection.Copy If prAMT <> 0 Or IsNull(prAMT) Then Range("D" & m & ":E" & m).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=Fales, Transpose:=Fales Else m = m + 1 End If Else n = n + 1 End If Loop MsgBox "Complete" End Sub

  • 列を2度コピーするマクロ

    B列をC列にコピーした後、A列をB列にコピーするという2段階コピーの下記マクロを、「新しいマクロの記録」を使って作りました。 しかし下記マクロは 列選択時の青反転が実行時に残って、使用感がいまひとつです。 「新しいマクロの記録」ではなく、もっとスマートなマクロはできないでしょうか? なお、列選択ではなく必要なセル数だけ選択すれば青反転はなくなると思いますが、行数が確定していないので列選択にしたいと思っています。 ついでに下記マクロについて質問です。 11行目はなぜ5行目とは違うのでしょうか?.PasteとPasteSpecial Pasteとの違いを教えていただければ幸いです。 Sub Macro1() Columns("B:B").Select Selection.Copy Columns("C:C").Select ActiveSheet.Paste Columns("A:A").Select Application.CutCopyMode = False Selection.Copy Columns("B:B").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("A2").Select Application.CutCopyMode = False ActiveWorkbook.Save End Sub

  • エクセル VBAマクロ セルの単純移動

    基本的な質問ですが、よろしくお願いします。 エクセルのVBAで、Selectセルを1つだけ上下左右に移動させることを ”汎用的に書く”としたらどのようにすれば良いでしょうか? 例えば、Selectセルを一番上や、一番下、へというのであれば、 Selection.End(xlUp).Select Selection.End(xlDown).Select 一番右や、一番左なら、 Selection.End(xlToRight).Select Selection.End(xlToLeft).Select のように書いて、実行できます。 それでは、今いる所のすぐ隣りのセルへ移動させるということを 同じように表現するには、どのようにしたら良いでしょうか。 事の発端は、 マクロの自動記録を使って、セルを移動していっても、 Range("A1").Select Range("B1").Select Range("B2").Select Range("C2").Select Range("C3").Select : のように、絶対セル位置で記録されてしまうため、 同じような処理を順に隣りや後の行・列に向かって繰り返すような処理を 書こうとしたときに、汎用的には動いてくれないところからです。 参考になるページを自力では見つけられませんでした。よろしくお願いします。

専門家に質問してみよう