我有大约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?
答案 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)