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
用以上代码初次运行时候可以正常返回当前已打开工作薄名称.. 但是现在又不行. 求帮忙解答下哪里除问题了.
...全文
3899 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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,785

社区成员

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

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