VBA将工作表名称与文本列表匹配

VBA将工作表名称与文本列表匹配,vba,Vba,我有一个城市名称的文本列表,我需要检查这些名称是否是工作表的名称,如果不是,则使用所述名称创建一个新的工作表 另一方面,如果列表中有没有名字的工作表,我需要删除这些工作表 我已经试了几个小时这个问题,我很迷茫,它可能很简单,所以如果有人可以帮助,将非常感谢 下面是关于这段代码的大致情况。这是我的文本文件的外观,所以没有混淆 Sub Macro1() Dim sFileName, tmp As String Dim dict As New Dictionary Dim dictCopy As Ne

我有一个城市名称的文本列表,我需要检查这些名称是否是工作表的名称,如果不是,则使用所述名称创建一个新的工作表

另一方面,如果列表中有没有名字的工作表,我需要删除这些工作表


我已经试了几个小时这个问题,我很迷茫,它可能很简单,所以如果有人可以帮助,将非常感谢

下面是关于这段代码的大致情况。这是我的文本文件的外观,所以没有混淆

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

这是我从这里获取的文本读取代码:。我发现它比其他vba文本读取代码更优雅。但要使用它,需要选择“Microsoft脚本运行时”作为参考(从“工具”菜单)。此代码还使用
字典
对象,该对象也需要该引用才能使用它。我使用这个对象而不是数组或其他集合,原因我将在下面解释

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
根据列表的长度,您可能会发现
字典
对象有利于双循环等。这是因为它有
.Exists
方法来查看它本身是否包含特定的值。我不知道它里面的机制,但是它比双循环技术快得多,特别是当你有很多条目要比较的时候。您应该注意,这些字典中的许多方法都使用键信息(而不是值)

最后部分:

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

您能展示一下您的尝试吗?如果你将文本列表导入到一种可以循环浏览的集合中,我想这相当容易。我没有任何代码来描述我所尝试过的内容,因为我尝试过的所有东西都坏得很厉害。我一直在试着做两个for循环,一个是看单元格中的城市名称,另一个是翻表,但我找不到有效的方法。哇,这对未来非常有帮助,但这不是我想要的,我应该更清楚,文本列表在excel中的单元格中,而不是在.txt函数中,但是这非常有用,我将保存它以备将来参考。上述内容仍然适用。如果列表位于任何列或连续单元格中,则可以轻松地循环以填充集合。你没有发布任何代码对我们也没有帮助。只是再看一次,完全有道理我如何转换它,我猜只是看到字典中的术语被使用,我认为它不能与excel一起工作。谢谢芒果!