我遇到了一个VB.Net应用程序的问题,该应用程序在我的表单上的面板中打开Excel。我有点像.Net的初学者,所以这个问题可能很简单,虽然我已经做了很多搜索而没有找到解决方案。
在XP / Excel 2010计算机上运行应用程序时,一切正常。当我在Win7 / Excel 2013机器上运行它时,我遇到了这个问题。我使用的是Microsoft Excel 15.0对象库,所以我认为这应该对Excel 2013有用。
我的表单有两个按钮。其中一个按钮可打开现有电子表格,另一个按钮可创建新电子表格并添加一些格式。在Win7 / Excel2013计算机上运行应用程序时,我遇到了创建新电子表格的问题(顺便说一下,加载现有的电子表格没有问题)。代码将打开一个新的电子表格,将其嵌入面板中,并完成格式化。完成后,我无法更改电子表格中的单元格。它几乎就像被完全锁定一样。
当单步执行代码时,我可以看出当代码行设置oSheet的值时会出现这种行为。这是我的代码,在删除了许多不适用于这个问题的东西之后。
Imports Microsoft.Office.Interop
Imports Microsoft.Office.Interop.Excel
Imports Microsoft.Office
Imports Microsoft.Office.Core
Dim oExcel As New Excel.Application
Dim oWB As Excel.Workbook
Dim WithEvents oSheet As Excel.Worksheet
Private Sub btnNewConfig_Click(sender As Object, e As EventArgs) Handles btnNewConfig.Click
'This routine will create a new configuration file.
oExcel.DisplayAlerts = False
oExcel.Workbooks.Add()
oExcel.Application.WindowState = Excel.XlWindowState.xlMaximized
oExcel.Visible = True
'Maximize the Excel window within the panel
SetParent(oExcel.Hwnd, pnlExcel.Handle)
SendMessage(oExcel.Hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0)
boolFormatExcel = True
oWB = oExcel.ActiveWorkbook
oSheet = oWB.Worksheets("Sheet1")
oSheet.Range("A1").Value = "Address"
oSheet.Range("A1").ColumnWidth = 14
oSheet.Range("B1").Value = "Description"
oSheet.Range("B1").ColumnWidth = 35
........
对我来说很奇怪的是,当我打开现有的电子表格时,它仍然以相同的方式设置oWB和oSheet,没有任何问题。这是我在加载现有配置时的方法,这可以正常工作......
Private Sub btnLoadConfig_Click(sender As Object, e As EventArgs) Handles btnLoadConfig.Click
'This routine will prompt for a configuration file and load it into the form.
'sExcelFileName = oExcel.GetOpenFilename(FileFilter:="Excel Files,*.xlsx")
dlgOpenFile.Title = "Open a Configuration File"
dlgOpenFile.Filter = "Excel Files|*.xlsx"
dlgOpenFile.FileName = ""
Dim DidWork As Integer = dlgOpenFile.ShowDialog()
sExcelFileName = dlgOpenFile.FileName
If DidWork <> DialogResult.Cancel Then
oExcel.DisplayAlerts = False
oExcel.Workbooks.Open(sExcelFileName)
oWB = oExcel.ActiveWorkbook
oSheet = oWB.Worksheets("Sheet1")
'Check if a valid configuration file is selected. If so, load it. If not, pop up a message to user.
If oSheet.Cells(1, 1).Value = "Address" Then
oExcel.Application.WindowState = Excel.XlWindowState.xlMaximized
oExcel.Visible = True
'Maximize the Excel window
SetParent(oExcel.Hwnd, pnlExcel.Handle)
SendMessage(oExcel.Hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0)
..............
所以,在我看来,我正在做一些Excel 2013不喜欢的东西,但我似乎无法弄清楚它是什么。
感谢您的帮助......
答案 0 :(得分:1)
对于遇到在自定义控件/面板/表单等中嵌入excel 2013/2016的问题,我遇到了一个问题,只有在嵌入时,电子表格才能保持焦点,从而阻止编辑/输入。
在我的实例中,解决方法是删除我的行
xlsApp.WindowState=XlWindowState.xlMaximized
这是我在面板/用户控件中最大化它的位置 - (我现在只在调整大小时使用MOVEWINDOW)
以下链接中的简单示例有效,因此我的代码中出现了问题。
基本上我一直在评论我的代码,直到它工作。
希望这有助于某人。
修改
关闭色带,而嵌入式带来了问题(在嵌入工作之前将其关闭工作正常) - 所以还有其他的东西仍然可以让它更好地完全测试。
我的功能区关闭代码是
xlsApp.ExecuteExcel4Macro("SHOW.TOOLBAR(""Ribbon"",False)")
答案 1 :(得分:0)
在表单声明后尝试此操作。它可能会奏效。
oSheet.UNPROTECT