• ベストアンサー

Copyメソッド以外の方法でのコピペ

cj_moverの回答

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.3

こんにちは。 お邪魔します。 > ブラウザ上でコピーしたつもりが、vbaでコピーした情報が、張り付いてしまいます。 > なので、コピペではない方法で、行の情報を取得し貼り付け値のですが "コピペではない方法" というより、クリップボードを介さないコピペ、 に、したらいいと思います。 無論、"コピペではない方法"もありますが、 書式・表示形式・数式と定数の混在している場合、等々。 コピーする必要があるかないかとか、、、。 挿入する箇所はInsertするだけで前後の書式設定を踏襲してくれるような 位置にあるかどうか、で対応は細かく別れると思います。 「書式・表示形式」のトレースを含みに汎用的なものを書くとすれば、 普通は、Copy メソッドの名前付き引数Destinationを指定してやることで、 クリップボードを経由しないコピーをする方法が妥当なのでは、と思います。 これなら、VBA処理の間隙を縫う形でユーザーが驚速操作で貼り付けしたとしても、 Excelデータがブラウザに貼り付けられるようなことは無い筈です。   myRow = 100   Sheets(strSheetsName2).Rows(myRow + 1 & ":" & myRow + 100).Insert Shift:=xlDown   Sheets(strSheetsName1).Rows("1:" & myRow).Copy Destination:=Sheets(strSheetsName2).Rows(myRow + 1) "コピペではない方法"ということに重きを置くなら、 詳細な条件提示がないと確度の高い答えは出せません。 一番簡単なケースで言えば   myRow = 100   Sheets(strSheetsName2).Rows(myRow + 1 & ":" & myRow + 100).Insert Shift:=xlDown   Sheets(strSheetsName2).Rows(myRow + 1 & ":" & myRow + 100).Formula = _     Sheets(strSheetsName1).Rows("1:" & myRow).Formula のようになりますが、こういう場合は、行丸ごとトレースするのではなく、 列を限定してあげないと、処理が無駄に遅くなります。 つまり、Rowsではなく、Range("A" & myRow + 1 & ":F" & myRow + 100)等の様に 具体的なセル範囲を指定してあげればいい、ということです。 この例では、Sheets(strSheetsName2).Rows(100)に設定された「書式・表示形式」が コピー先であるSheets(strSheetsName2).Rows("101:200")に適用されます。 都合よく条件が合えば、こういった方法の方が簡単な(速い)場合もあるでしょう。 裏を返せば、書式を書き換える必要が出てくる条件だと、反って、 怖ろしく面倒なことになるかも、です。 以上、直接の回答ではありませんが、こちらの本旨としては、 「Copy メソッドの名前付き引数Destinationを指定」してみては如何でしょう、 という提案、ということになります。 蛇足ですが、 Insertをしないと成り立たないシステムにも設計上の見直しが可能なら ご一考を。 以上です。

NTHZNRTFJV
質問者

お礼

ご回答ありがとうございます。

関連するQ&A

  • 'Cells'メソッドは失敗しました '_Global'オブジェクト

    次のマクロですが、順調に動いていたと思うと 急にタイトルのエラーで落ちたりします。 Set mySh = Thisworkbook.Sheets("Sheet1") Debug.Print mySh.Cells(1,1) また、そのときは・・・ mySh.Rows("4:4").Select Selection.Insert Shift:=xlDown や mySh.Select Rows("4:4").Insert Shift:=xlDown や mySh.Rows("4:4").Insert Shift:=xlDown もできなくなります。 オブジェクトへの参照方法が今ひとつわかっていないのですが、 どの場合でもエラーなく実行するにはどうすればいいのでしょうか?

  • 行を挿入するマクロがうまくいきません。

    Sheets("りんご").Select Rows("1:1").Select Selection.Copy Sheets("みかん").Select Range("人").Select Selection.Insert Shift:=xlDown Application.CutCopyMode = False End Sub というマクロは、りんごのシートにある1行をコピーして、 みかんのシートの人と名前定義してある特定の行にコピーする マクロです。この次に下のマクロを実行すると Sheets("りんご").Select Rows("2:3").Select Selection.Copy Sheets("みかん").Select Range("人").Select Selection.Insert Shift:=xlDown それまでのものが残ってしまい、行がどんどん増えていってしまいます。 いずれかのマクロを実行すればリセットされて行が増えないように コピーするにはどうすればよいでしょうか・・?

  • エクセルVBAの貼付けについて

    エクセルVBAの貼付けについて シートAとBがあって、シートBの1~7列をコピーし、シートAの最終行に貼り付ける方法を教えて下さい。 下記のように書いてみたのですがダメでした。 Sheets("B").Select Rows("1:7").Select Selection.Copy Sheets("A").Select With Range("A1").End(xlDown).Offset(1, 0) .ActiveSheet.Paste End With

  • excel:vba

    エクセルVBAで、ROWS(“7:7”)からROWS(“93,93”)まで、行の値を+3ずつアップしてあることを繰り返し実行したいのですが、ROWS(“i:i”)とかROWS(i:i)とかは意味をなさないようです。 どのように処理(記述)すればよいのでしょうか。 感覚的には次のような処理したい。 For i = 7 To 93 Step 3 Rows(i:i).Select Selection.Insert Shift:=xlDown Selection.Insert Shift:=xlDown Next i

  • Excel2003 Range("XXX").Copyについて

    下記のようにコピペをしたいのですが ActiveSheet.Paste Sheets("sheets1").Range("V3").Copy Worksheets("sheets2").Activate Sheets("sheets2").Range "A1").Select 上の方法だと良く行くのですが下記だとSheets("sheets1").Cells(9,16).Copyエラーになってしまします。どうしてもCells(9,16) を使いたいのですが方法を教えてください。 ActiveSheet.Paste Sheets("sheets1").cells(9,16).Copy Worksheets("sheets2").Activate Sheets("sheets2").Range "A1").Select よろしくお願いします。

  • マクロで切り取りしたものを貼り付ける方法

    エクセルのマクロを利用しております。 自動で作業を覚えるマクロボタンで切り取りし貼り付けたのですが マクロを実行するとデータが元の場所にも残ってしまいました。 結果としてコピーペーストとして出力されました。 私が行いたいことは、切り取りし貼り付けが行いたいのです。 (元の場所にデータは残らない) 以上よろしくお願いします。 以下は私が使用しているマクロになります。 Workbooks("2.xls").Sheets("Sheet1").Select Columns("Q:Y").Select Application.CutCopyMode = False Selection.Copy Columns("N:N").Select Selection.Insert Shift:=xlToRight Sheets("Sheet2").Select Columns("C:D").Select Application.CutCopyMode = False Selection.Copy Columns("N:N").Select Selection.Insert Shift:=xlToRight

  • worksheetクラスのcopyメソッドが失敗しました。

    VBA初心者です。 「worksheetクラスのcopyメソッドが失敗しました。」 エラー回避方法を教えてください。 やりたいことは、データ入力シートから雛形シートにデータを参照して、データ入力シートの1行ずつを新しいシートにしたいです。35シートぐらいをコピーしたら上記のエラーがでました。メモリ不足でエラーになるんだろうなぁということは予測つくのですが、なにか回避方法はありますか? 別のブックを使う方法でもよいです。ご教示ください。 コードはこんな感じです。 Sub シート作成1() 'データ行選択 Range("B9").Select Range(Selection, Selection.End(xlDown)).Select ActiveSheet.Unprotect Rows("8:8").Select Selection.AutoFilter Selection.AutoFilter Field:=12, Criteria1:="<>" Range("B9").Select Range(Selection, Selection.End(xlDown)).Select '選択したデータ行のシート作成 For Each 選択セル In Selection Worksheets("ひな形").Copy after:=ActiveSheet DoEvents 'シート名の変更 ActiveSheet.Name = 選択セル.Value ActiveSheet.Tab.ColorIndex = 38 Next 選択セル DoEvents 'オートフィルタを元にもどす Sheets("データ入力シート").Select Rows("8:8").Select Selection.AutoFilter Range("B1").Select Columns("L:O").Select Selection.EntireColumn.Hidden = True Range("B1").Select ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= _ False, AllowSorting:=True, AllowFiltering:=True End Sub よろしくおねがいします。

  • フォームに入力された日付のデータのみコピペする

    お世話になります。 前回に引き続きExcelのVBAについて質問させていただきます。 (前回も似たような質問なので申し訳ございません) 集計.xlsというブックがあります。 この中に[集計]、[東京支店]、[名古屋支店]、[大阪支店]というシートがあります。 前回の質問で[東京支店]、[名古屋支店]、[大阪支店]のシート内容を[集計]シートに順番にコピペすることは出来ました。回答をいただきました皆様ありがとうございました。 今度やりたいことは[東京支店]、[名古屋支店]、[大阪支店]のシート内容を[集計]シートに順番にコピペする時に1つ条件を付けて、[日付がXXXのデータのみコピぺする]といった具合にしたいのです。 各支店のシートの内容は以下の通りです。 日付] [担当者] [金額] 11/1 田中 100円 11/2 山田 500円 今回はフォーム(Form1)を作成して、条件に使う日付を"Text.box1"に入力させるようにしました。 [集計]シートに[東京支店]、[名古屋支店]、[大阪支店]の全データをコピー後に、このフォームを起動させてTextbox1に日付を入力させてから[抽出]というボタンを押したら以下VBAを起動させて、[集計]シートの データを上から下まで全てREADして、Text.box1に入力された日付と異なるデータを削除する方法で実現しようと考えました。 しかし、削除するロジックがうまく動作せず、Textbox1に入力された日付と異なった[集計シート]の日付データでも削除するデータもあれば、削除しないデータもあります。 自分でやっていて効率が悪い方法だな、ともいます・・。 出来れば[集計]シートへのコピペ前にフォームを出して、Textbox1に条件の日付を入力させて[抽出]ボタンを押したら、Textbox1の日付のデータだけをコピペ出来れば最高です。 どなたかご教授いただけますでしょうか? 環境 Windows XP SP3 Excel2003 ****VBA**** Sub test() Dim 下 As Integer '東京支店 Sheets("東京支店").Select Range("A2").Select '東京支店シートの見出し以外の全データをコピー Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Copy '集計シートに貼り付け Sheets("集計").Select Range("A2").Select ActiveSheet.Paste '次は名古屋支店 Sheets("名古屋支店").Select Range("A2").Select '名古屋支店シートの見出し以外の全データをコピー Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Copy '集計シートの最下行を取得 Sheets("集計").Select 下 = Cells(Rows.Count, 1).End(xlUp).Row +1 '集計シートに貼り付け Range("A2").Select ActiveCell.Offset(下 ,0).Select ActiveSheet.Paste '最後に大阪支店 Sheets("大阪支店").Select Range("A2").Select '大阪支店シートの見出し以外の全データをコピー Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Copy '集計シートの最下行を取得 Sheets("集計").Select 下 = Cells(Rows.Count, 1).End(xlUp).Row +1 '集計シートに貼り付け Range("A2").Select ActiveCell.Offset(下 ,0).Select ActiveSheet.Paste '集計シートのデータを全READ i=2 Do 'フォームのTextBox1に入力された日付以外は削除 If Cells(i, 1).Value <> TextBox1.Value Then Rows(i & ":" & i).Select Selection.Delete Shift:=xlUp End If i = i + 1 Loop Until Cells(i, 1) = "" End Sub

  • 複数行を繰り返しコピーする方法を教えて下さい

    こんにちは。A1からA50までに値が入っており、それをA51からA100、A100からA150、、、と繰り返し100回くらいコピーしたいのですが、簡単な方法はありますか?   Range("A1:A50").Select Selection.Copy Range("A1").Select Selection.Insert Shift:=xlDown でなんとなくできそうなのですが、100回繰り返す、という指定の仕方がわかりません。よろしくお願いします!

  • EXCEL VBA で既定のシートを下に追加したい

    EXCEL VBAである既定の(例えば注文書シート)みたいなのがあったとして、これを注文書が増えるごとに下にその範囲のコピーを下に追加 してゆきたい。これは、書式がいろいろと決まっているのと、他の関数でその中に値を色々と埋めています。また、これと紐づくもので、注文書明細や、その他のシートがあるので、それらもそれぞれ下方向にコピーしています。 一つのシートのコピー例が、 Rows(intUpperLine & ":" & intLowerLine).Select Selection.Copy Rows((ir * (i + 1)) + 1).Select Selection.Insert Shift:=xlDown というような感じでループしている。 これらが10件くらいならば、ちょっと待つがなんとか なるのですが、50件とかいくと30分以上かかります。 何か、知恵を賜りたいです。 よろしくお願いします。 尚、シートを横展開することも考えたのですが、これだと 限りなく横へスクロールするので、お客様からNGだされました。 よろしくお願いします。