こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

オートフィルのマクロを作りたい

ある列に複数のデータがある場合、その一番上の右隣のセルに数式などを入力後、そのセルの右下の小さい四角をダブルクリックすると、左の列のデータある一番下までオートフィルされますよね。
これのマクロを組みたいのですが、単純に出来ません。
普通通りマクロの記録をすると、実際に入力されていたセル番号までのマクロとなってしまい、データを追加した場合意味が無くなります。
具体的に説明すると、
A1からA10までそれぞれデータがある場合、
B1に数式を入力後、オートフィルでB10までコピー。
これをマクロで組もうとすると、B10までのフィルが組まれてしまい、A11~A20までデータを追加後マクロを実行してもB10までのフィルしか実行されません。
「左の列のデータがあるところまで」というマクロは組めないのでしょうか。

投稿日時 - 2005-05-27 21:31:54

QNo.1413766

暇なときに回答ください

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

B1をオートフィルする範囲は、A1~A65536でCtrl+↑したデータ範囲の右隣の列ということになり

Sub test()
  Range("B1").AutoFill Destination:=Range("B1", Range("A65536").End(xlUp).Offset(, 1))
End Sub

という感じで如何でしょうか。

投稿日時 - 2005-05-27 21:55:22

お礼

ありがとうございました。
これで目的の操作のマクロを組めるようになりました。

投稿日時 - 2005-05-30 17:25:18

ANo.1

このQ&Aは役に立ちましたか?

6人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

#2 の私のコードは、A1~Aのデータのあるところまでの範囲を、B1の式を反映させたい、というコンセプトに対して、左の列で範囲を取ってから、その範囲自体を右に移すというロジックです。

例えば、実際にVBAのコードを書いていく場合は、

Set myRange =Range("A1", Range("A65536").End(xlUp))

としておけば、それを1つの長さ(領域の範囲)として、

myRange.Offset(,i)
で、列の移動を、For ~To .. Next で、そのまま中身を換えずに使い回しすることも可能なのです。

もしも、A1 ~ A列の最後尾(例 A10) の、B列までの範囲(A1:B10)を取りたい場合は、

Range("A1", Range("A65536").End(xlUp).Offset(,1))

ですね。一応、ご参考までに。

投稿日時 - 2005-05-28 10:57:08

ANo.5

 ja7awuさんへ

ja7awuさんを始め数人の方の回答は必ず眺めるようにしているのですが、No4.でちょと気になる発言がありましたので一言。

>ちょっと類似コードをUPする意図は、解りません。
>当方に、ポイントは一切必要ありませんので、他の方へ差し上げてください。

こういうのは読む方としてはあまり愉快なものではありません。特にja7awuさんの回答を楽しみしている当方などにとっては。

今回の場合はちゃんと別案が提示されてるので別にどうのこうのという問題でもないような気もしますが。

もしそれを言うなら、参考URLの問題で、他の回答と全く同じ回答をされてますが(しかも他の回答より拙い、また別案もない)、その意図をお尋ねしたくなります。(^^;;;

それから、何にもならないポイントなんか誰も欲しくはないでしょう。(^^;;;;

ja7awuさんほどの方がこれくらいのことで、と今回はちょと吃驚しましたので一言書いてみました。

これからも目から鱗の回答を期待しています。
 

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=1406981

投稿日時 - 2005-05-28 09:34:08

ANo.4

#1 ですが、類似のコードがレスされていますので、shibiseiさんの混乱をさけるため
補足いたします。

説明文の表現が まずかったところもあったようですが・・・

Range("B1").AutoFill Destination:=Range("B1", Range("A65536").End(xlUp).Offset(, 1))

のコードについて、オートフィルする範囲の先頭は、計算式が入力されているB1ですから、
ゴードの左と同じで構いません。 別にA1をオフセットする必要は、ありません。

それで、オートフィルする範囲の最終については、

>「左の列のデータがあるところまで」というマクロは組めないのでしょうか。

という質問ですので、その「左の列のデータ最終」は、A65536でCtrl+↑ した時のセルの右隣
ですので、その部分のコードが、Range("A65536").End(xlUp).Offset(, 1) となっています。

ちょっと類似コードをUPする意図は、解りません。

当方に、ポイントは一切必要ありませんので、他の方へ差し上げてください。

投稿日時 - 2005-05-28 06:43:11

ANo.3

No.1,2の方とは視点を変えてみました。
最終行を変数で取得し,cellでb1のセルから最終行のセルまでフィルハンドルをドラッグさせてみました。
お試しください。

Sub Macro1()
ActiveCell.SpecialCells(xlLastCell).Select
lasty = ActiveCell.Row 'lastyは変数
Range("b1").Select
Selection.AutoFill Destination:=Range(Cells(1, 2), Cells(lasty, 2)), Type:=xlFillDefault
End Sub

投稿日時 - 2005-05-28 00:34:28

お礼

ありがとうございました。
確かに私の質問内容でのマクロは組めました。
ただ私のマクロに対する理解が乏しいため、他のセルでの適用がうまくできませんでした。
Range("b1").Select
のB1の部分を修正するだけでは駄目なのでしょうか。
#1,2の方の回答で目的は果たせましたので、今後勉強したいと思います。

投稿日時 - 2005-05-30 17:30:15

ANo.2

Wendy02 です。
あまり評価を受けないかもしれませんが、

Sub TEST()
 Range("B1").AutoFill Range("A1", Range("A65536").End(xlUp)).Offset(, 1)
End Sub

たぶん、こういうことでしょうね。
ただ、あまり、こういう AutoFill 自体は必要ないかもしれませんね。VBAのコードらしい書き方ですと、こんな書き方になるかと思います。

Sub TEST2()
With Range("A1", Range("A65536").End(xlUp)).Offset(, 1)
  .Formula = Range("B1").Formula
End With
End Sub

投稿日時 - 2005-05-27 22:24:22

お礼

ありがとうございました。
教えていただいた内容でも#1の方と同様に目的の操作のマクロが組めました。

投稿日時 - 2005-05-30 17:26:59

あなたにオススメの質問