2013-10-25 67 views
1

嵌套循環排序的作品。問題 - 我不知道如何讓循環移動到下一個單元格塊(B11:B20);它只是將值重寫爲範圍(B1:B10)。我的想法是,我可能不需要嵌套循環,但我無法將頭圍繞解決方案。VBA Excel嵌套循環(寫入數字減少列)

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 
+2

你能給出一個更好的解釋,你準備完成什麼? – user2140261

+0

基本上我試圖讓循環「j」插入1或2取決於它在10個單元格範圍內的迭代。例如B1:B5 = 2,B6:B10 = 3。然後循環跳轉到下一個範圍(B11:B20)並執行相同的操作。循環i計算工作表中的已用單元的總數。 – matt

+0

我試圖找到一種方法來寫「每10次迭代的我,做這個」(什麼j表演),但我沒有運氣 – matt

回答

1

這就是你想要的,我想。我測試了它,它每5行就在2到3之間切換。

Sub insertNum() 

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

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

感謝喬,完美的作品。我以爲我必須做這樣的事情(我+ j - 1),但我從來沒有這樣做過。這很棒! – matt

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)到你的循環。我認爲我是排行榜的玩家,但是你從來不會用這個價值來分配你的牢房。

+0

他硬編碼列(B),而不是行。這會在每一次迭代中切換他的列,不是嗎? –

+0

哎呀!這會告訴我:回答沒有測試;-) – Recipe

+0

我正在使用我作爲一個聲明來解決工作表中的每一個使用的行。最初我在選擇的case語句中放置了i而不是j,但它並沒有像i的每次迭代那樣工作,j迭代了10次。我在(j,i)中將值的長度方向放在20列上,我只是想要放下1列「B」。 – matt

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 
+0

這是一個很好的解決方案。然而,我將要處理的實際數據包含99900行,其中包含300個塊,將被劃分爲100個卡盤。我將嘗試使用「_」來表示可讀性(我傾向於丟失跟蹤在處理「)」字符時我在哪裏)。 – matt

+0

我一定會把這個方法放在我的「食譜」中。 – matt