- ベストアンサー
マクロ記述の簡略化
以前 教えていただいた式コピーの マクロについてなのですが A1にデータがあり B1に式があって その式をA列のデータがある部分までBにコピーするという 内容で教えていただきました。 これで同様にC1にも式があり その式をA列のデータがある部分までCにコピーするという 内容を付け加えたのですが とりあえずまったく同じマクロを記入して 変数を変えてB1部分の記述をCIに置き換えて ・・・という方法でしましたところ 当然ばっちり動くのですが なんせ同じ記述を2回しているので 見にくくなっていたり動作が遅くなりそうで もっとすっきりした記述があればと思っています。 なにか良い方法ありましたら御教授願います。 私に応用力がないものでお手数おかけいたします。 参照URLのfreezemoon様から教えていただいた マクロについてです。 http://okweb.jp/kotaeru.php3?q=936658
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
Sub test() '変数宣言部/////////////////////////////////////// Dim intFirRow As Integer '最初の行 Dim intDataCol As Integer 'データの列 Dim intForCol As Integer '式の列 Dim WS As Worksheet 'ワークシート Dim i As Integer 'ループカウント '//////////////////////////////////////////////// '各変数に代入(Constとして定数にしてもよかったかな?)//// Set WS = Worksheets("Sheet1") '処理したいワークシート名を指定 intFirRow = 1 '初めの行の指定 この場合1行目 intForCol = 2 '数式の列を指定 この場合B列 intDataCol = 1 'データの列の指定 この場合A列 '///////////////////////////////////////////////// WS.Range(Cells(intFirRow, intForCol), Cells(intFirRow, intForCol + 1)).Copy '元の式をコピー i = intFirRow + 1 'ループカウントの初期化 初めの行のつぎから処理 'データがある限りループして貼り付けていきます Do Until WS.Cells(i, intDataCol) = "" WS.Range(Cells(i, intForCol), Cells(i, intForCol + 1)).PasteSpecial Paste:=xlFormulas i = i + 1 'ループカウントのインクリメント Loop End Sub 元のマクロの「WS.Cells~」の行2ヶ所を上記のように「WS.Range~」に変更します。
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
何を相対化したいのか分からないが A列にデータだ何行か(詰めて)あって、B1に関数式があるとき、B列に式を複写するのは Sub Macro1() d = Range("A65536").End(xlUp).Row Range("B1").AutoFill Destination:=Range(Cells(1, "B"), Cells(d, "B")), Type:=xlFillDefault End Sub で出来ます。 式まで設定するなら Sub Macro1() Range("b1").Formula = "=a1+20" d = Range("A65536").End(xlUp).Row Range("B1").AutoFill Destination:=Range(Cells(1, "B"), Cells(d, "B")), Type:=xlFillDefault End Sub を参考に。 ただどうなんでしょう。VBAなら、シートに式を複写するより、式で行う演算を、繰り返しで行う(セルに式が残らない)を行うのではないでしょうか。 Sub test01() d = Range("A65536").End(xlUp).Row For i = 1 To d Cells(i, "B") = Cells(i, "A") + 20 '=a1+20に相当 Next i End Sub 習い始めは、自分の教えてもらった方法に、他のケースでもどうしても拘って使い勝ちになります。 しかしケースごとにふさわしい方法がある場合もあり、出来るだけ、考えを広く持ってください。 むしろしたいことを書いて、方法(やロジック)は回答者にまかせ、2-3種回答が載るでしょうから、その方法から、多様性もふくめて勉強するのをお勧めします。
お礼
御回答ありがとうございます。 おっしゃる鳥通りにひとつのやり方に こだわっていた部分があるかもしれません。 まだまだ一種のやり方さえも理解度が低いもので それに対する理解を深めていこうと思い このような質問になってしまいました。 皆さま様々な方向からの御回答ありがとうございました
- GETSTREET
- ベストアンサー率18% (14/74)
Sub test2() Range(Cells(1, 2), Cells(1, 3)).Copy Range(Cells(1, 2), Cells(Cells(65536, 1).End(xlUp).Row, 3)) End Sub
お礼
非常にシンプルな解法ですね ありがとうございます B列 C列それぞれに対する記述と BC列いっぺんに対する記述と 二通りありがとうございます 変数を使ってまわしていかない方法ですね ありがとうございます
- GETSTREET
- ベストアンサー率18% (14/74)
Sub test() Cells(1, 2).Copy Range(Cells(2, 2), Cells(Cells(65536, 1).End(xlUp).Row, 2)) Cells(1, 3).Copy Range(Cells(2, 3), Cells(Cells(65536, 1).End(xlUp).Row, 3)) End Sub
お礼
同じマクロを2回記述していたものが わずかな記述の変更だけで すっきりしてきますね! ありがとうございます!