0

以下のコードを使用して、あるシートから別のシートに列をコピーし、空白のセルを Null 値に置き換えました。

'Copying If Employee
sourceSheet.Activate
Range(Cells(2, 7), Cells(Rows.Count, 7).End(xlUp)).Select
Selection.Copy
destSheet.Activate
Range("E2", Cells(Rows.Count, 7)).PasteSpecial

For Each cell In Range("E2", Cells(Rows.Count, 5))
If Len(cell.Value) = 0 Then
    cell.Value = "No"
End If

for ステートメントを置き換えると、Range("E2", Cells(500,5))正常に動作します。

何が問題なのですか?私は理解できませんでした。誰でもこれで私を助けることができますか?

4

3 に答える 3

8

Excel 2007 には 1,048,576 行あります。

  1. For each ループは、100 万個のセルを通過する必要があり、そのたびに (すべてのプロパティと共に) セルをメモリにロードする必要があります。セル オブジェクトのこの絶え間ないロードとアンロードは、非常にリソースを消費します。

  2. 値をセルに割り当てるたびにNo、Excel はシートを再計算し、画面を更新して、ワークシート/ワークブック/セル イベントをトリガーする場合があります。次のセルの次のセルを評価する前に、これらすべてが行われます。膨大な量のデータがない限り、これはこの例では数百回発生します。

500 セルははるかに少ない数であり、問​​題なく処理できます。

編集:

最後の行を取得します。

データを含む最後の表示行を取得する場合は、次を使用します。

With Workbooks(myWorkbook).Worksheets(myWorksheet)
   LastRow = .Cells(.Rows.Count, "E").End(xlUp).Row
End With

表示または非表示に関係なく、データを含む最後の行を取得する場合は、次を使用します。

With Workbooks(myWorkbook).Worksheets(myWorksheet)
   LastRow =.Range("E2").EntireColumn.Find("*", .Cells(1, .Range("E2").Column), , , xlByRows, xlPrevious).Row
End With

詳細については、 Rondebruinの良いサイトで、最後の行/列の取得に関する詳細情報を参照してください。

于 2013-02-24T19:36:23.057 に答える
2

試す

For Each cell In Range("E2", Cells(destSheet.UsedRange.Rows.Count, 5))
If Len(cell.Value) = 0 Then
    cell.Value = "No"
End If

または、よりエレガントに(そしておそらくはるかに高速に)、

Dim calcStatus As XlCalculation
calcStatus = Application.Calculation

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

For Each cell In Range("E2:E" & destSheet.UsedRange.Rows.Count)
If Len(cell.Value) = 0 Then
    cell.Value = "No"
End If    

Application.Calculation = calcStatus
Application.ScreenUpdating = True
于 2013-02-24T22:02:12.540 に答える
2

Cabierberach が正しく指摘しているように、現在のルーチンは 1M 行をループします。彼と JustinJDavies のソリューションに加えて、次のハックを検討してください。

0値を に設定する代わりに、値が であるたびNoにセルが表示されるようにフォーマットを変更するだけです。これは、このカスタム形式をセルに適用することにより、マクロなしで実行できます: . をデフォルトの形式に置き換える必要がある場合があります。カスタム数値形式の詳細な説明については、このリンクを参照してください。No00,-0,"No",@0

これを VBA で実行する場合は、次の行で十分です。

Range("E2:E" & Cells(Rows.Count, 1).End(xlUp).Row).CustomFormat = "0,0,""No"",@"
于 2013-02-25T09:02:47.593 に答える