VBA匹配工作表名称到文本列表

时间:2013-04-07 18:35:38

标签: vba

我有一个城市名称的文本列表,我需要检查并查看这些名称是否是工作表的名称,如果没有创建具有所述名称的新工作表。

另一方面,如果列表中没有任何名称的工作表,那么我需要删除这些工作表。

我一直在尝试这个问题几个小时而且非常迷失,它可能很简单,所以如果有人可以提供帮助,那将非常感激!

1 个答案:

答案 0 :(得分: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 Scripting Runtime”作为参考(从工具菜单中)才能使用它。此代码还使用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方法,以查看它是否包含自身内的特定值。我不知道它里面的机制,但它比双循环技术 MUCH 更快,特别是当你有很多条目需要比较时。您应该注意,很多这些字典方法都使用了键信息(而不是值)。

最后部分:

    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不允许您删除工作簿中的最后一个工作表。因此,如果您选择删除错误命名的工作表或至少组合该方法,则如果没有工作表名称与集合中的那些相匹配,则可能会遇到问题,所有这些工作表都必须删除。