2013-04-07 27 views
-1

我有一個城市名稱的文本列表,我需要檢查並查看這些名稱是否爲工作表的名稱,以及是否不使用所述名稱創建新的工作表。VBA匹配工作表名稱到文本列表

另一方面,如果在列表中沒有任何名稱的工作表,那麼我需要刪除這些工作表。

我一直在嘗試這個問題幾個小時,我很失落,它可能是簡單的東西,所以如果有人可以幫助,將非常感激!

+1

你能展示你試過的嗎?如果您將該文本列表導入可循環使用的集合類型,我會想象它很容易。 – mango 2013-04-07 18:38:05

+0

我沒有任何代碼,我已經嘗試過,因爲我所嘗試過的所有東西都已經壞掉了。我一直試圖在對方內部做兩個循環,一個在單元格中查看城市名稱,另一個在表單中翻轉,但我無法找到有效的方式來完成。 – user2255219 2013-04-07 21:10:40

回答

1

下面是關於這個代碼的代碼。這是我的文本文件的樣子,所以沒有混淆。

enter image description here

Sub Macro1() 
Dim sFileName, tmp As String 
Dim dict As New Dictionary 
Dim dictCopy As New Dictionary 
Dim ws As Worksheet 

sFileName = "C:\Users\Mango\Desktop\names.txt" 
'^ Specify the location of the txt file that you want read 

    With New Scripting.FileSystemObject 
     With .OpenTextFile(sFileName, ForReading) 

      Do Until .AtEndOfStream 
       tmp = .ReadLine 
       '^ This step should be noted. Calling .Readline more than once 
       ' even in loop cause it to move to the next one. 

       dict.Add tmp, tmp 
       dictCopy.Add tmp, tmp 
       '^ add to our dictionary objects 
      Loop 

     End With 
    End With 

這是我在這裏拿起形式的文本閱讀代碼:Read lines from a text file but skip the first two lines。我發現它比其他vba文本閱讀代碼更優雅。但是,您需要選擇一個「Microsoft腳本運行時」作爲參考(從工具菜單中)才能使用它。此代碼還使用Dictionary對象,該對象還需要該引用才能使用它。我使用這個對象而不是數組或其他集合,原因我將在下面解釋。

For Each ws In ActiveWorkbook.Worksheets 
    If dict.Exists(ws.Name) = True Then 
     dict.Remove (ws.Name) 
    End If 
Next 

For Each j In dict.Items 
    Set ws = Worksheets.Add(after:=Worksheets(Worksheets.Count)) 
    ws.Name = j 
Next 

根據您的名單有多長,你可能會發現Dictionary對象利於雙循環等。這是因爲它有.Exists方法來查看它是否包含其中的特定值。我不知道它裏面的機制,但它比雙循環技術更快,尤其是當你有很多條目要比較時。你應該注意到很多這些字典方法都使用了關鍵字info(而不是值)。

最後一部分:

Application.DisplayAlerts = False 'removes annoying save notification 
    For Each ws In ActiveWorkbook.Worksheets 
     If dictCopy.Exists(ws.Name) = False Then 
      ws.Delete 
     End If 
    Next 
    Application.DisplayAlerts = True 
End Sub 

我選擇了做它喜歡這樣,因爲Excel將不允許您刪除最後一個表中的工作簿。因此,如果您選擇刪除錯誤命名的工作表或者至少合併該方法,那麼如果沒有任何工作表名稱集合在集合中,則必須刪除所有這些工作表。

+0

哇,這對未來是非常有用的,但它不是我正在尋找的東西,我應該更清楚,文本列表在excel中的單元格中,而不是在.txt函數中,但是這是非常有用的,我將保留以備將來參考。上面的 – user2255219 2013-04-07 23:11:33

+0

仍然可以應用。如果列表位於任何列或連續的單元格中,則可以輕鬆地循環以填充集合。你沒有發佈任何代碼也沒有幫助我們。 – mango 2013-04-07 23:38:38

+0

剛剛看了一遍,完全有道理,我可以如何轉換它,我想只是看到字典條款正在使用我間隔,並沒有認爲它可以與Excel的功能。謝謝芒果! – user2255219 2013-04-08 01:36:19

相關問題