我有一个电子表格,用于每周将数据导入数据库。
数据必须以特定方式格式化才能正确导入。
我想使用VBA来格式化数据,而不是手动过程。
重新打开XL工作簿时,此代码会将数据更改为特定名称:
Option Explicit
Private Sub Workbook_Open()
'course name changes
Columns("G:G").Select
Selection.Replace What:="Course Name", replacement:="New Course Name", _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:= _ False, ReplaceFormat:=False
我为每个新名称重复此代码。是否有更简洁的方式来编写使用较少文本的内容?可能是一种允许我将数组中的所有课程名称列为键值对的方式,这样就更容易维护。感谢
答案 0 :(得分:1)
我认为最好使用字典结构并循环遍历范围(G列)中的每个单元格,然后评估,而不是通过查找/替换字符串列表如果短语在字典中。
在短语列表上的列上查找/替换将非常昂贵,因为每次搜索都将遍历该范围中的每个值。如果你有1,000个短语替换和1,000,000行,你最好去三明治,因为它会有一段时间。
使用集合循环遍历范围更好,但仍然不如字典。与可以是O(n)的标准集合/列表搜索相比,字典搜索是O(1)。这对于非匹配非常重要,其中收集方法会让您在发现没有匹配之前浏览集合中的每个项目 - 如果匹配则字典立即知道,如果匹配,那么它是什么。
这是一个关于G列如何工作的例子:
Sub ReplacePhrases()
Dim dict As New Dictionary
Dim row, lastRow As Long
Dim replace As String
dict.Add "Course Name", "New Course Name"
dict.Add "VBA, 2nd Edition", "VBA 3rd Edition"
lastRow = ActiveWorkbook.ActiveSheet.UsedRange.Rows.Count
For row = 1 To lastRow
replace = dict(Cells(row, 7).Value2)
If replace <> "" Then
Cells(row, 7).Value2 = replace
End If
Next row
End Sub
可以通过遍历另一个工作表中的单元格列表,文件中的行,数据库中的行或您认为合适的任何其他内容来替换dict.Add
行。