试图了解差异
Trying to understand the difference
我希望没有人会因为我提出有关 工作 代码的问题而被冒犯。然而,有人告诉我,SO 也是为了学习,所以我希望这会很好。
我想要的是尝试理解我编写的两段代码之间的区别,一种有效,一种失败。
此代码是失败版本:
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 个字符):
但是,我仍然调用所有单元格,我不确定为什么要给单元格一个值,它实际上会停止循环。作为,但我确定我错了,我感觉我仍然没有更改编码的 "For each cell / next cell" 部分。
编辑:这与我的工作表错误使用 xlLastCell 有关,因为它不是第 2 行中的最后一个单元格。在第二个代码中,值可能达到 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
我希望没有人会因为我提出有关 工作 代码的问题而被冒犯。然而,有人告诉我,SO 也是为了学习,所以我希望这会很好。
我想要的是尝试理解我编写的两段代码之间的区别,一种有效,一种失败。
此代码是失败版本:
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 个字符):
但是,我仍然调用所有单元格,我不确定为什么要给单元格一个值,它实际上会停止循环。作为,但我确定我错了,我感觉我仍然没有更改编码的 "For each cell / next cell" 部分。
编辑:这与我的工作表错误使用 xlLastCell 有关,因为它不是第 2 行中的最后一个单元格。在第二个代码中,值可能达到 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