在调试模式下获取工作表计数 - MS Excel PIA
Getting the count of sheets in debug mode - MS Excel PIA
我无法访问 Sheets
的 .Count
属性。我正在使用 Excel Interop。我处于调试模式,正在尝试:
?xlSheets.Count
这导致:
(1) : error BC30456: 'Count' is not a member of 'Sheets'.
我不知道哪里出了问题,因为 I see in MSDN that there is such property!
效果很好:?xlSheets(1).Name
。但是 Count
失败了...是否有可能得到张数?
These guys had a similar problem - 他们想要 .Worksheets.Add(.Worksheets.Sheets.Count)
。最后他们没有得到计数,他们去了.Worksheets.Add(After:=.Worksheets(3))
...
更新:
令我非常高兴的是,在进一步尝试/实验之后,很明显 在调试模式下 Sheets.Count
不起作用 仅在 有代码中没有这样的行。
调试这段代码时,我可以访问Sheets.Count
,因为代码中存在这一行。
Imports Excel = Microsoft.Office.Interop.Excel
Public Class Form1
Dim xlApp As Excel.Application
Dim xlWorkBook As Excel.Workbook
Dim xlWorkbooks As Excel.Workbooks
Dim xlSheets As Excel.Sheets
Private Sub btnCreate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCreate.Click
xlApp = New Excel.Application
xlWorkbooks = xlApp.Workbooks
xlWorkBook = xlWorkbooks.Open("C:\Temp\Template.xlsm")
xlSheets = xlWorkBook.Sheets
MessageBox.Show(xlSheets.Count)
xlWorkBook.Close()
xlApp.Quit()
'Clean Up
releaseObject(xlSheets)
releaseObject(xlWorkBook)
releaseObject(xlWorkbooks)
releaseObject(xlApp)
End Sub
Private Sub releaseObject(ByVal obj As Object)
Try
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
obj = Nothing
Catch ex As Exception
obj = Nothing
Finally
GC.Collect()
GC.WaitForPendingFinalizers()
End Try
End Sub
End Class
但是当我用 MessageBox.Show(xlSheets.Creator)
替换 MessageBox.Show(xlSheets.Count)
时,尝试 ?xlSheets.Count
时出现错误。我还不知道这种行为的原因(我来自 VBA 调试模式似乎更灵活的环境),但至少在 运行 时间内有效...
如果有人知道如何解决这个问题,请告诉我,因为我在调试模式下测试小东西时感到受限!
你的代码对我来说工作正常。我注意到文件类型是启用宏的工作簿。您是否在开发 PC 上正确设置了宏设置?默认情况下 Excel 将禁用宏。
编辑:我想我现在明白你的问题了。尝试在调试模式下打印 属性 时出现错误。可能您在未设置变量的位置停止了代码(.Count 仅在按钮代码实际为 运行 时可用)。在消息框行上放置一个断点,单击按钮,然后重试。
使用项目 > 属性 > 引用。找到并 select "Microsoft Excel xx.x Object Library" 条目。在属性 window 中,将嵌入互操作类型 属性 设置为 False。使用 Build > Rebuild 来重建您的应用程序。它现在将按您预期的方式工作。
简而言之,此选项是对 COM 互操作库的强大优化,如 Microsoft.Office.Interop.Excel,您不再对库有 运行时间依赖性。编译器将库中的互操作类型复制到您程序的可执行文件中,只有您真正需要 运行 您的程序的类型。解释你的发现,当你不在你的程序中使用它时,计数 属性 实际上丢失了。
您不想这样,请在完成测试后将 属性 设置回 True。
我无法访问 Sheets
的 .Count
属性。我正在使用 Excel Interop。我处于调试模式,正在尝试:
?xlSheets.Count
这导致:
(1) : error BC30456: 'Count' is not a member of 'Sheets'.
我不知道哪里出了问题,因为 I see in MSDN that there is such property!
效果很好:?xlSheets(1).Name
。但是 Count
失败了...是否有可能得到张数?
These guys had a similar problem - 他们想要 .Worksheets.Add(.Worksheets.Sheets.Count)
。最后他们没有得到计数,他们去了.Worksheets.Add(After:=.Worksheets(3))
...
更新:
令我非常高兴的是,在进一步尝试/实验之后,很明显 在调试模式下 Sheets.Count
不起作用 仅在 有代码中没有这样的行。
调试这段代码时,我可以访问Sheets.Count
,因为代码中存在这一行。
Imports Excel = Microsoft.Office.Interop.Excel
Public Class Form1
Dim xlApp As Excel.Application
Dim xlWorkBook As Excel.Workbook
Dim xlWorkbooks As Excel.Workbooks
Dim xlSheets As Excel.Sheets
Private Sub btnCreate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCreate.Click
xlApp = New Excel.Application
xlWorkbooks = xlApp.Workbooks
xlWorkBook = xlWorkbooks.Open("C:\Temp\Template.xlsm")
xlSheets = xlWorkBook.Sheets
MessageBox.Show(xlSheets.Count)
xlWorkBook.Close()
xlApp.Quit()
'Clean Up
releaseObject(xlSheets)
releaseObject(xlWorkBook)
releaseObject(xlWorkbooks)
releaseObject(xlApp)
End Sub
Private Sub releaseObject(ByVal obj As Object)
Try
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
obj = Nothing
Catch ex As Exception
obj = Nothing
Finally
GC.Collect()
GC.WaitForPendingFinalizers()
End Try
End Sub
End Class
但是当我用 MessageBox.Show(xlSheets.Creator)
替换 MessageBox.Show(xlSheets.Count)
时,尝试 ?xlSheets.Count
时出现错误。我还不知道这种行为的原因(我来自 VBA 调试模式似乎更灵活的环境),但至少在 运行 时间内有效...
如果有人知道如何解决这个问题,请告诉我,因为我在调试模式下测试小东西时感到受限!
你的代码对我来说工作正常。我注意到文件类型是启用宏的工作簿。您是否在开发 PC 上正确设置了宏设置?默认情况下 Excel 将禁用宏。
编辑:我想我现在明白你的问题了。尝试在调试模式下打印 属性 时出现错误。可能您在未设置变量的位置停止了代码(.Count 仅在按钮代码实际为 运行 时可用)。在消息框行上放置一个断点,单击按钮,然后重试。
使用项目 > 属性 > 引用。找到并 select "Microsoft Excel xx.x Object Library" 条目。在属性 window 中,将嵌入互操作类型 属性 设置为 False。使用 Build > Rebuild 来重建您的应用程序。它现在将按您预期的方式工作。
简而言之,此选项是对 COM 互操作库的强大优化,如 Microsoft.Office.Interop.Excel,您不再对库有 运行时间依赖性。编译器将库中的互操作类型复制到您程序的可执行文件中,只有您真正需要 运行 您的程序的类型。解释你的发现,当你不在你的程序中使用它时,计数 属性 实际上丢失了。
您不想这样,请在完成测试后将 属性 设置回 True。