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

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

有没有办法使用VBA做到这一点?

是的,但并不像你所希望的那样容易。

你不能只循环“所有对象”。 因为工作表没有这样的结构。 工作表具有ChartObjects ListObjects Shapes

对于你可以循环使用的每一个

 for i = 1 to activesheet.chartobjects.count debug.print chartobjects(i).name next i 

但是您必须检查所有这些对象是否具有名称属性,否则您的代码将引发错误。

最好的build议:谷歌每个特定的对象,你有EG“如何循环通过工作表上的所有图表”(这将导致你回到ChartObjects )。 对所有types的对象执行此操作。 然后你可以为每个类的对象写一个for循环。

这是一个macros,它将循环遍历每个形状(包括图表和下拉列表),并将该对象的名称写入到Text文件中的新行。 请注意,这个文本文件不一定已经存在,它会自动创build:

 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 

像这样的东西,通过每个工作表,并产生一个列表,可以按工作表,对象types或对象名称进行sorting。

 Sub Dump() Dim ws As Worksheet Dim objFSO As Object Dim objFil 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