2016-11-14 151 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

相關問題