• ベストアンサー

(Excel2003)すぐ左の最後の行までコピーするマクロを教えてください

マクロ初心者です。 表記の件に就き、何卒ご教授の程、宜しくお願いします。 ・エクセルで以下のような表があるとします。 __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関数が入っており、最終行は何千行まであります) 何卒ご教授の程、宜しくお願い申し上げます。 

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 単に、 オートフィル 四角の右下の■ をダブルクリックすればよいのではないでしょうか。 ------------------------------ マクロの場合は、ちょっと難しいですね。人間が判断していることを、マクロにやらせるようになります。 ・数式があるかないかの判定をします。 ・数式の最後の行を探さなくてはなりません。もちろん、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

skyly001
質問者

お礼

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

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

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

skyly001
質問者

お礼

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

noname#62235
noname#62235
回答No.3

#1です。 質問は「マクロを」ということでしたか・・・。 Sub test() Range(Range("C3"), Range("C" & Range("B65535").End(xlUp).Row)).Value = Range("C2").Value End Sub こんな感じになりますね。

skyly001
質問者

お礼

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

noname#62235
noname#62235
回答No.2

いろいろやり方はありますが、私なら 1)C2を選択 2)[CTRL]+[C](コピー) 3)[←](B2を選択) 4)[CTRL]+[↓](B列の最後まで) 5)[→](C列を選択) 6)[CTRL]+[SHIFT]+[↑](上記セルからB2までの範囲を選択) 7)[CTRL]+[V](ペースト) と操作します。 ちなみにVLOOKUPの範囲指定のセル参照は絶対参照にしておかないと、エラーになってしまいますので気をつけてください。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

マクロで行う理由が解りませんが、それだけの機能であればマクロは不要です。 フィルコピーではダメなのですか? http://www.relief.jp/itnote/archives/001648.php http://hamachan.info/excel/o-tof.html

skyly001
質問者

補足

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

関連するQ&A