【发布时间】:2021-11-14 06:54:39
【问题描述】:
我正在为 Excel 使用 VBA。 我有执行以下操作的代码:
获取一个单词数组(称为
Search_Terms)然后我有一个函数(见下文),它接收
Search_Terms和对 Excel 中单元格的引用。然后该函数搜索单元格内的文本。
它会在单元格中查找与
Search_Terms中的单词匹配的所有子字符串并更改其格式。下面显示的功能已经可以工作了。
但是,当我想搜索包含 20 或 30 个单词的数组的数千个单元格时,速度很慢。
我想知道是否有一种更有效/更惯用的方法来做到这一点(我对 VBA 不是很熟悉,我只是在尝试破解)。
谢谢!
Dim Search_Terms As Variant
Dim starting_numbers() As Integer ' this is an "array?" that holds the starting position of each matching substring
Dim length_numbers() As Integer 'This is an "array" that holds the length of each matching substring
Search_Terms = Array("word1", "word2", "word3")
Call change_all_matches(Search_Terms, c) ' "c" is a reference to a Cell in a Worksheet
Function change_all_matches(terms As Variant, ByRef c As Variant)
ReDim starting_numbers(1 To 1) As Integer ' reset the array
ReDim length_numbers(1 To 1) As Integer ' reset the array
response = c.Value
' This For-Loop Searches through the Text in the Cell and finds the starting position & length of each matching substring
For Each term In terms ' Iterate through each term
Start = 1
Do
pos = InStr(Start, response, term, vbTextCompare) 'See if we have a match
If pos > 0 Then
Start = pos + 1 ' keep looking for more substrings
starting_numbers(UBound(starting_numbers)) = pos
ReDim Preserve starting_numbers(1 To UBound(starting_numbers) + 1) As Integer ' Add each matching "starting position" to our array called "starting_numbers"
length_numbers(UBound(length_numbers)) = Len(term)
ReDim Preserve length_numbers(1 To UBound(length_numbers) + 1) As Integer
End If
Loop While pos > 0 ' Keep searching until we find no substring matches
Next
c.Select 'Select the cell
' This For-Loop iterates through the starting position of each substring and modifies the formatting of all matches
For i = 1 To UBound(starting_numbers)
If starting_numbers(i) > 0 Then
With ActiveCell.Characters(Start:=starting_numbers(i), Length:=length_numbers(i)).Font
.FontStyle = "Bold"
.Color = -4165632
.Size = 13
End With
End If
Next i
Erase starting_numbers
Erase length_numbers
End Function
【问题讨论】:
-
您的某些代码丢失了。但是,对于必须写入工作表的例程,您可以通过关闭 ScreenUpdating 并将计算模式设置为手动来提高速度。此外,禁用事件。使用 Long 数据类型而不是 Integer 可能会有所改进,因为 VBA 无论如何都会将 Integers 转换为 Long。
-
@RonRosenfeld 你是对的。缺少一些代码(如果造成混乱,请致歉)。绝对迷人。我不知道这些东西存在(ScreenUpdating,计算模式等)。谢谢。