使用新值替换所有工作表中的值

时间:2016-03-11 11:25:24

标签: excel vba excel-vba

我有大约40个电子表格,每个电子表格包含多达300k行x93列(当前)。这大约是11亿个数据点。我需要检查每个单元格,并确定单元格是否包含8个特殊字符中的一个,这些字符在输入电子表格时已经搞砸了。

这是一项需要每天多次运行的任务,以及许多其他步骤。因此,我正在寻找一种使用VBA的方法。我有以下代码:

Sub Hide_All_Sheets()

Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.DisplayStatusBar = False

Dim k As Integer
Dim t As String
Dim x As Integer

k = Sheets.Count
x = 1

    While x <= k
        t = Sheets(x).Name
        If t = "Launch Screen" Or t = "Equiv sheet" Then
            x = x + 1
        ElseIf t = "Summary_1" And Worksheets("Launch Screen").Range("N5") = "1" Then
            Sheets(x).Visible = True
            x = x + 1
        Else

            Cells.Replace What:="ö", Replacement:=Chr(214), LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
            ReplaceFormat:=False
            Cells.Replace What:="ü", Replacement:=Chr(220), LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
            ReplaceFormat:=False
            Cells.Replace What:="ä", Replacement:=Chr(220), LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
            ReplaceFormat:=False
            Cells.Replace What:="ß", Replacement:=Chr(223), LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
            ReplaceFormat:=False
            Cells.Replace What:="è", Replacement:=Chr(200), LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
            ReplaceFormat:=False
            Cells.Replace What:="Ü", Replacement:=Chr(223), LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
            ReplaceFormat:=False
            Cells.Replace What:="Ä", Replacement:=Chr(223), LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
            ReplaceFormat:=False

            Sheets(x).Visible = False
            x = x + 1
        End If

    Wend

End Sub

唯一的问题是它将加载过程从20秒变为900秒。

我想知道有没有办法更快地完成这项工作?特别是如果有办法运行手动CTRL-H流程,并替换所有电子表格,但使用VBA?

2 个答案:

答案 0 :(得分:2)

11亿个任务仍有很多工作要做。您的代码有条不紊地循环遍历每个工作表广告,替换输入中已损坏的七个( 8)特殊字符中的每一个。

以下使用工作簿范围的方法通过工作表集合替换循环。这可能有助于保留要处理的信息的“负载”。

Sub Repair_All_Worksheets()
    Dim fr As Long, FandR As Variant, vWSs As Variant

    appTGGL bTGGL:=False

    FandR = Array("ö", Chr(214), "ü", Chr(220), "ä", Chr(220), "ß", Chr(223), _
              "è", Chr(200), "Ü", Chr(223), "Ä", Chr(223))

    With ActiveWorkbook
        ReDim vWSs(1 To .Worksheets.Count)
        For fr = LBound(vWSs) To UBound(vWSs)
            vWSs(fr) = .Worksheets(fr).Name
        Next fr

        With .Worksheets(vWSs)
            .Select
            .Parent.Worksheets(vWSs(1)).Activate
            For fr = LBound(FandR) To UBound(FandR) Step 2
                Cells.Replace What:=FandR(fr), Replacement:=FandR(fr + 1), LookAt:=xlPart
            Next fr
        End With
    End With

    appTGGL

End Sub

Public Sub appTGGL(Optional bTGGL As Boolean = True)
    Debug.Print Timer
    With Application
        .ScreenUpdating = bTGGL
        .EnableEvents = bTGGL
        .DisplayAlerts = bTGGL
        .Calculation = IIf(bTGGL, xlCalculationAutomatic, xlCalculationManual)
    End With
End Sub

Application.EnableEvents property与其他环境变量一起被禁用。 Application.Calculation同样暂时被暂停至xlCalculationManual。这对于具有易失性函数的工作表尤为重要,而这似乎并非如此。

顺便说一句,在导入数据时,文本导入向导允许您在文件来源:文本框中的第一页上指定代码页。将其设置为正确的区域代码页(或可能只是65001:Unicode(UTF-8))应该修复导入开始。 Workbooks.OpenText method有类似的选项。

答案 1 :(得分:0)

XL查找和替换对话框允许我们更换所有&#34;在工作簿中。您只需手动调用对话框一次,将搜索设置为&#34;工作簿&#34;,然后点击查找下一次。

现在您不必遍历每张工作表来查找和替换。

Afaik这是设置XlSearchWithin.xlWithinWorkbook以确定FindReplace搜索范围的唯一方法。

enter image description here