2013-07-31 3 views
0

У меня есть winform на моем приложении excel, у которого есть кнопка, чтобы минимизировать форму. Но я также хочу свернуть приложение Excel, которое уже открыто. Я разработал код ниже, но говорит мне, что моя переменная используется до назначения значения.Минимизировать Excel с помощью кнопки на winform

Вот мой код:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

    Dim xl As Excel.Application 


    Me.WindowState = FormWindowState.Minimized 
    xl.Application.WindowState = XlWindowState.xlMinimized 

End Sub 
+2

Конечно, это - вы ничего не сделали, чтобы связать его с Excel. Объявление переменной с типом не автоматически делает ее полностью функциональной как этот тип. Вы должны сделать переменную, которая имеет «уже открытую» доступную (в области) для вашего обработчика 'Button1_Click' и использовать ее вместо объявления новой переменной. –

+0

Не эксперт здесь, но не должен быть Dim xl как новый Excel.Application? Или ссылку на существующую? Моя первая мысль заключалась в том, чтобы использовать interop. Не уверен, можете ли вы сделать это с офисными объектами. –

+0

Я использовал New Excel.Application, но это создает новый экземпляр excel. Поскольку excel уже открыт, я хочу свести к минимуму открытый экземпляр. –

ответ

1

Попробуйте найти открытый экземпляр Excel:

Imports System.Runtime.InteropServices 
Public Class Form1 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     'Create an Excel App 
     Dim excelApp As Microsoft.Office.Interop.Excel.Application = Marshal.GetActiveObject("Excel.Application") 
     MessageBox.Show(excelApp.Workbooks.Count.ToString) 
     For i As Integer = 1 To excelApp.Workbooks.Count 
      MessageBox.Show(excelApp.Workbooks(i).FullName) 
     Next 
     excelApp.Visible = False 
     'do your worh here 
     excelApp.Quit() 
     System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp) 
    End Sub 
End Class 

Взятые из: http://social.msdn.microsoft.com/Forums/en-US/1d89ea6d-f396-4a80-8071-9d24a023a254/how-to-search-all-excel-instances-to-see-if-a-particular-workbook-is-already-open

+0

запустил код и получил кол-во 0. Но я вижу, что рабочая книга открыта. Мне нужно подойти поближе к моей форме, здесь есть что-то еще, что я не заметил –

+0

Вы также можете попробовать с помощью «FindWindowEx», посмотрите на URL-адрес в ответе. Это немного сложнее и намного менее надежно, так как оно основано на названии окна, но, возможно, оно укажет вам в правильном направлении. – Nick

+0

Проблема с вашим предложением состоит в том, что он не определяет, что спрашивает OP. Нет проблем с минимизацией рабочей книги Excel после ее «правильного запуска», но он этого не делал !! То, что он сделал, эквивалентно: Dim test как String = Nothing test.Split() -> вы получаете ошибку из-за намерения получить доступ к членам объекта, который является null, а не экземпляром целевого класса. – varocarbas

1

Как Кен Уайт справедливо сказал, ошибка довольно наглядно и исправлено:

xl = New Excel.Application() 

Ваши знания на этом фронте довольно низкие, поэтому я рекомендую вам использовать правильный код (и отредактировать его для достижения чего угодно), чтобы избежать будущих проблем: MSDN sample code.

Смежные вопросы