vb中遍历当前已打开Excel工作簿名称

Next_1989 2017-11-08 03:21:36
Dim wbk As Excel.Workbook
Dim wbs As New Application
Private Sub Command1_Click()
For Each wbk In wbs.Workbooks
MsgBox wbk.Name
Next
End Sub
用以上代码初次运行时候可以正常返回当前已打开工作薄名称.. 但是现在又不行. 求帮忙解答下哪里除问题了.
...全文
3538 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
王二.麻子 2019-01-07
  • 打赏
  • 举报
回复
Dim wbk As Excel.Workbook
Dim wbs As New Excel.Application

Private Sub Command1_Click()
wbs.open ....打开你需要操作得xls文件
For Each wbk In wbs.Workbooks
MsgBox wbk.Name
Next
End Sub

VB业余爱好者 2018-12-26
  • 打赏
  • 举报
回复
Dim wbk As Excel.Workbook
Dim wbs As New Excel.Application

Private Sub Command1_Click()
For Each wbk In wbs.Workbooks
MsgBox wbk.Name
Next
End Sub


试过了,没问题,即使不是程序创建的也可以读到。但是有前提,就是我用WPS打开的excel文件就可以读到,拿EXCEL2007打开的excel文件读不到。而且必须程序先运行起来,然后再打开excel文件,才能读到标题,如果是在程序运行之前就已经打开的excel文件读不到。

不知道是不是与安装的office版本有关系。
weixin_44214148 2018-12-25
  • 打赏
  • 举报
回复
for each wbk in excel.workbooks
msg(wbk.name)
next wbk
赵4老师 2017-11-10
  • 打赏
  • 举报
回复
GetObject 函数 返回文件中的 ActiveX 对象的引用。 语法 GetObject([pathname] [, class]) GetObject 函数的语法包含下面几个命名参数: 部分 描述 pathname 可选的;Variant (String)。包含待检索对象的文件的全路径和名称。如果省略 pathname,则 class 是必需的。 class 可选的;Variant (String)。代表该对象的类的字符串。 其中,class 参数的语法格式为 appname.objecttype,且语法的各个部分如下: 部分 描述 appname 必需的;Variant (String)。提供该对象的应用程序名称。 objecttype 必需的;Variant (String)。待创建对象的类型或类。 说明 使用 GetObject 函数可以访问文件中的 ActiveX 对象,而且可以将该对象赋给对象变量。可以使用 Set 语句将 GetObject 返回的对象赋给对象变量。例如: Dim CADObject As Object Set CADObject = GetObject("C:\CAD\SCHEMA.CAD") 当执行上述代码时,就会启动与指定的 pathname 相关联的应用程序,同时激活指定文件中的对象。 如果 pathname 是一个零长度的字符串 (""),则 GetObject 返回指定类型的新的对象实例。如果省略了 pathname 参数,则 GetObject 返回指定类型的当前活动的对象。如果当前没有指定类型的对象,就会出错。 有些应用程序允许只激活文件的一部分,其方法是在文件名后加上一个惊叹号 (!) 以及用于标识想要激活的文件部分的字符串。关于如何创建这种字符串的信息,请参阅有关应用程序创建对象的文档。 例如,在绘图应用程序中,一个存放在文件中的图可能有多层。可以使用下述代码来激活图中被称为 SCHEMA.CAD 的层: Set LayerObject = GetObject("C:\CAD\SCHEMA.CAD!Layer3") 如果不指定对象的 class,则自动化会根据所提供的文件名,来确定被启动的应用程序以及被激活的对象。不过,有些文件可能不止支持一种对象类。例如,图片可能支持三种不同类型的对象:Application 对象,Drawing 对象,以及 Toolbar 对象,所有这些都是同一个文件中的一部分。为了说明要具体激活文件中的哪种对象,就应使用这个可选的 class 参数。例如: Dim MyObject As Object Set MyObject = GetObject("C:\DRAWINGS\SAMPLE.DRW", "FIGMENT.DRAWING") 在上述例子中,FIGMENT 是一个绘图应用程序的名称,而 DRAWING 则是它支持的一种对象类型。 对象被激活之后,就可以在代码中使用所定义的对象变量来引用它。在前面的例子中,可以使用对象变量 MyObject 来访问这个新对象的属性和方法。例如: MyObject.Line 9, 90 MyObject.InsertText 9, 100, "Hello, world." MyObject.SaveAs "C:\DRAWINGS\SAMPLE.DRW" 注意 当对象当前已有实例,或要创建已加载的文件的对象时,就使用 GetObject 函数。如果对象当前还没有实例,或不想启动已加载文件的对象,则应使用 CreateObject 函数。 如果对象已注册为单个实例的对象,则不管执行多少次 CreateObject,都只能创建该对象的一个实例。若使用单个实例对象,当使用零长度字符串 ("") 语法调用时,GetObject 总是返回同一个实例,而若省略 pathname 参数,就会出错。不能使用 GetObject 来获取 Visual Basic 创建的类的引用。 将对象引用赋予变量 在声明对象变量之后,必须给变量赋值对象引用,才能使用对象的属性、方法及事件。可以用几种方法赋值一个新的对象引用: 如果用 New 关键字声明了变量,在第一次使用该变量时,Visual Basic 会自动地赋值一个新的对象引用。 可以用 New 关键字或 CreateObject 函数,在 Set 语句中赋值对一个新的对象的引用。 可以用 GetObject 函数,在 Set 语句中赋值对新的或已有的对象的引用。 用 New 关键字赋值对象引用 如果 ActiveX 部件提供一个类型库,就可以在变量声明或 Set 语句中,用 New 关键字创建一个新对象并将对象引用赋予对象变量。 如果用 New 关键字声明一个对象变量,在第一次使用该变量时,Visual Basic 会自动地创建一个新对象。关于更详细的信息,请参阅“声明对象变量”。 也可以在 Set 语句中,使用 New 关键字赋值对特定类的新对象的引用。例如,下列语句将对于新的 DAO 表对象的引用赋予变量 tdfOrders,将表的 Name 属性设置为 "Orders": Dim tdfOrders As DAO.TableDef Set tdfOrders = New DAO.TableDef tdfOrders.Name = "Orders" 详细信息 请参阅“Dim 语句”或“Set 语句”。 用 CreateObject 赋值对象引用 不管 ActiveX 是否提供一个类型库,可以在 Set 语句中使用 CreateObject 函数创建一个新对象,并将对象引用赋予一个对象变量。必须规定对象的编程标识符作为函数的参数,而且想要访问的对象必须是外部可创建的。 要用 CreateObject 赋值对象引用,请 对 CreateObject 使用下列语法。 Set objectvariable = CreateObject ("progID") 通常,progID 参数是正在创建对象的完全限定类名,例如 Word.Document。但是,progID 也可以与类名不同。例如,Microsoft Excel 对象的 progID 是 "Sheet" 而不是 "Worksheet"。可以指定可选的 servername 参数来创建一个在跨网络的远程机器上的对象。它占用共享名称的 Machine Name 部分。例如,带有网络共享名称的 \\MyServer\Public,servername 参数将会是 "MyServer"。 下列代码例子启动 Microsort Excel (如果Microsft Excel 尚未运行)并创建变量 xlApp 来引用一个 Application 类的对象。参数 "Excel. Application" 充分限定 Application 为 Microsoft Excel 定义的类: Dim xlChart As Excel.Chart Set xlChart = CreateObject("Excel.Chart") 下列代码启动 Microsoft Excel 并创建变量 xlSheet 来引用 Worksheet 类的对象: Dim xlApp As Excel.Application Set xlApp = CreateObject("Excel.Application") 详细信息 请参阅“CreateObject 函数”。 用 GetObject 赋值对象引用 虽然 GetObject 函数也能用于赋值对一个新对象的引用,但是它一般还是用于赋值对已经存在的对象的引用。 使用下列语法,赋值对现存的对象的引用。 Set objectvariable = GetObject([pathname] [, progID]) pathname 参数可能是一个现存文件的路径、一个空字符串,也可以完全省略。如果被省略,则要求 progID。指定一个现存文件的路径,将引起 GetObject 使用存于文件中的信息创建一个对象。如第一个参数为空字符串,则 GetObject 的作用与 CreateObject 一样,将创建编程标识符是 progID 的类的一个新对象。下列表格描述了使用 GetObject 的结果。 如果 ActiveX 部件正在运行 结果 Set X = GetObject(, "MySrvr.Application") X 引用一个现存的 Application 对象。 Set X = GetObject("", "MySrvr.Object") X 引用一个新的,外部可创建的对象。 如果 ActiveX 部件没在运行 结果 Set X = GetObject(, "MySrvr.Object") 返回一个错误 Set X = GetObject("", "MySrvr.Object") ActiveX 部件 (MySrvr) 被启动,X 引用一个新的对象。 例如,变量 wrdApp 引用一个正在运行的 Microsoft Wor Applicatdion: Dim wdApp As Word.Application Set wdApp = GetObject("", "Word.Application") 同 CreateObject 一样,参数 "Word.Application" 是一个由 Microsoft word 定义的 Application 类的编程标志符。如果有多个 Microsoft Word 实例在运行,不能预先指出 wdApp 将引用那个实例。 重点 可以用 GetObject 赋值对复合文档文件中的对象引用。一个复合文档文件含有对多个对象类型的引用。例如,一个复合文档文件可以含有电子数据表,文本与位图。 如果电子数据表应用程序还没有运行,下列例子就启动该程序并打开文件 Revenue.xls: Dim xlBook As Excel.Workbook Set xlBook = GetObject("C:\Accounts\Revenue.xls") 详细信息 请参阅“GetIObject 函数”。
赵4老师 2017-11-10
  • 打赏
  • 举报
回复
谁说我给的代码就一定能跑来着?!
Next_1989 2017-11-09
  • 打赏
  • 举报
回复


这个不是通过Excel.application打开的 但是运行却能返回工作薄名称
Next_1989 2017-11-09
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
Dim wbk As Excel.Workbook
Private Sub Command1_Click()
For Each wbk In Excel.Application.Workbooks
MsgBox wbk.Name
Next
End Sub


这样测试了也不行,没有返回名称
赵4老师 2017-11-09
  • 打赏
  • 举报
回复
Dim wbk As Excel.Workbook
Private Sub Command1_Click()
For Each wbk In Excel.Application.Workbooks
    MsgBox wbk.Name
Next
End Sub
Next_1989 2017-11-09
  • 打赏
  • 举报
回复
引用 4 楼 Runnerchin 的回复:
你对office对象模型的理解有点偏差。 Excel.Application管不了已经打开的工作簿,只能控制由这个ExcelApplication打开或者创建的工作簿。 在代码运行之前打开的excel和wbs对象没有半点关系。
但实际过程用这段代码有时候还是能正常检测到不是由 ExcelApplication打开或者创建工作簿 的名称..所以这才是我奇怪的地方
X-i-n 2017-11-09
  • 打赏
  • 举报
回复
你对office对象模型的理解有点偏差。 Excel.Application管不了已经打开的工作簿,只能控制由这个ExcelApplication打开或者创建的工作簿。 在代码运行之前打开的excel和wbs对象没有半点关系。
X-i-n 2017-11-09
  • 打赏
  • 举报
回复
赵老师今天居然没有复制粘贴,可喜可贺。虽然你给的代码一段压根跑不了,另一段也是答非所问。 如果一定要获取打开的excel对象,那就只能用GetObject来获取。GetObject(文件名)来获取Excel对象,进一步通过obj.Application来获取Application对象,然后返回过来再用app.workbooks("文件名")来确认是不是已经打开(报错就是没打开)。 http://club.excelhome.net/thread-1217906-1-1.html
赵4老师 2017-11-09
  • 打赏
  • 举报
回复
Private Sub Command1_Click()
Dim wbk As Object
Dim app As Object
    Set app = CreateObject("Excel.Application")
    app.workbooks.open "c:\new\项目材料损耗率.xlsx"
    If app.workbooks.Count > 0 Then
        For Each wbk In app.workbooks
            Debug.Print wbk.Name
        Next
    Else
        Debug.Print "No WorkBook!"
    End If
    app.workbooks.Close
    Set app = Nothing
End Sub
Next_1989 2017-11-08
  • 打赏
  • 举报
回复
[quote=引用 2 楼 Chen8013 的回复:] 这段代码在架设有打开3个Excel工作薄的情况下。运行没有返回工作薄名称。。 也就是wbs.workbooks.count = 0 正常应该是= 3 的
舉杯邀明月 2017-11-08
  • 打赏
  • 举报
回复
只说个“不行”,鬼才知道是什么问题!!! 你就不能把有什么“不正常的反应”、或错误提示信息之类的,说清楚???
舉杯邀明月 2017-11-08
  • 打赏
  • 举报
回复
没有觉得这代码有问题。

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧