我有一个城市名称的文本列表,我需要检查这些名称是否是工作表的名称,如果不是,则使用所述名称创建一个新的工作表。
另一方面,如果列表中有任何没有名称的工作表,那么我需要删除这些工作表。
我一直在尝试这个问题几个小时并且非常迷茫,它可能很简单,所以如果有人可以提供帮助,将不胜感激!
我有一个城市名称的文本列表,我需要检查这些名称是否是工作表的名称,如果不是,则使用所述名称创建一个新的工作表。
另一方面,如果列表中有任何没有名称的工作表,那么我需要删除这些工作表。
我一直在尝试这个问题几个小时并且非常迷茫,它可能很简单,所以如果有人可以提供帮助,将不胜感激!
这只是关于此代码的外观。这是我的文本文件的样子,所以没有混淆。
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 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
方法来查看它本身是否包含特定值。我不知道其中的机制,但它比双循环技术快得多,尤其是当你有很多条目要比较时。您应该注意,很多这些字典方法都使用键信息(而不是值)。
最后部分:
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 不允许您删除工作簿中的最后一张工作表。因此,如果您选择删除错误命名的工作表或至少组合该方法,如果没有工作表名称与集合中的所有工作表名称匹配,则可能会遇到问题,所有这些工作表都必须删除。