エクセルのデータ範囲を指定してコピーする方法

このQ&Aのポイント
  • エクセルのデータ範囲を指定してクリップボードにコピーする方法について説明します。
  • セルの削除やセルの配置によってデータ範囲が変わる場合でも、範囲を適切に指定してコピーすることができます。
  • 複雑な処理を行わずに、Rangeオブジェクトを使用することで簡単にデータ範囲を取得できます。
回答を見る
  • ベストアンサー

途中に空白行や列があるデータ範囲

エクセル2003です。 セルA1からセルC50までデータがあり 10行目と20行目は全て空白、 セルC39が空白で セルE55、F57、G55にはデータがある の状態で以下の構文ですと Sub 範囲コピー1() Range("B3").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.Copy End Sub 途中に空白行や列、空白セルがあり さらに離れた所E55、F57、G55に データが有るのにもかかわらず セルB3からセルG57までを選択してクリップボードにコピー してくれます。 ですが問題がありまして 上記のシートにて A45~F50を選択してDeleteをし、 さらにセルのF55、G55もDeleteして データ範囲を セルA1~E44とセルE55のみにしてからから 上記構文を実行すると セルB3からセルE55を選択してクリップボードにコピー してほしいのに、 データ削除前と同様の セルB3からセルG57を選択してクリップボードにコピー されてしまいます。 これはエクセルの手操作 Ctrl+Shift+End でも同じようになりますので当然の結果(※1)と思っています。 (※1→なにか別な方法はありますか?) 上記の使用方法はあまりないのですが 構文を使う時点での最大行数や最大列数は常に不明で 途中空白が有る場合無い場合、 上記のようにシート上でデータ操作をした直後であっても データ削除部分は加味しデータのある範囲だけの取得の対応 が可能な構文を1種類で作成したいのですが どういう方法があるでしょうか? ちなみに Sub 範囲コピー2() Range("B3").Select Range(Cells(Rows.Count, 1).End(xlUp).Row).Select Range(Cells(1, Columns.Count).End(xlToLeft).Column).Select Selection.Copy End Sub これですと 実行時エラー1004 Rangeメソッドは失敗しましたGlobalオブジェクト となります。 ヘルプをクリックしても何も表示されません。 WEB検索するとこのエラーの質問は結構多いのですが 事例が相違する為よく理解できません。 もしかしてRangeなのに 取得できる値が一つの番号でセルを指定できないからでしょうか? エラーになる構文だと最初のRangeは行番号、次のRangeは列番号、 ですので。 で、 Sub 範囲コピー3() Dim 最終行 Dim 最終列 Range("B3").Select 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 最終列 = Cells(1, Columns.Count).End(xlToLeft).Column Cells(最終行, 最終列).Select Selection.Copy End Sub これならエラーにはなりませんが 事例だとセルC50だけが単独選択されて範囲として 取得をしてくれません。 また 1, Columns.Count ですので最終列の列番号の取得が1行目の最終列から左に検索し データのある所の列番号を返すので 3→C列 となってしまい D,E,F列を見つけてくれません。 かといって 55, Columns.Count では データが55行まで無い場合には対応が出来ませんのでこれも駄目です。 途中に空白が無い場合や離れたセルが無い場合でも使いたいので UsedRangeは使用したくない(よくわかってない事もあって)です。 よろしくお願いします。

  • gx9wx
  • お礼率95% (440/460)

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

  • ベストアンサー
  • mar00
  • ベストアンサー率36% (158/430)
回答No.1

<UsedRangeは使用したくない A1から選択してしまうからでしょうか。 UsedRangeを使用して行と列を確定させているのですが それでもダメでしょうか。 ダメであれば無視して下さい。 Sub Macro1() With ActiveSheet.UsedRange GYOU = .Rows(.Rows.Count).Row RETU = .Columns(.Columns.Count).Column End With Range(Range("B3"), Cells(GYOU, RETU)).Copy End Sub

gx9wx
質問者

お礼

UsedRangeはまだ使った事が無くて 自力では無理なので他の方法と考えていました。 (Rows.Count, 1).End(xlUp).Row は 1列目のエクセル上の最終行65536行目から上に 検索しデータがあった所の行数を返す。 こちら↓がうまく理解できません。 .Rows(.Rows.Count).Row .Columns(.Columns.Count).Column で上記構文で検索したら http://www.niji.or.jp/home/toru/notes/8.html を発見。 結果は思ったとうりに処理されました。 データをどう削除しても 現在データのある範囲しか選定されなくて 思ったとうりでした。 どうもありがとうございました。

関連するQ&A

  • 空白セルがある行の左寄せ操作の件

    下記のようにI列に空白セルを検出し、その空白セルがある行においてI列からM列までのデータを左寄せする処理行っております。 For 番号 = 1 To Range("B1").End(xlDown).Row  If Cells(番号, 9).Value = "" Then    コピー開始列 = Cells(番号, 9).End(xlToRight).Column    Range(Cells(番号, コピー開始列), Cells(番号,13)).Select    Selection.Cut Destination:=Range(Cells(番号, 9),Cells(番号, 9 + 14 - コピー開始列))    Range(Cells(番号, コピー開始列), Cells(番号,13)).Select  End If Next 番号 対象行数が3000行ほどあり処理時間がかかりすぎるため、もう少し効率よいやり方があれば教えてください。

  • VBAコピー範囲について教えてください。

    VBAのコピーペーストの下記プログラムで、 Sub コピー() Dim rng As Range Set rng = Worksheets("2").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) With Range("b2:J10") rng.Resize(.Rows.Count, .Columns.Count).Value = .Value End With End Sub コピー範囲 のJ10の部分(データ入力行)が、その都度変わるため、J10の部分を、 J列のデータが入力されている最終行としたいのですが、どのようなプログラムに すればよいのでしょうか。 どなたかよろしくお願いいたします。

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

    エクセル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

  • VBA一定の範囲内からデータが入っている行を検索

    現在VBAにて作成中です。 内容は、各シートの全く同じ範囲内から1シートへ自動で貼り付けを行い日付順に並べ替えるということです。 各シートは全て同じ表になっていますので、コピー範囲のセル番地は全シート同じです。 コピー範囲は、BF4:BM81で、BF4に日付が入っています。 81行までありますが、82行には、合計行が入っていることや、その下行もデータが入っている為、範囲指定をしています。また、81行設けていますが、上から順にデータは入っているものの、81行まで全て埋まっているとは限りません。 その為、下記のVBAにすると、各シートの81行までのデータが反映され1シートに全てのシート分が貼り付けられるので、かなりの行数になり、空白や0の行が出てしまいます。 範囲内から日付(列BF)のデータが入っている行までを検索し選択、貼り付けを行えるようにしたいと思っています。 どなたかご教授頂ければと思いますのでよろしくお願い致します。 見よう見まねで下記を作成しました。 Sub matome() Dim i As Integer Dim lRow As Long, lCol As Long, lRow4 As Long Application.ScreenUpdating = False '----全データシートの有無をチェックします sh_check '----列見出しをコピーします Worksheets(2).Range("bf1:bm3").Copy Worksheets(1).Range("A1") For i = 2 To Worksheets.Count With Worksheets(i) 左上 = "Bf4" 右下 = "bm81" 範囲 = 左上 & ":" & 右下 lRow = .Cells(Rows.Count, 1).End(xlUp).Row lCol = .Cells(58, Columns.Count).End(xlToLeft).Column '----シートのデータが4行以上の場合にコピーします If lRow >= 4 Then lRow4 = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row + 1 .Activate Range(範囲).Select Selection.Copy Worksheets(1).Cells(lRow4, 1).PasteSpecial Paste:=xlPasteValues End If End With Next i End Sub 説明に不足がありましたら、追って書き込みさせていただきます。

  • ある列の計算式が入っているセルの行のみを削除したい

    Excel2007でマクロを作成している超初心者です。 B列のセルには 空白 文字列 計算式が入っています。このうち計算式の入っているセルの行のみを削除したいのですが、どうしたらよろしいでしょうか?  セルには =IF(C17="","",+K17*L17)という式が入っています。 次式は0か空白の場合ですが、これをどのように修正したらできるでしょうか? Sub 行の削除() Dim i As Long For i = 1 To Selection.End(xlDown).Columns Step 1 Select Case Range("B" & i).Value Case 0, "" Columns(i).Delete End Select Next End Sub

  • 再質問 EXCEL データをコピーして別シートの最初の空白行に貼り付け

    再質問 EXCEL データをコピーして別シートの最初の空白行に貼り付けたい QNo.6023986でEXCEL データをコピーして別シートの最初の空白行に貼り付けたいと書き込んだものです。 質問内容は以下の通りです。 Sheet1はA列からR列までを使ったシートで、1行目は各項目があり、2行目からは当月のデータが入力されています。 Sheet2はSheet1の1行目と同じようにA列からR列までが項目になっていて、期中のデータを付け足していきたいと思っています。 マクロの記録でやってみたのですが、前月の最後の行(貼り付ける最初の空白行)の認識の仕方が分からず、Sheet2への貼付がうまくいきません。 どのような方法でやったらいいのか教えて下さい。 ----------------------------------------------------------------------------------- 回答で以下のマクロを教えていただき、テストではうまくいったのですが、 ひとつのブック内でsheet1をsheet2に、sheet3をsheet4に、sheet5をsheet6にと行いたいので、 以下のコードのシート名をそれぞれ書き換えてやってみました。 ところが、1を2にはできたのですが、3を4でやってみたところ、 なんどやっても『400』というエラーが出てしまいます。 シート名の他にも書き換えが必要なのか教えてください。 よろしくお願いします。 Sub Macro1() GYOU1 = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row GYOU2 = Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row + 1 Sheets("Sheet1").Select Range(Cells(2, 1), Cells(GYOU1, 18)).Copy Sheets("Sheet2").Select Range("A" & GYOU2).Select ActiveSheet.Paste Application.CutCopyMode = False End Sub

  • 列幅が変更されるエリアデータでの平均値取得方法

    excel2010 B6セルから*6(*の列はデータの数により変更されます)までのデータ平均をマクロで *+1の列に記述しようとしています。 B6からBI6までデータがあればBJ6セルでAVERAGE(B6:BI6)と表記したいということです。 マクロでは Range("BJ6") = "=AVERAGE(B6:BI6)" です。 方法としては、データを貼り付けた最終列の1つ右の列にセルをもっていき、 B6から*6までの平均を記述しようとしています。 '最終列の1つ右のセル列選択 Cells(6, Columns.Count).End(xlToLeft).Offset(0, 1).Select Range(Cells(6, Columns.Count).End(xlToLeft).Offset(0, 1).Address) = "=AVERAGE(B6:Cells(6, Columns.Count).End(xlToLeft).Address)" で実行すると実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです というエラーが表示されます。 何が 間違っているのでしょうか? Range(Cells(6, Columns.Count).End(xlToLeft).Offset(0, 1).Address) = "=AVERAGE(B6:BI6)" を実行すると、 BJ6セルに=AVERAGE(B6:BI6) と表示されたので、 BI6に相当する部分は、 Cells(6, Columns.Count).End(xlToLeft).Address で表せると思うのですが…。

  • エクセルVBAで範囲内での位置取得(行&列)

    Sub test() Set Rng = Range("B2:E7") Rng.Cells(2, 2).Select End Sub これで、範囲Rng内では2行/2列目となるC3セルが選択されます。 では、C3セルが、範囲Rng内で何行/何列目であるかを取得するにはどのように記述すればよいのでしょうか? Rng.Cells(2, 2).Rowは、当たり前ですが、3になってしまいます。

  • マクロ 最終列をコピーして最終列の次の列に挿入する

    マクロ 最終列をコピーして最終列の次の列に挿入する方法 マクロで最終列をコピーして、最終列の次の列に挿入する方法に苦戦しております。 (1)のところでエラーが出てしまいます。 列をコピーして次の列に挿入した時に挿入した列のセルの値をクリアしたいと思っております。 アドバイスの程、よろしくお願い致します Sub ADD_Column() Dim lastColumn As Integer lastColumn = Cells(3, Columns.Count).End(xlToLeft).Column Range(lastColumn).Copy Range(lastColumn + 1) '(1) End Sub

  • データ最終行の選択について

    よろしくおねがいします AからZ列までデータが入っています 1行目はタイトルです 最終行は全て同一ですが毎回変わります。 例外でM1 N1は空白です 今↓の作業をしているのですが 'D2セルからR列最終セルを選択 Range(Cells(2, 4), Cells(Cells(65536, 1).End(xlUp).Row, 18)).Select そのまえに M2からMデータ最終行の和をM列のデータ最終行の二つ下のセルに N2からMデータ最終行の和をN列のデータ最終行の二つ下のセルに それぞれ記入してから D2からR列最終せるを選択したいのです 仮にデータ最終行を100とすると M2~M100の和をM102に N2~N100の和をN102に それぞれ記入して D2~R100を選択・・・という流れです。 最終行数を選択して それから2を引いて選択しても なぜかうまくいかなく困っております よろしくおねがいします

専門家に質問してみよう