2017-04-05 6 views
0

私は基本的にいくつかのブックから3行のメインブックにデータの行をコピーし、それらのすべてのグラフィックスを更新するVBAプログラムを高速化しようとしています。コピーと貼り付けの行の異なる方法

私はすでにこれを使用しています。これは主にすべてのプログラムで行います。

'Speed up 
With Excel.Application 
    .ScreenUpdating = False 
    .DisplayStatusBar = True 
    .Calculation = Excel.xlCalculationManual 
    .EnableEvents = False 
End With 

私のコードをデバッグする私は、コピー&ペースト部分が残りの部分よりも多くの時間を取っていると私は、私は最速の解決策に到達することができますので、それとテストを再コーディングしようとしています実現しました。当初は、3つの異なるサブサブにわたってこのようになっていました。私は他のすべてが主に同じであるので、私は1つを投稿する。

Cellsheet.Range("2:" & f2).Copy DataCell.Range((f + 1) & ":" & (f + f2)) 
DataCluster.Rows((f3 + 1) & ":" & (f3 + f4 - 1)).Hidden = False 
Clustersheet.Range("2:" & f4).Copy DataCluster.Range((f3 + 1) & ":" & (f3 + f4 - 1)) 

私が知っているクリップボードの使用を避けようとしています。最も遅い解決策です。さて、このよう.Valueの= .Valueのアプローチを試みてイム:

DataCell.Range((f + 1) & ":" & (f + f2)).Value = Cellsheet.Range("2:" & f2).Value 
DataCluster.Range((f3 + 1) & ":" & (f3 + f4 - 1)).Value = Clustersheet.Range("2:" & f4).Value 

この例では、私はエラーが表示されたら、2.000行多かれ少なかれをコピーしようとしています。

問題は、この方法では、実行中に多かれ少なかれプログラムが「メモリ不足です」と表示され、なぜこれが起きているのか知りたいと思います.Copy Destination 。もの。

+3

コード全体が行をコピーしています - 実際にはすべての16384列を使用していますか? – YowE3K

+0

yowE3Kは、行全体の代わりに使用された列のみを選択しようとしています –

+0

このコマンド 'Sheet2.Range(" A1:GZ16000 ")= Sheet1.Range(" A1:GZ16000 ").Valueは33,280,000のセル値をコピーします約3〜4秒で。そのため、明示的な範囲で作業してください。行全体ではありません。 –

答えて

1

あなたのコーディングは恐ろしいです@Sivaprasathはもっと礼儀正しいですが、私はもっと役立つように努めています:-))。このように見せてください。

DataCell.Range(Cells(R, C), Cells(R, C)).Value = Cellsheet.Range(Cells(R, C), Cells(R, C)).Value 

ここで、Rは「行」を表し、Cは「列」を表します。それぞれは、数値を表す変数または変数である可能性があります。 Range("A1:B4")のような範囲はRange(Cells(1, 1), Cells(4, 2))のように書かれていますが、直接の比較では非常に多くの努力をしていますが、それはRange((f + 1) & ":" & (f + f2))より読みやすく、一度操作すれば操作が簡単です。あなたの仕事をスピードアップするためには、あなたの範囲の仕様を厳密に制御し、明確な構文がないうちにあなたを逃すことが不可欠です。

私はあなたのコメントに応じてこのテストを実行しました。

Private Sub CopyAndPaste() 

    Dim Rng As Range 
    Dim f As Long, f2 As Long 
    Dim C As Long 

    f = 4 
    f2 = 2046 
    C = 185 

' Set Rng = Cellsheet.Range(Cells(2, 1), Cells(f2, C)) 
    Set Rng = ActiveSheet.Range(Cells(2, 1), Cells(f2, C)) 
    Debug.Print Rng.Address, Rng.Cells.Count 

' Set Rng = DataCell.Range(Cells((f + 1), 1), Cells(f + f2, C)) 
    Set Rng = ActiveSheet.Range(Cells((f + 1), 1), Cells(f + f2, C)) 
    Debug.Print Rng.Address, Rng.Cells.Count 
End Sub 

結果がイミディエイトウィンドウに印刷され、二つの範囲内のセルの数が同じでないことを示しています。したがって、2つの範囲は同じサイズとディメンションにすることはできません。そのため、過去の操作でエラーが発生するはずです。私はあなたの変数を制御するために少し時間を投資することをお勧めします。ただし、Destinationを使用してコピーすると、1つのセル(左上)を指定するだけで十分です。Excelは、指定したセルに対して、コピーした範囲全体を正しく貼り付けます。

関連する問題