我希望没有人会因为我提出有关工作代码的问题而感冒。然而,有人告诉我,这也是为了学习,所以我希望这没关系。
我想要的是尝试理解我写的两个代码之间的区别,一个是有效的,一个是失败的。
此代码是失败的版本:
Sub Lowercase()
Dim Seq As Range
Set Seq = Range(Range("A2"), ActiveCell.SpecialCells(xlLastCell))
For Each cell In Seq
cell.Value = LCase(cell.Value)
Next cell
End Sub
它确实把小写的东西放得很好,但它会一直循环直到我关闭或最小化Excel。 考虑旧代码,我将代码更改为:
Sub Lowercase()
Dim Seq As Range, v As Variant
Dim L As Long, i As Long
Set Seq = Range(Range("A2"), ActiveCell.SpecialCells(xlLastCell))
For Each cell In Seq
v = cell.Value
L = Len(v)
For i = 1 To L
cell.Value = LCase(cell.Value)
Next i
Next cell
End Sub
这很好(有点慢但没关系)也不明白为什么。
我尝试转换的文件看起来像(A2行往往会持续600到1200个字符):
然而,我仍然调用所有单元格,我不确定为什么给单元格一个实际停止循环的值。因为,但我确信我错了,我觉得我仍然没有改变"对于每个细胞/下一个细胞"编码的一部分。
编辑:它与我的工作表中错误使用xlLastCell有关,因为它不是第2行中的最后一个单元格。在第二个代码中,一个值可能会达到0,而在第一个不是。必须更改代码以使用不同的方法来查找最后一个单元格。答案 0 :(得分:0)
您的电子表格似乎存在某种奇怪的交互(在我不知道的内容之间)。以下内容不会揭示这些交互是什么,但可能会抑制它们。此外,您的代码具有通过长度为零的字符串替换范围中的任何空白单元格的效果。我无法想象这有什么意义,所以我要防范它。我还以更可靠的方式抓住了Row2中最后一个使用过的单元格:
Sub Lowercase()
Dim Seq As Range, Cell As Range, LastCell As Range
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Set LastCell = Cells(2, Columns.Count).End(xlToLeft) 'last cell in Row 2 with data, assuming that not all cells in row have data
Set Seq = Range("A2", LastCell)
For Each Cell In Seq
If Len(Cell.Value) > 0 Then Cell.Value = LCase(Cell.Value)
Next Cell
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
End Sub