可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am using the code below to trim some "blank cells" that contain a space. The thing is it takes too much time, as is looping to every cell. What I want is to remove the spaces(the ones in the beginning and end, not middle), of all the cells.
Is there any easier way that I can apply all at once?
For a = 1 To ScenarioTableLastRow For f = 1 To ScenarioTableLastColumn If Cells(a, f) <> "" Then Cells(a, f) = Excel.Application.Trim(Cells(a, f)) End If Next f Next a
回答1:
You'll get much better performance copying the data into an array, and working on the array, then placing the data back into the range.
Also, don't use Excel.Application.Trim
. That's Excel 95 syntax, and a late-bound call with unexpected error handling. VBA has a Trim
function built-in - it's about 10 times faster and it provides Intellisense.
Sub test() 'Assuming ScenarioTable is a range Dim ScenarioTable As Range Set ScenarioTable = Range("ScenarioTable") 'I assume your range might have some formulas, so... 'Get the formulas into an array Dim v As Variant v = ScenarioTable.Formula Dim a As Long Dim f As Long 'Then loop over the array For a = LBound(v, 1) To UBound(v, 1) For f = LBound(v, 2) To UBound(v, 2) If Not IsEmpty(v(a, f)) Then v(a, f) = VBA.Trim(v(a, f)) End If Next f Next a 'Insert the results ScenarioTable.Formula = v End Sub
回答2:
Do it on the whole range at once using the array version of Excel's Trim
:
myRange.Value = Application.Trim(myRange.Value)
Using the only variables visible in your code, it would be:
With Range(Cells(1,1), Cells(ScenarioTableLastRow, ScenarioTableLastColumn)) .Value = Application.Trim(.Value) End With