dポイントプレゼントキャンペーン実施中!

マクロ初心者です。
表記の件に就き、何卒ご教授の程、宜しくお願いします。

・エクセルで以下のような表があるとします。

__A__B__C__D→
1_数量_単価_金額
2_4,000_100_=B3*C3
3_5,000_200_
4_3,000_120_
5_5,000_160_


・そしてこのAとB列が毎回下に増えるとして、C2セルの数式を
 B列の最後の行までコピーするマクロを教えて下さい。

(実際は、C2セルにVLOOK関数が入っており、最終行は何千行まであります)

何卒ご教授の程、宜しくお願い申し上げます。 

A 回答 (5件)

こんにちは。



単に、

オートフィル
四角の右下の■
をダブルクリックすればよいのではないでしょうか。

------------------------------

マクロの場合は、ちょっと難しいですね。人間が判断していることを、マクロにやらせるようになります。

・数式があるかないかの判定をします。
・数式の最後の行を探さなくてはなりません。もちろん、C2 を基点にしてしまってもよいのですが、工夫がありません。
・すでに数式が入ってしまっている場合には、マクロは実行しない。

以下のコードは、コマンドボタンにすると良いと思います。
本来は、シートモジュール用に作られ、コントロールツールのコマンドボタンの中のコードとして使うように考えらましたが、別のシートでも可能なような、フォームツールにしてもかまいません。

i = 3 'ここを取り去れば、1列目以外のすべての列で可能になります。

なお、一部を削除するなりすれば、特に、3列目にしなくても可能になります。

---------------------------------------


Sub Test1()
  Dim r As Range
  Dim rng As Range
  On Error Resume Next
  If StrComp(TypeName(Selection), "range", 1) = 0 Then
   i = Selection.Column
   If i = 1 Then Exit Sub
   If Application.CountA(ActiveSheet.Columns(i - 1)) = 0 Then Exit Sub
  End If
   '3列目*
   i = 3 'ここを取り去れば、1列目以外のすべての列で可能になります。
  Set rng = ActiveSheet.Columns(i).SpecialCells(xlCellTypeFormulas)
  On Error GoTo 0
  Application.ScreenUpdating = False
  If Not rng Is Nothing Then
    With rng
      Set r = .Cells(.Count)
      If r.Row >= ActiveSheet.Cells(65536, i - 1).End(xlUp).Offset(, 1).Row Then
        MsgBox "最下行まで入っているか、数式は必要ないようです。", 64
      Else
        r.Copy ActiveSheet.Range(r, ActiveSheet.Cells(65536, i - 1).End(xlUp).Offset(, 1))
      End If
    End With
  Else
    MsgBox i & "列目には「数式」が見当たりません。", 48
  End If
  Application.ScreenUpdating = True
  Set r = Nothing
  Set rng = Nothing
End Sub
    • good
    • 0
この回答へのお礼

ご回答有難うございます。
私、簡単な「自動記録マクロ」しかできませんので、
私には理論は理解できませんが、そのままコピーさせて頂いたところ
素晴らしい反映結果が返ってきました。
本当に凄いです。
我々、皆、この件で困っていましたので、本当に助けられました。
本当にありがとうございました。

お礼日時:2008/04/28 13:15

#4の回答者ですが、


#3さんの
>ご回答ありがとうございます!
>まさに求めていたもの、そのものです
ということは、C2の値のコピーを最後までして、それが正解なら、#4の回答は違います。私は、数式コピーだと思いましたから。
    • good
    • 0
この回答へのお礼

いえすいません。
最後まで確認できていませんでした。
求めていたものは数式コピーでした。
ありがとうございました。

お礼日時:2008/04/28 13:20

#1です。


質問は「マクロを」ということでしたか・・・。

Sub test()
Range(Range("C3"), Range("C" & Range("B65535").End(xlUp).Row)).Value = Range("C2").Value
End Sub

こんな感じになりますね。
    • good
    • 4
この回答へのお礼

ご回答ありがとうございます!
まさに求めていたもの、そのものです。
問題が解消されました。
他の列で行うときは「C」を「○」列に変えれば大丈夫ですよね?
本当にありがとうございました。

お礼日時:2008/04/28 12:58

いろいろやり方はありますが、私なら



1)C2を選択
2)[CTRL]+[C](コピー)
3)[←](B2を選択)
4)[CTRL]+[↓](B列の最後まで)
5)[→](C列を選択)
6)[CTRL]+[SHIFT]+[↑](上記セルからB2までの範囲を選択)
7)[CTRL]+[V](ペースト)

と操作します。
ちなみにVLOOKUPの範囲指定のセル参照は絶対参照にしておかないと、エラーになってしまいますので気をつけてください。
    • good
    • 0

マクロで行う理由が解りませんが、それだけの機能であればマクロは不要です。


フィルコピーではダメなのですか?

http://www.relief.jp/itnote/archives/001648.php
http://hamachan.info/excel/o-tof.html

この回答への補足

ご回答有難うございます。
記述不十分で申し訳ございません。
上席(年配者)がボタン一つで見れるようなマクロの一部分で、
今まではそこだけ数千行まで先に入れてました。

補足日時:2008/04/28 11:50
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!