如何使清理功能更有效?

时间:2020-02-03 22:39:40

标签: excel vba

我在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

2 个答案:

答案 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并不是特别可靠,并且可能会导致您处理比所需数量更多的单元格。

此论坛上有很多帖子,它们显示了确定“最后一行”和“最后一列”的更好方法。