我有一个相当大的Excel文件,随着时间的推移发生了变化,我希望比较旧版本中每个工作表(图表,按钮,滑块,下拉菜单)中的所有对象,以查看已添加的内容(或删除)。
有没有办法使用VBA执行此操作?
答案 0 :(得分:4)
这样的事情可以浏览每张工作表并生成一个列表,可以按工作表,对象类型或对象名称进行排序。
Sub Dump()
Dim ws As Worksheet
Dim objFSO As Object
Dim objFile As Object
Dim Sh As Shape
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile("C:\temp\summary.csv")
objFile.writeline "Sheet, Object Type, Object name"
For Each ws In ActiveWorkbook.Sheets
For Each Sh In ws.Shapes
objFile.writeline ws.Name & "," & TypeName(Sh) & "," & Sh.Name
Next
Next
objFile.Close
End Sub
答案 1 :(得分:1)
是的,但不像你希望的那么容易。
你不能只是循环“所有对象”。因为工作表不是那种结构。工作表有ChartObjects
ListObjects
Shapes
等。
对于每个可以使用
循环的人for i = 1 to activesheet.chartobjects.count
debug.print chartobjects(i).name
next i
但你必须检查所有这些对象是否都有name属性,否则你的代码会抛出错误。
最佳建议:谷歌针对您拥有的每个特定对象。 “如何遍历工作表上的所有图表”(这将引导您返回ChartObjects
)。对所有类型的对象执行此操作。然后,您可以为每个对象类编写一个for
循环。
答案 2 :(得分:1)
这是一个循环遍历每个形状的宏(包括图表和下拉列表),并将该对象的名称写入文本文件中的新行。请注意,此文本文件不必已存在,它将自动创建:
Sub test()
Dim objFSO As Object, objFile
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\Users\[whatever]\Documents\text.txt", 2)
objFile.Write "" 'This clears the text file
Dim obj As Shape
For Each obj In ActiveSheet.Shapes
sWrite = obj.Name & "; height: " & obj.Height & "; width: " & obj.Width
Debug.Print sWrite
objFile.WriteLine sWrite
Next obj
objFile.Close
End Sub
答案 3 :(得分:0)
添加一些功能(“新”)我发现对 brettdj 提供的解决方案很有用。
如果您想在结果中包含所有 ListObjects,试试这个... 只需添加一个 For Each 循环,将所有 ListObjects(如 Tables)打印到 .csv 输出:
Sub Dump()
Dim ws As Worksheet
Dim objFSO As Object
Dim objFile As Object
Dim Sh As Shape
Dim Lo As ListObject 'NEW
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile("C:\temp\summary.csv")
objFile.writeline "Sheet, Object Type, Object name"
For Each ws In ActiveWorkbook.Sheets
For Each Sh In ws.Shapes
objFile.writeline ws.Name & "," & TypeName(Sh) & "," & Sh.Name
Next
For Each Lo In ws.ListObjects 'NEW
objFile.writeline ws.Name & "," & TypeName(Lo) & "," & Lo.Name 'NEW
Next 'NEW
Next
objFile.Close
End Sub