1

ネストされたループのような作品。問題 - ループを次のセル ブロック (B11:B20) に移動する方法がわかりません。値を range(B1:B10) に書き換えるだけです。私の考えでは、ネストされたループは必要ないかもしれませんが、解決策に頭を悩ませることはできません。

Sub insertNum()

Dim sheetOne As Worksheet
Set sheetOne = Worksheets("Sheet1")

Dim i, j As Long
For i = 1 To sheetOne.UsedRange.Rows.Count
    For j = 1 To 10
        Select Case j
            Case 1 To 5
            sheetOne.Cells(j, 2).Value = "2"
            Case 6 To 10
            sheetOne.Cells(j, 2).Value = "3"
         End Select
    Next j
Next i
End Sub
4

3 に答える 3

1

コードでループを使用せずにこれを実現できます。この場合、次のコードを使用すると、実行にかかる時間が約 400% 増加します。

Sub insertNumNoLoopSample()
With [B1:B50000]
    .FormulaR1C1 = _
        "=IF(ISNA(MATCH(RIGHT(ROW(),1), {""1"",""2"",""3"",""4"",""5""},0)),3,2)"
    .Value = .Value
End With
End Sub

B1:B50000 の範囲で各コードを実行してテストしたところ (他の回答とこれ)、私のコードの実行には平均 0.41 秒かかりましたが、他の回答の実行には平均 2.1 秒かかりました。

コードをそのまま使用するか、With 行を変更して、コードを実行する範囲を追加することができます。代わりに使用された範囲を使用する場合 (これはお勧めしません)、置き換えることができます。

With [B1:B50000]

代わりに以下を使用してください。

With ActiveSheet.UsedRange.Columns("B")

最後の行がどうなるかわからない場合、または変更される場合は、使用範囲を使用する代わりに最後に使用された行を取得する最良の方法は、次を使用することです。

Sub NoLoopSample()
Dim lastRow As Long
'Replace The A with the Column of your data that 
'will the longest amount of data.
lastRow = Range("A" & Rows.Count).End(xlUp).Row 

With Range("B1:B" & lastRow)
    .FormulaR1C1 = _
        "=IF(ISNA(MATCH(RIGHT(ROW(),1), {""1"",""2"",""3"",""4"",""5""},0)),3,2)"
    .Value = .Value
End With
End Sub
于 2013-10-25T16:05:52.637 に答える
0

これはすべきではありません:

Sub insertNum()

Dim sheetOne As Worksheet
Set sheetOne = Worksheets("Sheet1")

Dim i, j As Long
For i = 1 To sheetOne.UsedRange.Rows.Count
    For j = 1 To 10
        Select Case j
            Case 1 To 5
            sheetOne.Cells(j, i).Value = "2"
            Case 6 To 10
            sheetOne.Cells(j, i).Value = "3"
        End Select
    Next j
Next i
End Sub

行(2)をループに割り当てることをハードコーディングしているようです。i は行ルーパーだと思いますが、その値を使用してセルを割り当てることはありません。

于 2013-10-25T15:06:04.937 に答える