我在Excel工作表上运行了VBA,该工作表会转换工作表中的数据,以便将其导入到另一个应用程序中。
下面的函数清除数据并删除自动换行。当工作表中的单元格数量很大时,此功能将花费很长时间运行。由于我正在规范化数据以导入到关系数据库,因此我拥有的七个不同工作表中经常有很多单元格。
是否有一种更有效的方法来去除文本换行并清除单元格中的数据?
Dim ws As Worksheet
Dim x, lrow, lcol, active As Long
Dim r, cel As Range
active = ActiveWorkbook.Worksheets.count
For x = 1 To active
Set ws = ThisWorkbook.Sheets(x)
ws.Select
Select Case ws.name
Case "Solution", "Description", "Problem", "Buyer", "ProjectType", "Process", "Feature"
lrow = ws.UsedRange.Rows(ActiveSheet.UsedRange.Rows.count).row
lcol = ws.UsedRange.Columns(ActiveSheet.UsedRange.Rows.count).Column
If lrow > 1 Then
Set r = ws.Range(Cells(2, 1), Cells(lrow, lcol))
For Each cel In r.Cells
cel.WrapText = False
cel.Value = Application.WorksheetFunction.Clean(cel.Value)
Next cel
End If
Case Else
End Select
ws.Cells(1, 1).Select
ThisWorkbook.Sheets("Solution").Activate
Next x
答案 0 :(得分:2)
您的代码可以简化为
Sub Demo()
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
Select Case ws.Name
Case "Solution", "Description", "Problem", "Buyer", "ProjectType", "Process", "Feature"
With ws.UsedRange
.WrapText = False
.Value = ws.Evaluate("Clean(" & .Address & ")")
End With
End Select
Next
End Sub
在我的硬件上,具有100,000行26列的工作表用时约6s
注意:OP声明(在评论中)“ “它会将工作表上每个单元格的值更改为遇到的第一张工作表中的第一个值。” -测试了此声明,但不准确。此代码按宣传的方式工作。
答案 1 :(得分:0)
要删除文本换行属性(这使您的外部程序受到影响,这使我感到惊讶),您应该能够执行以下操作:
r.WrapText = False
对于Clean
,您要删除的单元格到底是什么?
将单元格读入数组会更快;处理它们,然后写回去。
类似的东西:(未调试)
Dim V, I as long, J as Long
v = R
for i = 1 to ubound(v)
for j = 1 to ubound(v,2)
`worksheetfunction.clean(v(i,j))
`or some other function to remove unwanted characters
next j
next i
r.clear
r.value = v
您还应该注意,UsedRange
并不是特别可靠,并且可能会导致您处理比所需数量更多的单元格。
此论坛上有很多帖子,它们显示了确定“最后一行”和“最后一列”的更好方法。