『1つ上の関数をコピーしたい』(ちょび助) Excel2010 A列には氏名・B列にはIDが入力します。 現在29行目までデータが入力されている状態です。 30行目以降に氏名とIDが入力されたら1つ上に 入力されているC29〜HN29の関数を30行以降にコピー されるマクロを教えていただけますか? よろしくお願いします。 ※一部文字化けしていましたので修正しました。 ---- エクセルの機能で「テーブル」がありますけど 範囲(列見出しを含む)を選択して [挿入]-[テーブル] (seiya) ---- seiyaさん ありがとうございます。 なんか表がカラフルになっただけなんですが・・・ ちょび助 ---- 配色は テーブルデザイン で調整 データを追加すると一行上の数式が自動で配置されますが? (seiya) ---- テーブルの使い方が良くわかりません、私も色が変わっただけでした。 そのあと何か必要なのでしょうか? A30 B30セルに入力されると、C29−HN29の関数がC30−HN30にコピーとありますが、1行毎に順次コピーでしょうか? A40−B40前後までまとめて入力したあとにC29−HN29の内容をC40−HN40までコピーでしょうか? コピーする関数は絶対参照か相対参照かで記述が相違するような、オフセットで対応できそうな気がしますが。 (minoru) ---- >そのあと何か必要なのでしょうか? 「30行以降のA列かB列のセルにデータを入れる」ことだと思いますけど? (半平太) 2013/08/14(Wed) 18:33 ---- 再度テーブルの設定をしてみましたがうまく関数が反映されませんでした。 あと表の見出しが一部3行目と4行目がセルの結合されているので、 フィルタがついて変な感じになっています。(-_-;) ちょび助 ---- > あと表の見出しが一部3行目と4行目がセルの結合されているので、 > フィルタがついて変な感じになっています。(-_-;) テーブル(データベース)に結合セルは厳禁.... (seiya) ---- そうですか・・・ やっぱりマクロになりますか? ちび助 ---- ドッカーンと素晴らしい花火見てきました、お盆ですね。 なんとなくですが、B列の30行目以降を入力後に、マクロ実行でB列データ最下行位置を取得して、C29の数式を相対参照でデータ最下行までコピーできました。 ※設問のHN29までは範囲指定していません。 Sub 追加() Dim LastRow As Long LastRow = Cells(Rows.Count, 2).End(xlUp).Row Range("C29").Select Selection.AutoFill Destination:=Range(Cells(29, 3), Cells(LastRow, 3)), Type:=xlFillDefault End Sub (seiya)様(半平太)様へ  他人様の質問スレッドで恐縮ですが、テーブル機能を初めて使用しました。 便利な機能ですね、知らないと余計な回り道ばかりでした、ありがとうございます。 (minoru) ---- minoruさんありがとうございました。 マクロを実行したらC列だけ関数がコピーされたので、C29〜HP29を範囲指定できるようにしたら デバックが表示されてしまいました。 Dim LastRow As Long LastRow = Cells(Rows.Count, 2).End(xlUp).Row Range("C29:HP29").Select Selection.AutoFill Destination:=Range(Cells(29, 3), Cells(LastRow, 3)), Type:=xlFillDefault   ↑ここでデバックが表示されてしまいました。   実行時エラー1004   RangeクラスのAutoFillメゾットが失敗しました。 minoruさんのマクロを実行するとC29をもとにリストを追加するたびにコピペされるようで、既に入力されている 関数の内容が変わってしまいます。 (一部シート見出しを参照にしているところがあるためその部分がコピー元になってしまいます。) わがままばかり言ってすみませんが追加された部分のところのみ関数を貼り付けるといった内容に変更していただけ ないでしょうか? すみませんがよろしくお願いします。 ちょび助 ---- 形式を選択して貼り付け の中に「数式と書式」がありますが、これを使用したら どうでしょうか。 C 列に数式がある前提ですが、下記シートモジュールに記述です。 (Mook) Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count <> 1 Then Exit Sub If Target.Column > 3 Or Target.Row < 30 Then Exit Sub Dim r As Range If Cells(Target.Row - 1, "C").Formula = "" Or Cells(Target.Row, "C").Formula <> "" Then Exit Sub Range(Cells(Target.Row - 1, "C"), Cells(Target.Row - 1, "HN")).Copy Range(Cells(Target.Row, "C"), Cells(Target.Row, "HN")).PasteSpecial Paste:=xlPasteFormulasAndNumberFormats Application.CutCopyMode = False Target.Activate End Sub ---- どなたの返答もなかったので、何となく書き込みましたが。 30行目以降に順番に入力されるもの 29行目以降はブランク  と思い込み、C29の内容を下方向にB列の最下行までC列にコピーとなるようにしました。 コピー元とコピー先の範囲について 当初のHN29まででしたら Range(Cells(29, 3), Cells(LastRow, 222) 今回のHP29まででしたら Range(Cells(29, 3), Cells(LastRow, 224) で動作はします。 コピー元の関数の種類とか、既に入力されている・・・とか、30行目以降に既にデータが入力されていて、ところどころブランクになっているのが追加になった場合を想定とか・・・ 質問の内容が少しあいまいで、ベテランの方は返答できないのではないでしょうか? (Mook)様のコードで又ひとつ勉強になりました、シート限定の場合はマクロ実行しなくても動作できるのですね。 30行目より飛び飛びで入力された場合のコードもできればお願いできませんか? (minoru) ---- Mookさんありがとうございます。 マクロを動かすために下記のようにモジュールに入力しました。 そしたら コンパイルエラー End Subが必要です と表示されてしまいました。 Sub 追加() Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count <> 1 Then Exit Sub If Target.Column > 3 Or Target.Row < 30 Then Exit Sub Dim r As Range If Cells(Target.Row - 1, "C").Formula = "" Or Cells(Target.Row, "C").Formula <> "" Then Exit Sub Range(Cells(Target.Row - 1, "C"), Cells(Target.Row - 1, "HN")).Copy Range(Cells(Target.Row, "C"), Cells(Target.Row, "HN")).PasteSpecial Paste:=xlPasteFormulasAndNumberFormats Application.CutCopyMode = False Target.Activate End Sub ---- Sub 追加() は不要です。 > 下記シートモジュールに記述です。    ^^^^^^^^^^^^^^^^^^^^^^^ http://officetanaka.net/excel/vba/beginner/10.htm http://www.sanynet.ne.jp/~awa/excelvba/kouza/chapt_01/sec08_01.html 今回は式のコピーなので、コピー元は固定でもいいですね。 そうすれば条件判定は、対象行に式がない判定だけで出来そうです。 (Mook) ---- Mookさんありがとうございました。 希望通りのマクロができました。(*^。^*) ちょび助 ---- こちらで解決したから↓は放置ですか。困った人です。 1つ上の関数をコピーしたい http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=74628;id=excel (アマエストロ)