我有一个城市名称的文本列表,我需要检查并查看这些名称是否为工作表的名称,以及是否不使用所述名称创建新的工作表。VBA匹配工作表名称到文本列表
另一方面,如果在列表中没有任何名称的工作表,那么我需要删除这些工作表。
我一直在尝试这个问题几个小时,我很失落,它可能是简单的东西,所以如果有人可以帮助,将非常感激!
我有一个城市名称的文本列表,我需要检查并查看这些名称是否为工作表的名称,以及是否不使用所述名称创建新的工作表。VBA匹配工作表名称到文本列表
另一方面,如果在列表中没有任何名称的工作表,那么我需要删除这些工作表。
我一直在尝试这个问题几个小时,我很失落,它可能是简单的东西,所以如果有人可以帮助,将非常感激!
下面是关于这个代码的代码。这是我的文本文件的样子,所以没有混淆。
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将不允许您删除最后一个表中的工作簿。因此,如果您选择删除错误命名的工作表或者至少合并该方法,那么如果没有任何工作表名称集合在集合中,则必须删除所有这些工作表。
哇,这对未来是非常有用的,但它不是我正在寻找的东西,我应该更清楚,文本列表在excel中的单元格中,而不是在.txt函数中,但是这是非常有用的,我将保留以备将来参考。上面的 – user2255219 2013-04-07 23:11:33
仍然可以应用。如果列表位于任何列或连续的单元格中,则可以轻松地循环以填充集合。你没有发布任何代码也没有帮助我们。 – mango 2013-04-07 23:38:38
刚刚看了一遍,完全有道理,我可以如何转换它,我想只是看到字典条款正在使用我间隔,并没有认为它可以与Excel的功能。谢谢芒果! – user2255219 2013-04-08 01:36:19
你能展示你试过的吗?如果您将该文本列表导入可循环使用的集合类型,我会想象它很容易。 – mango 2013-04-07 18:38:05
我没有任何代码,我已经尝试过,因为我所尝试过的所有东西都已经坏掉了。我一直试图在对方内部做两个循环,一个在单元格中查看城市名称,另一个在表单中翻转,但我无法找到有效的方式来完成。 – user2255219 2013-04-07 21:10:40