• ベストアンサー

エクセルで式のセルを値で貼り付ける際(マクロを組んで)

毎回お世話になっております。 よろしくお願いします。 1行目にタイトルがありまして A2セルから下にデータが入っています (A2から隙間無く詰まっています  毎回変わりますが おおよそ数百くらい) そのA行のデータを参照している数式が M行 N行セルに 入っています。 たとえば M2=A2*3 N2=A2+9 というふうに M2 N2の式をA行のデータがある最終部分まで Cells(2, 13).Copy Range(Cells(3, 13), Cells(Cells(65536, 1).End(xlUp).Row, 13)) Cells(2, 14).Copy Range(Cells(3, 14), Cells(Cells(65536, 1).End(xlUp).Row, 14)) この式でコピーしています。 そしてMN行全体を選択して「値」で貼り付けているのですが 動作が重くなってきます。 そこでMN行のデータがある部分を選択できる マクロでの方法はありませんでしょうか? もしくは 「考える方向がおかしい」などの 御指摘ありましたら よろしくお願い致します。

  • ennkai
  • お礼率54% (284/525)

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

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.2

こんにちは。maruru01です。 >そしてMN行全体を選択して「値」で貼り付けているのですが ×行全体 ↓ ○列全体 まあ、それはいいとして、なぜわざわざ列全体を選択しているのでしょうか? Copyメソッドのコードで、既に範囲選択しているのだから、それを流用するだけでは? 2行目からデータ最下行なら、 Range(Cells(2, 13), Cells(Cells(65536, 1).End(xlUp).Row, 13)) 「Cells(65536, 1).End(xlUp).Row」があるから、わざわざCOUNTA関数をどこかに記述しておく必要もないですし。 あと、M2:N2の数式は手入力する必要があるのでしょうか? 最初から範囲選択して数式を入力すればいいのでは? Range(Cells(2, 13), Cells(Cells(65536, 1).End(xlUp).Row, 13)).Formula = "=A2*3" これで、相対参照で一度に入力されますよ。

ennkai
質問者

お礼

ありがとうございました 最初式を拝見したときには 「CELLばっかりだ」と悲鳴をあげそうになりましたが なんとか意味もつかめました 値貼り付けのほうも範囲取得して その範囲にそのまま「値」で貼り付けたら 列全部よりは時間だ多少短縮されました 本当にありがとうございました

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

質問の意味を取り違えているかも知れませんが、その節は 無視してください。 A列のデータを使ったM2/N2の関数式のM、N列への複写。 Sub test01() d = Range("a65536").End(xlUp).Row Range("n2:m2").Copy Range("n3:m" & d).PasteSpecial End Sub で約500行は一瞬で終りましたが。

ennkai
質問者

お礼

お返事おそくなって申し訳ありません 試させていただいたら おっしゃるとおりに 一瞬で終わりました。 私の記述内容と同じ結果をもたらすのに 短い記述・短時間なのが すばらしいです。 毎回ありがとうございました

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

例えば、A2をアクティブセルにして ActiveCell.CurrentRegion でデータが入力されてる範囲を取得できます。 それで、どの範囲の行にデータがあるか調べることができます。 あと、addressしてもいいし rowしてもいいしね。

ennkai
質問者

お礼

御回答ありがとうございます アクティブセルはそのようにして使うことが できるのですね マクロで式を記入するさいも直接セルを指定していたものでアクティブセルを毛嫌いしていた感がありました。 新たな発見でした ありがとうございます

  • miwaki
  • ベストアンサー率36% (14/38)
回答No.1

最下行まで関数を入れると重くなってとても駄目でしょう。 A列に空白セルがないなら、どこか空いているセルに =COUNTA($A:$A) として、そのセルの値を最下行の行番号として使えばよいでしょう。 例えば、セルX1に上記関数を入れたとして、 Range("M3:M" & Range("X1").Value).PasteSpecial で良いのでは? Range("M3:N" & Range("X1").Value).Formula=Range("M2:N2").FormuraR1C1 なら、コピーも要りませんね。

ennkai
質問者

お礼

遅くなりましたが ありがとうございました。 早速ためさせていただいたら 多少不明な部分があったものの なんとかですが理解できました Valueを使うと 値そのものを入力できるんですね ひとつの結果を求めるのにも 様々なアプローチがあって 勉強になりました ありがとうございました

関連するQ&A

  • エクセルのマクロで結合セルに値を貼り付けたい

    みなさん、お知恵をください。 Excel2000です。 Sheets(1)に A:D までを結合したセルを30行ぐらい用意した状態で Sheets(2)の 単一セル A1,A2,A3,A4,A5・・・・とつづく変数 HENSUUを 貼り付けたいのです。*HENSUUは値のみの文字であったり数字です。 もちろん下記の過去質問はチェック済みです。 http://oshiete1.goo.ne.jp/qa2197173.html 物まねで作成しましたがエラーです。 Sheets(2).Select HENSUU = Range("A65536").End(xlUp).Row  ’変数最終行定義 Sheets(1).Range(Cells(1, 1), Cells(HENSUU, 1)).Value = Sheets(2).Range(Cells(1, 1), Cells(HENSUU, 1)).Value すみません。お知恵を拝借させて下さい。 よろしくお願いします。

  • エクセルマクロの件(2)

    お世話になります。 先日このサイトで教えていただき(No.3433483)、下記のようなマクロができました。 その節はありがとうございました。 マクロ実行したところ、1回目は問題なく動作し、マクロ実行によって作成されたデータを削除し、改めて実行すれば問題ありませんでした。 ただ、2回目以降(一覧データを削除せずそのまま実行)マクロを実行すると、毎回180行以降のデータが重複するようになりました。 3回実行すると、180行より前のデータは1行のみの表示ですが、181行目以降のものは3行同じデータが記載されるということです。 全てのデータが重複するのであれば分からなくはないのですが、一部分のみの重複なので意味が分からなくなってしまいました。 (マクロの中にそう処理するよう記載があるのだと思いますが素人のため分かりません;) 理由の分かる方がいらっしゃいましたらご指摘いただければと思いますのでよろしくお願いします。 Dim ptr As Integer Sheets("シートA").Activate ptr = Range("A65536").End(xlUp).Row Range("A4:P" & ptr).Copy Destination:=Sheets("一覧").Range("A4") Sheets("シートB").Activate ptr = Sheets("シートB").Range("A65536").End(xlUp).Row Range("A4:P" & ptr).Copy Destination:=Sheets("一覧").Range("A65536").End(xlUp).Offset(1, 0) Sheets("一覧").Activate Range(Cells(4, "A"), Cells(Range("A65536").End(xlUp).Row, "P")).Sort _ Key1:=Range("D4"), Order1:=xlAscending, Key2:=Range("E4"), _ Order2:=xlAscending, Key3:=Range("F4"), Order3:=xlAscending, _ Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _ Orientation:=xlTopToBottom, SortMethod:=xlPinYin, DataOption1:=xlSortNormal, _ DataOption2:=xlSortNormal, DataOption3:=xlSortNormal ' End Sub

  • エクセルのマクロをスッキリさせたい

    Sub 範囲指定()   A下 = Range("A65536").End(xlUp).Row   B下 = Range("B65536").End(xlUp).Row   If A下 > B下 Then    仮下 = A下   Else    仮下 = B下   End If   If 仮下 > 4 Then    下 = 仮下   Else    下 = 4   End If   Range(Cells(4, 3), Cells(下, 3)).Select   Range("C3").Copy.Paste End Sub もっと良い方法が有ると思うのですが、どうしたら良いでしょうか。

  • 値の取得

    現在Excelのシートで A~IのデータをK~Q列に=で参照して表示しています。 2行目の参照の式をA列のデータがある場所までコピーしていますが、 大変時間がかかります。 効率のいい方法をおしえていただけないでしょうか。。? できれば値だけを取得したいです。 よろしくお願いいたします。 作成しているマクロは以下のとおりです。 Sub Macro1() Dim R As Long For R = 3 To Cells(Rows.Count, "A").End(xlUp).Row Range("k3").Copy Cells(R, "k") Range("l3").Copy Cells(R, "L") Range("m3").Copy Cells(R, "M") Range("n3").Copy Cells(R, "N") Range("o3").Copy Cells(R, "O") Range("p3").Copy Cells(R, "p") Range("q3").Copy Cells(R, "q") Range("r3").Copy Cells(R, "r") Range("s3").Copy Cells(R, "s")   Next R End Sub

  • Excelのセル選択範囲の指定について

    Excelのセル選択範囲の指定について d = Range("A65536").End(xlUp).Row Range("A1:K" & d).Select これでやると A1からk列のデータの最後の(データの入っている行)までを選択しますが このk列というところを n = ActiveSheet.Range("A1").End(xlToRight).Columnを使いKでなくデータのある列nを使った表現に変えたい。どうすればいいか。

  • エクセル マクロについて

    エクセルでネットの情報(為替の値動き)を自動更新で取得しています。自動更新前の情報を同一シート(同一シートが無理な場合は別シートでもいいのですが…)にコピペし一覧にするマクロはありますか? Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then         'A1のセルの値が変化したら・・・ n = Cells(Rows.Count, "B").End(xlUp).Row + 1  ’B列の最終行を探しその次の行に・・・ Range("B" & n).Value = Range("A1").Value    ’A1の値を貼り付けていく End If End Sub これだと手動セルを上書きした時しか動いてくれませんでした。検索もしたのですが見当たらなくて困っています。お力を貸してください。

  • エクセルのマクロについてお願いいたします。

    エクセルのマクロについてお願いいたします。 E10~M10の500行全てのセルに数式が入っております。 そこでマクロにてコピーのボタンを設置しようと思ってます。 Range("E10:M10" & Range("M" & Rows.Count).End(xlUp).Row).Copy 画像のような数字の結果がある部分だけコピーをしたいです。 23行目からは数式が入ってますが結果は””空白になっております。 どうぞよろしくお願いいたします。

  • マクロセルの値によってセルの色を消す

    エクセル2013です。 セルの値が0又は空白の場合でそのセルが色塗りされていたら色を消す というマクロをを作成しました。 ただ700行55列では処理が遅いです。 Sub 色消() '成功 Dim 最終行 Dim 最終列 Dim 対象セル As Range 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 For Each 対象セル In Range(Cells(10, 17), Cells(最終行, 最終列)) If 対象セル.Value = 0 Or 対象セル = "" Then 対象セル.Interior.ColorIndex = 0 End If Next 対象セル End Sub 対象範囲から対象セルを全部見つけて一括処理すれば早いのではと 以下のマクロを作成してみましたが Set 対象範囲 = Cells.Find(What:=0 Or "", LookIn:=xlValues, LookAt:=xlWhole) で構文ERRです。 どこを直せばいいのでしょうか? よろしくお願いします。 Sub 色消2() '2014/8/4 '失敗 Dim 対象範囲 Dim 最終行 Dim 最終列 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 対象範囲 = Range(Cells(10, 17), Cells(最終行, 最終列)) Set 対象範囲 = Cells.Find(What:=0 Or "", LookIn:=xlValues, LookAt:=xlWhole) If Not 対象範囲 Is Nothing Then 対象範囲.Interior.ColorIndex = 0 End If End Sub

  • マクロ 結合セルへ値のみ貼り付けるにはどうしたらよいでしょうか。

    マクロは初心者で、まだまだ勉強しているところです。 シート名「入出金履歴」のデータを顧客コードごとに分かれている別シートへデータを振り分けて貼り付ける、もしくは反映させたいのですが、貼り付け先のセルがシートの都合上、結合セルになっており、下記のマクロだと当然ながらエラーになってしまいます。結合セルをまず、解除してから貼り付けようと思ったのですが、うまくいかず、困っています。 コピー先の結合状態は、7行目から、列A:C、列D:E、列F:H と、3列になるように結合されています。結合されている行の終わりは、A:C(結合されている)列に「合計」の値が入っているセルの行、H列まで、3列になるよう結合されています。 解除する以外に、良い方法があれば是非教えていただきたいです。 よろしくお願いします。 Sub samplea() r1 = ActiveCell.Row r2 = r1 + Selection.Rows.Count - 1 Dim myRange As Range Dim s_no As String For i = r1 To r2 s_no = Cells(i, 2) Range(Cells(i, 4), Cells(i, 9)).Select Selection.Copy Sheets(Format(s_no)).Select Set myRange = Columns("a:c").Find(what:="合計") If myRange Is Nothing Then Debug.Print "Not Fount" Else myRange.Select Selection.End(xlUp).Offset(1, 0).Select Selection.PasteSpecial Paste:=xlValues Application.CutCopyMode = False Sheets("入出金履歴").Select End If Next End Sub

  • データの値取得マクロ

    Sub Macro1() ''Worksheets("Sheet1").Activate ' addrw = Range("b65536").End(xlUp).Offset(1).Row Cells(addrw, 2).PasteSpecial end sub でB列の最終行を取得しその後、最終行の次のセルから追加のデータを貼り付けるマクロを作成しました。 このあと、追加のデータを貼り付ける前のB列の最終行の値と貼り付け後のB列の最終行の値を取得したいのですがどうすればいいでしょうか?

専門家に質問してみよう