回答
我說,忘了SpecialCells
。只需將需要測試的所有單元格加載到Variant數組中。然後循環播放該數組,並進行上限。這是非常有效的,與在表單中循環單元格相反。最後,將其寫回表單。
使用包含介於0和2之間的隨機值的50,000個單元格,此代碼在我的古董筆記本電腦上以0.2秒運行。
額外的好處是,這是相當清晰和可讀的代碼,並且您可以完全控制將操作的範圍。
Dim r As Range
Dim v As Variant
Set r = Sheet1.UsedRange
' Or customise it:
'Set r = Sheet1.Range("A1:HZ234") ' or whatever.
v = r ' Load cells to a Variant array
Dim i As Long, j As Long
For i = LBound(v, 1) To UBound(v, 1)
For j = LBound(v, 2) To UBound(v, 2)
If IsNumeric(v(i, j)) And v(i, j) > 1 Then
v(i, j) = 1 ' Cap value to 1.
End If
Next j
Next i
r = v ' Write Variant array back to sheet.
+1。 *但是*具有'SpecialCells'的變體再次變得更好。爲什麼用一把漂亮的麪包刀處理2D範圍內的所有細胞時,只能使用手術刀處理數字常量(確保時間從微小到微觀,但效率很高:) :) – brettdj 2012-01-12 12:01:27
謝謝!我想我會用這個。看起來最可讀和最短。 – brunosan 2012-01-12 13:30:41
@brettdj:我的比喻是:爲什麼使用複雜的機器人工具進行遠程手術時,病人在隔壁的房子裏?只需將患者帶入乾淨,無菌的手術室,然後將空白處使用您選擇的刀,然後將其送回家。在* all *單元格上完成的唯一「處理」是讀取,檢查一個布爾值('IsNumeric(v(i,j))')並寫回。 – 2012-01-12 18:38:29
循環的危害是什麼?我剛剛在39900個單元格範圍內測試了這段代碼,並以2秒的速度運行。
Sub Sample()
Dim Rng As Range, aCell As Range
Set Rng = Cells.SpecialCells(xlCellTypeConstants, xlNumbers)
For Each aCell In Rng
If aCell.Value > 1 Then aCell.Value = 1
Next aCell
End Sub
我唯一擔心的是使用SpecialCells的,因爲它們是不可預知的,所以我很少使用它們。
也有看看這個知識庫文章:http://support.microsoft.com/?kbid=832293
錫德,你在這些細胞中有40K數字嗎? 8192區域的限制 - 在我的體驗中很少被破壞 - 已在xl2010 – brettdj 2012-01-12 01:10:58
中刪除是的(精確到39900)從B7到T2106(在Excel 2003中測試過) – 2012-01-12 07:18:13
循環越過單元格有什麼危害?那麼,2秒就比下一個最好的解決方案差一個數量級。如果下次有400,000個值需要檢查怎麼辦?如果OP必須運行代碼100次會怎樣? – 2012-01-12 18:41:14
下面這種方法避免了通過細胞循環的細胞 - 而這是顯著長於範圍循環代碼我同意你的喜好,以避免細胞通過細胞範圍循環,其中可能
我已經更新從A fast method for determining the unlocked cell range我的代碼,以提供由細胞循環方法的非細胞
- 代碼檢查該
SpecialCells(xlCellTypeConstants , xlNumbers)
在片材噸存在ø被更新(錯誤處理應始終使用與SpecialCells
- 如果這些細胞存在,工作片被創建 ,和式被插入到範圍爲第1步建立一個故意錯誤(1/0 )如果在主片的值是> 1
SpecialCells(xlCellTypeFormulas, xlErrors)
返回的單元格範圍從工作片其中的值均大於1(成rng3
)在
rng3
所有區域都設定爲1與rng3.Value2=1
Sub QuickUpdate() Dim ws1 As Worksheet Dim ws2 As Worksheet Dim rng1 As Range Dim rng2 As Range Dim rng3 As Range Dim lCalc As Long Set ws1 = ActiveSheet On Error Resume Next Set rng1 = ws1.Cells.SpecialCells(xlConstants, xlNumbers) On Error GoTo 0 'exit if there are no contants with numbers If rng1 Is Nothing Then Exit Sub 'disable screenupdating, event code and warning messages. 'set calculation to manual With Application .ScreenUpdating = False .EnableEvents = False .DisplayAlerts = False lCalc = .Calculation .Calculation = xlCalculationManual End With ws1.Copy After:=Sheets(Sheets.Count) Set ws2 = ActiveSheet 'test for cells constants > 1 ws2.Cells.SpecialCells(xlConstants, xlNumbers).FormulaR1C1 = "=IF('" & ws1.Name & "'!RC>1,1/0,'" & ws1.Name & "'!RC)" On Error Resume Next Set rng2 = ws2.Cells.SpecialCells(xlCellTypeFormulas, xlErrors) On Error GoTo 0 If Not rng2 Is Nothing Then Set rng3 = ws1.Range(rng2.Address) rng3.Value2 = 1 Else MsgBox "No constants < 1" End If ws2.Delete 'cleanup user interface and settings With Application .ScreenUpdating = True .EnableEvents = True .DisplayAlerts = True lCalc = .Calculation End With 'inform the user of the unlocked cell range If Not rng3 Is Nothing Then MsgBox "Cells updated in Sheet " & vbNewLine & ws1.Name & vbNewLine & " are " & vbNewLine & rng3.Address(0, 0) Else MsgBox "No cells updated in " & ws1.Name End If End Sub
- 1. 選擇單行表的所有單元格的值,並在SQL
- 2. 選擇具有特定行中的值的所有單元格
- 3. 讓所有選中的單元格值
- 4. 選擇單元格條目上的所有Silverlight DataGrid單元格文本
- 5. mysql使用上次修訂版的值選擇所有訂單
- 6. 在UITableView中一次選擇一個單元格
- 7. 從活動單元格中選擇所有單元格直到空白單元格並粘貼值
- 8. 在Excel/VBA中選擇合併單元格下的所有單元格
- 9. 在GridView中選擇單元格的值
- 10. 需要選擇WorkBOOK中的所有單元格以將所有「=」替換爲「####」
- 11. 選擇一個單元格一次,但一切
- 12. 如何在swift中一次只選擇兩個UITableview單元格
- 13. 在Excel中選擇具有特定值的單元格的相鄰單元格
- 14. SQL:選擇基於另一個單元格的值單元格的值
- 15. 如何CSS選擇除IE7/8上最後一個單元格之外的所有單元格?
- 16. 選擇表格內的所有單元格
- 17. jquery選擇html表格單元格內的所有標籤
- 18. 在primefaces中一次性選擇/取消選擇所有元素<p:selectCheckboxMenu>?
- 19. 選擇列上最後一個單元格上方的單元格
- 20. 是否可以選擇條件格式爲true的所有單元格?
- 21. 檢索數據表單元格值以選擇選項框
- 22. 在iOS中選擇UITableView中的所有單元即使不可見單元格
- 23. 選擇表格單元格
- 24. 選擇哪些單元格可以活動單元格
- 25. 根據單元格中的值選擇表單元格
- 26. 從列值中選擇單元格
- 27. 只選擇值爲VBA的單元格
- 28. 如何選擇單元格的值?
- 29. 根據單元格值選擇行
- 30. 選擇基於單元格值
我不認爲有任何現成的方式來做到這一點。你將不得不做*一些*循環... – 2012-01-11 23:24:05