试图理解差异

时间:2016-06-15 10:01:16

标签: excel vba infinite-loop lowercase

我希望没有人会因为我提出有关工作代码的问题而感冒。然而,有人告诉我,这也是为了学习,所以我希望这没关系。

我想要的是尝试理解我写的两个代码之间的区别,一个是有效的,一个是失败的。

此代码是失败的版本:

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个字符):

enter image description here

然而,我仍然调用所有单元格,我不确定为什么给单元格一个实际停止循环的值。因为,但我确信我错了,我觉得我仍然没有改变"对于每个细胞/下一个细胞"编码的一部分。

编辑:它与我的工作表中错误使用xlLastCell有关,因为它不是第2行中的最后一个单元格。在第二个代码中,一个值可能会达到0,而在第一个不是。必须更改代码以使用不同的方法来查找最后一个单元格。

1 个答案:

答案 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