- ベストアンサー
エクセルのマクロについて
エクセルで、毎日12行のデータが増えていくシートがあるのですが、集計の都合でどうしても最終行に関数式があり、その式の1行上に毎日「12行挿入」してデータを入れてます。毎日行挿入を何回も繰り返すのは面倒なので、マクロを記録しましたが、挿入する列番号が絶対参照?だったらしく、翌日は変な所に12行挿入してしまいます。マクロで毎日最終行の一つ上に12行挿入する方法をご存知の方、その方法を教えてください。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
マクロ記録をして、それを修正しながら覚えるのが良いと思います。 記録マクロが下記のようだとしたら、 Sub Macro1() Selection.EntireRow.Insert Selection.EntireRow.Insert Selection.EntireRow.Insert '・ '・ End Sub 日本語に約すと Sub Macro1() 選択した所に行挿入 選択した所に行挿入 選択した所に行挿入 '・ '・ End Sub って感じでしょうか。 選択した所に挿入しているので、最終行を選択してやれば良いわけです。 A列が最終行を保持している列として、下記の操作を記録します。 1.何にもデータが無い列の何処かのセル(例ではG1)を選択 2.Ctrlキーを押しながら↓キーを押す 3.Ctrlキーを押しながら←キーを押す 4.Ctrlキーを押しながら↑キーを押す 5.記録終了 Sub Macro2() Range("G1").Select Selection.End(xlDown).Select Selection.End(xlToLeft).Select Selection.End(xlUp).Select End Sub 後は二つをつなげると完成です。 Macro2のSub Macro2()~End Subの間をMacro1の一番うえにコピーします。 Sub Macro1() '↓Macro2より Range("G1").Select Selection.End(xlDown).Select Selection.End(xlToLeft).Select Selection.End(xlUp).Select '↑Macro2より Selection.EntireRow.Insert Selection.EntireRow.Insert Selection.EntireRow.Insert '・ '・ End Sub 慣れてくるとマクロ記録は無駄な行が多いのに気付くようになります。 同じ処理はループに直すとか、無駄にSelectしている行を削るとか、色々試してスキルアップして行けば良いでしょう。いずれ #3さんのようにシンプルに書けるようになるために。
その他の回答 (6)
- imogasi
- ベストアンサー率27% (4737/17069)
#5です。 下記はどうでしょうか。F列までの6としていますが 本番の実情に合わせて変えて下さい。 Sub text01() d = Range("a1").CurrentRegion.Rows.Count ' MsgBox d Range(Cells(d - 1, 1), Cells(d - 1 + 11, 6)).Select Selection.Insert (xlDown) For i = 1 To 6 Cells(d - 1, i) = Cells(d - 1 + 12, i) Cells(d - 1 + 12, i) = "" Next i End Sub
お礼
ちょっと難しいですが、コピー&ペーストで使ってみます。どうもありがとうございました。
- ki-aaa
- ベストアンサー率49% (105/213)
行の挿入の方法はすでにかかれている方法で良いと思います。 しかし、実際の処理としては、最終行をコピーし、12行下に貼り付けて、元の、最終行をクリアした方が簡単です。この方法だと、$A$1:A30みたいな式は、自動的に$A$1:A42に、変更されます。 もちろん、行の挿入でも、INDIRECTや OFFSET使って、関数を書けばできます。 でわでわ
お礼
ありがとうございます。毎日12行挿入するため、OFFSETは使いまくっております(笑)。
- imogasi
- ベストアンサー率27% (4737/17069)
1つ気になることが在ります。例えば C1:C5を合計するためにC6に=Sum(c1:c5)で出している時、C6をポイントして、何行かを挿入すると、C6の式は下の行へ移動しますが、式は=Sum(c1:c5)のままです。エクセル2000。 途中の行をポイントして、行挿入すると=Sum(c1:c5)のC5の部分がC8とかに変化してくれます。 本質問では当然「行まで」の部分も変化してくれないと ダメだと思いますが、既回答のマクロは大丈夫でしょうか。私は悪戦苦闘中ですが。
補足
質問では便宜上「最終行」と書きましたが、集計や分析の為の関数が常に正しい範囲を対象にさせるため、最終行の一つ上に空白行があり、その空白の一つ上に行挿入しているので大丈夫なんです。説明不足ですみません。
- GuruGuru22
- ベストアンサー率51% (177/346)
マクロを編集しなければ、 実現は難しいかと思います。 覚える気があるのなら、 http://www.moug.net/skillup/buef/vy003-1.htm とか見てくださいな。 ちなみに A列の最終行の一つ上に12行挿入するのはこんな感じ。 Sub LinesInsert() With Range("A65536") Range(.End(xlUp), .End(xlUp).Offset(11)).Insert xlDown End With End Sub
お礼
ありがとうございます。・・・ちょっとまだ私には理解できませんでした。マクロの編集方法さえ知らないので・・・。勉強して上記の例を使わせていただきます。
- otake2002
- ベストアンサー率29% (18/61)
こんばんは。 マクロを勉強し始めて一週間の初心者が、恐れ多くも回答してしまおうと・・・m(__)m 自動記録を使ったマクロの作成で、通常の操作ではセルの参照は絶対参照でおこなわれますよね? で、ですね、それを相対参照でおこなう方法が以下のサイトに記述されています。 あ、そんなことはもうご存知? し、失礼しましたっ!(笑) http://softplaza.biglobe.ne.jp/text/1999sp/vba/vba1_3.htm 私もNo,1様の仰るような、直接Editorを作れるように、早くなりたいです♪
お礼
参考URLで勉強してみます。ありがとうございました。
- kakusuke
- ベストアンサー率36% (95/259)
最終行に関数をセットしたほうが 早いんじゃないでしょうかってことで、 Public Sub SaishugyoSet1() Dim lngX As Long '行番号 Dim lngY As Long '列番号 For lngX = 65536 To 1 step - 1 If Sheet1.Cells(lngX, 1).Value <> "" Then If lngX > 1 Then Sheet1.Cells(lngX+1, 1).Value = _ WorksheetFunction.Sum _ (Sheet1.Range(Cells(1, 1), _ Cells(lngX, 1))) 'sum関数 End If Exit For End If Next End Sub 最終行をずらすってのは Public Sub SaishugyoSet2() Dim lngX As Long '行番号 Dim lngY As Long '列番号 For lngY = 1 To 255 For lngX = 65536 To 1 step - 1 If Sheet1.Cells(lngX, 1).Value <> "" Then If lngX > 1 Then Sheet1.Cells(lngX + 12, 1).Value = _ Sheet1.Cells(lngX, 1).Value Sheet1.Cells(lngX, 1).Value = "" End If Exit For End If Next Next End Sub 適当に書いてみましたが、 時間がかかりそうです。
補足
早速のご回答ありがとうございます。・・・しかし、全く分かりません。私はマクロを編集したことが無く、いつも実際の入力をマクロに記録していただけなので・・・。すみません。実際に行挿入するときに(マクロを記録している時に)最終行の一つ上に行挿入する方法を(あれば)知りたいのです。例えばF4を押しながら行挿入するとか・・・?そんなのってないのでしょうか?
お礼
マクロを勉強しないと・・・タグさえ知らないので・・・。ありがとうございました。