首页 > 解决方案 > VBA:将行转换为列会导致 Excel 崩溃

问题描述

我在 1 列中有 1000 行数据,我需要根据每行粗体转换成列。粗体之间的行数不一致,与字符串值相同。

原始清单

我创建了一个在测试前 100 行时完美运行的简单代码。但是当试图通过整个列表或其他一些部分(甚至 50 行)运行它时,它只是在运行时卡住了,所以我必须通过任务管理器非常出色(没有错误消息)。

Sub Transpose_by_bold()  
    Dim x, y As Integer

    y = 1
    For x = 1 To 2000
        If Range("B" & x).Font.Bold = True And Range("B" & x + 1).Font.Bold = True Then y = 1
        If Range("B" & x).Font.Bold = True And Range("B" & x + 1).Font.Bold = False Then
            Range("B" & x + 1).Cut Range("B" & x).Offset(0, y)
            Range("B" & x + 1).EntireRow.Delete

            y = y + 1
            x = x - 1
        End If
  Next x
End Sub

如果您能给我一些想法,我将不胜感激这里出了什么问题?

标签: excelvba

解决方案


您的代码当前处于挂起状态,因为一旦它移动到列表的末尾,X 就永远不会增加,因此它会进入无限循环。我没有测试过 FaneDuru 的代码,所以它可能是答案,但另一种选择是在你的代码中添加某种转义子句,在你不希望自然发生的某些情况下弹跳你在您的代码中 - 就像一个计数器 if range("b" & x).value = "" 在不为真时被重置,并且在达到某个最大值(例如,10 个背靠背空单元格)时将 X 设置为等于您的最大值(在这种情况下为 2000)。

不要忘记,在出现这样奇怪的东西时,您可以使用 F8 单步执行您的代码,并在 Locals 窗口中查看您的 X 和 Y 值 - 如果您这样做,X 卡住的事实很快就会变得明显。

样本计数器(效率不高,但有效):

Sub Transpose_by_bold()
    Dim x, y As Integer
    Dim Counter as Integer
    y = 1
    For x = 1 To 2000
     If IsEmpty(Range("B" & x + 1)) Then
           Counter = Counter + 1
     Else
           Counter = 0
     End If
     If Counter > 9 Then
         x = 2001
     End If
        If Range("B" & x).Font.Bold = True And Range("B" & x + 1).Font.Bold = True Then y = 1
        If Range("B" & x).Font.Bold = True And Range("B" & x + 1).Font.Bold = False Then
            Range("B" & x + 1).Cut Range("B" & x).Offset(0, y)
            Range("B" & x + 1).EntireRow.Delete

            y = y + 1
            x = x - 1
        End If

  
  Next x
End Sub

我刚刚意识到的另一种选择(编辑注意这一点)是通过您感兴趣的列和工作表的使用范围的交叉来计算最大可能的行数,然后保留一个计数器来检查总共有多少您已评估的行(您的 X 计数器现在是您最终将获得多少行,而不是您查看了多少行,因为您的 x=x-1 行)并在该总数上运行您的主 For 循环行计数器而不是 X。

祝你好运!


推荐阅读