如何将Excel工作簿中的所有现有对象列出到文本文件?

时间:2015-08-27 17:37:35

标签: excel excel-vba vba

我有一个相当大的Excel文件,随着时间的推移发生了变化,我希望比较旧版本中每个工作表(图表,按钮,滑块,下拉菜单)中的所有对象,以查看已添加的内容(或删除)。

有没有办法使用VBA执行此操作?

4 个答案:

答案 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