excel - 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
如果您能给我一些想法,我将不胜感激这里出了什么问题?
解决方案
您的代码当前处于挂起状态,因为一旦它移动到列表的末尾,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。
祝你好运!
推荐阅读
- html - 如何在编辑模式下检测预填充的 Angular 反应表单中的更改
- swift - “inout”破坏了我的功能。我做错了什么?
- vue.js - 请求头域授权
- visual-studio-2019 - Visual Studio 项目参考中的警告标志是什么意思?
- javascript - 使用一个事务后阅读事务中的附加文档。已获取
- android - 为什么我不能在真机上调试安卓应用?
- c# - Automapper 继承 NullReferenceException
- azure - 如何在不同存储库中的管道之间共享文件?
- sql-server - 使用 Debezium 将 MSSQL CDC 流式传输到 AWS MSK
- security - 我的键盘的自定义映射可以保护我免受键盘记录器的侵害吗?