2016-11-14 92 views
1

我有一个电子表格,每周用于将数据导入数据库。使用VBA在excel电子表格中格式化数据

数据必须以特定的方式格式化才能正确导入。

我想使用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

要回答你的问题,是的,有一种方法可以将数据存储为键值对。你可以使用一个集合。尽管我自己没有足够的练习,所以我不会尝试写一个宏;但我经常使用[this reference](http://excelmacromastery.com/excel-vba-collections/#Adding_Items_Using_a_Key)。 – PartyHatPanda

+0

我不太清楚你在问什么。你只是在做很多发现和替换,还有更多吗? – SJR

回答

1

而不是通过查找/替换字符串的列表,我认为这将是更好地使用字典结构和循环遍历您的范围(列G)中的每个单元格,并评估是否短语在字典中。

在短语列表上的列上查找/替换将会非常昂贵,因为每个搜索都会经过该范围中的每个值。如果你有1000个短语替换和1,000,000行,你最好去拿一个三明治,因为这将是一段时间。

使用集合遍历范围更好,但仍不如字典。词典搜索是O(1),而标准的搜集/列表搜索可以是O(n)。这对于非匹配非常重要,在这种情况下,收集方法会让你在发现不匹配之前检查集合中的每个项目 - 如果匹配,字典就会立即知道,如果匹配,那么它是什么。

下面是如何将在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线可以通过细胞的另一个工作表列表迭代来代替,从一个文件中的行,列从数据库或任何你认为合适的东西。

+0

这工作得很好,有几点要补充。我需要使Microsoft Scripting Runtime处于活动状态才能引用字典类。要执行此操作,请转到工具>参考> Microsoft脚本运行时,然后单击确定。 在添加项目之前,还必须包含字典类的新实例。这是否使用Set dict = New Dictionary。最终代码看起来像: 昏暗的字典作为字典 集字典=新词典 昏暗行,LASTROW只要 点心代替作为字符串 的代码的其余部分是与上面相同。 – Pete

相关问题