- ベストアンサー
Copyメソッド以外の方法でのコピペ
myRow=100 Sheets(strSheetsName1).Rows("1:" & myRow).Copy Sheets(strSheetsName2).Rows(myRow + 1).Insert Shift:=xlDown コピーして、挿入しつつ貼り付け、という作業を繰り返してるのですが、 このマクロを実行している間に、ブラウザ等でコピー貼り付けができなくなってしまいます。 ブラウザ上でコピーしたつもりが、vbaでコピーした情報が、張り付いてしまいます。 なので、コピペではない方法で、行の情報を取得し貼り付け値のですが 何かいい方法はありますか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#3、cjです。#3に補足追記です。 一旦は、#3投稿前に没にしたものですが、 "コピペではない方法"、且つ、"Insertをしない"方法 というのを、やはり挙げておこうと思います。 列数 = 6 myRow = 100 With Sheets(strSheetsName2) nBtmRow = .Cells(Rows.Count, "A").End(xlUp).Row .Cells(2 * myRow + 1, 1).Resize(nBtmRow - myRow, 列数).Formula = _ .Cells(myRow + 1, 1).Resize(nBtmRow - myRow, 列数).Formula .Cells(myRow + 1, 1).Resize(myRow, 列数).Formula = _ Sheets(strSheetsName1).Cells(1, 1).Resize(myRow, 列数).Formula End With 要するに、配列データを2段階で複写する、というものです。 条件として、仮にA:Fの6列範囲を対象にしています。 仮に、予めコピー先の書式が列単位で統一されている場合、に有効な方法です。 ("Insertをしない"為の設計、の一例↑です。) これならScreenUpdatingを抑止する迄もなく(寧ろ抑止しない方が)、 速い、ですが、 これをメンテ(または引き継ぎ)する(自分以外の)人が、 正しい手当てが出来るようなスキルに期待出来るかどうか、 周囲の状況によって採否は変わるのかも知れません。 条件的に当てはまるかどうか、やはり確度は低いのですが、 直接的な回答の一例、です。 補足追記、以上です。
その他の回答 (4)
- root8110
- ベストアンサー率30% (6/20)
No.3の一つ目の案に同意しますが、加えて、マクロの一番最初に Application.ScreenUpdating = False 一番最後に Application.ScreenUpdating = True を追加するとマクロの処理時間が短くなってブラウザでコピーする間もなくなるかもしれません。 マクロが終了するまでExcelの表示の更新をなくす操作になります。
お礼
ご回答ありがとうございます。
- cj_mover
- ベストアンサー率76% (292/381)
こんにちは。 お邪魔します。 > ブラウザ上でコピーしたつもりが、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をしないと成り立たないシステムにも設計上の見直しが可能なら ご一考を。 以上です。
お礼
ご回答ありがとうございます。
- keithin
- ベストアンサー率66% (5278/7941)
具体的な状況が今一つイミフメイですが、とりあえず >ブラウザ上でコピーしたつもりが、vbaでコピーした情報が、張り付いてしまいます。 myRow=100 Sheets(strSheetsName1).Rows("1:" & myRow).Copy Sheets(strSheetsName2).Rows(myRow + 1).Insert Shift:=xlDown application.cutcopymode = false とでもして、少なくとも「vbaでコピーした情報」をクリアしてみては。
お礼
ご回答ありがとうございます。
- kkkkkm
- ベストアンサー率66% (1719/2589)
行の挿入をしてその後値の代入をするようにすればいかがですか。 Application.CutCopyMode = False Rows(myRow + 1).Insert Sheets("Sheet2").Rows(myRow + 1).Value = Sheets("Sheet1").Rows("1:" & myRow).Value
お礼
ご回答ありがとうございます。
お礼
ご回答ありがとうございます。