2

これは私のコードですが、5000 行以上、1 列の場合は一生かかります。クエリ時間を短縮する方法はありますか?

Sub InsertRows() 
    Dim numRows As Integer 
    Dim r As Long 

    Application.ScreenUpdating = False 

    r = Cells(Rows.Count, "A").End(xlUp).Row 
    numRows = 11 

    For r = r To 1 Step -1 
        ActiveSheet.Rows(r + 1).Resize(numRows).Insert 
    Next r 

    Application.ScreenUpdating = True 
End Sub
4

2 に答える 2

6

これには 1 秒未満かかりました。

Sub InsertRows()

Dim numberOfValues As Long
Dim i As Long
Dim values As Variant

Const numberOfEmptyRows As Long = 11

Application.ScreenUpdating = False

' count values in column A
numberOfValues = Cells(Rows.Count, "A").End(xlUp).Row

' populate array with numbers
ReDim values(1 To numberOfValues, 1 To 1)
For i = 1 To numberOfValues
  values(i, 1) = i
Next i

' I know there is a better way to do this part...
Range(Cells(1, 2), Cells(numberOfValues, 2)).Value = values
For i = 1 To numberOfEmptyRows - 1
  Range(Cells(Rows.Count, "B").End(xlUp).Offset(1, 0), Cells(Rows.Count, "B").End(xlUp).Offset(numberOfValues, 0)).Value = values
Next i

' sort by values inserted in column B
Range(Cells(1, 1), Cells(Rows.Count, "B").End(xlUp)).Sort Key1:=Range("B1"), _
        Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal

Columns("B:B").EntireColumn.Delete

Application.ScreenUpdating = True
End Sub

このコードは、ヘルパー列 (この場合は B) を使用して、ターゲット範囲の隣に番号シーケンスを挿入します。次に、同じ数字をそれ自体の下に N 回追加し、その列で並べ替えます。最後に、列を削除します。これにより、任意のデータ セットに空白行をすばやく挿入できます。

空白行の挿入量を増減するかどうかを変更Const numberOfEmptyRows As Long = 11します。Excel の行制限に達する前に、この手法で処理できるレコードの数 (および挿入できる空白行の数) には制限があります。

于 2012-07-19T12:53:08.903 に答える
0

ジミー、あなたのコードはとてもいいです。ただし、「A」列にコンテンツがなく、他の列にコンテンツがある場合、並べ替えの結果はうまくいきません。

したがって、以下のように、UsedRange を使用して numberOfValues を取得します。

 Set r2Arrange = ActiveSheet.UsedRange

列 A の値を数える:

numberOfValues = r2Arrange.Rows.Count
于 2013-06-19T13:17:10.247 に答える