VB.NET + Excel: есть вопрос

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

VB.NET + Excel: есть вопрос

Сообщение Gfif21 » 29.10.2011 (Сб) 14:19

Доброго времени суток)

Нужна программка управления файлом Excel. В том числе нужен обработчик изменения содержания ячейки - аналог Worksheet_Change(ByVal Target As Range) в самом Excel. Возникла небольшая проблема :( Вот для примера код:
Код: Выделить всё
Imports Microsoft.Office.Interop.Excel

Public Class Form1
    Dim Event_Change As Excel.DocEvents_ChangeEventHandler
    Dim exAPP As New Excel.Application
    Dim exBOOK As Excel.Workbook
    Dim exSHEET As Excel.Worksheet

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        exAPP = New Excel.Application
        exAPP.DisplayAlerts = False
        exAPP.Visible = True

        exBOOK = exAPP.Workbooks.Open("C:\01.xls")

        exSHEET = exBOOK.Worksheets.Item(2)
        exSHEET.Activate()

        Event_Change = New Excel.DocEvents_ChangeEventHandler(AddressOf CellChanged)
        AddHandler exSHEET.Change, Event_Change
    End Sub

    Private Sub CellChanged(ByVal Target As Excel.Range)
        Debug.Write("Изменена ячейка " & Target.Address)
    End Sub
End Class
Вот в таком виде все работает.

Если в обработчике написать такой код
Код: Выделить всё
Private Sub CellChanged(ByVal Target As Excel.Range)
    MsgBox("Изменена ячейка " & Target.Address)
End Sub
то тоже все работает.

А вот если написать такой код
Код: Выделить всё
Private Sub CellChanged(ByVal Target As Excel.Range)
    Label1.Text = "Изменена ячейка " & Target.Address
End Sub
то текст в Label1 не меняется и в Immediate Window пишется A first chance exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll. Помимо Label пробовал отобразить адрес ячейки и в TextBox, и в ListBox, и в ListView - результат аналогичный... Подскажите, плиз, в чем дело :roll:

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: VB.NET + Excel: есть вопрос

Сообщение ger_kar » 29.10.2011 (Сб) 14:40

А почему Label1.Text = "Изменена ячейка " & Target.Address,
У Label разве есть свойство текст?
А если так: Label1.Caption = "Изменена ячейка " & Target.Address
Бороться и искать, найти и перепрятать

SaturnKZ
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 8
Зарегистрирован: 14.10.2011 (Пт) 6:36

Re: VB.NET + Excel: есть вопрос

Сообщение SaturnKZ » 29.10.2011 (Сб) 16:11

Gfif21 писал(а):то текст в Label1 не меняется и в Immediate Window пишется A first chance exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll

Используйте Invoke. Примерно так:
Код: Выделить всё
    Private Delegate Sub ChangeLabelTextDelegate(ByVal target As Label, ByVal newText As String)

    Private Sub ChangeLabelText(ByVal target As Label, ByVal newText As String)
        target.Text = newText
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        otherThread.RunWorkerAsync()
    End Sub

    Private Sub otherThread_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles otherThread.DoWork
        ' Label1.Text = "Новый текст" ': Ошибка
        Invoke(New ChangeLabelTextDelegate(AddressOf ChangeLabelText), Label1, "Новый текст")
    End Sub


ger_kar писал(а):У Label разве есть свойство текст?

Да, есть, а вот Caption нету. Это еще раз говорит нам о том, что вы поливаете грязью .NET даже не поработав с ним.

Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

Re: VB.NET + Excel: есть вопрос

Сообщение Gfif21 » 29.10.2011 (Сб) 19:38

ошибки :? ругается на otherThread

otherThread.RunWorkerAsync() - Name 'otherThread' is not declared
Private Sub otherThread_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles otherThread.DoWork - Handles clause requires a WithEvents variable defined in the containing type or one of its base types

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: VB.NET + Excel: есть вопрос

Сообщение FireFenix » 29.10.2011 (Сб) 20:21

otherThread должно быть обьявлено с параметров WithEvents
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 29.10.2011 (Сб) 23:25

ger_kar писал(а):А почему Label1.Text = "Изменена ячейка " & Target.Address,
У Label разве есть свойство текст?
А если так: Label1.Caption = "Изменена ячейка " & Target.Address

В VB.NET у всех контролов Text. Caption больше не существует.

Gfif21 писал(а):Подскажите, плиз, в чем дело

Используй Me.Invoke(...).

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: VB.NET + Excel: есть вопрос

Сообщение ger_kar » 29.10.2011 (Сб) 23:32

Qwertiy писал(а):В VB.NET у всех контролов Text. Caption больше не существует.
Обидно да! :)
Бороться и искать, найти и перепрятать

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: VB.NET + Excel: есть вопрос

Сообщение Joo » 30.10.2011 (Вс) 18:18

Gfif21 писал(а):otherThread

Это, вероятно, компонент BackgroundWorker с именем otherThread.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

Re: VB.NET + Excel: есть вопрос

Сообщение Gfif21 » 02.11.2011 (Ср) 21:26

всем спасибо за внимание и за помощь) я немного по-другому сделал, но все работает :wink:

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: VB.NET + Excel: есть вопрос

Сообщение ger_kar » 02.11.2011 (Ср) 21:30

Gfif21 писал(а): я немного по-другому сделал

Ну так покажи, коли сделал ;)
Бороться и искать, найти и перепрятать

Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

Re: VB.NET + Excel: есть вопрос

Сообщение Gfif21 » 08.11.2011 (Вт) 19:01

просто в Form1_Load добавил строчку
Код: Выделить всё
Label1.CheckForIllegalCrossThreadCalls = False

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: VB.NET + Excel: есть вопрос

Сообщение FireFenix » 08.11.2011 (Вт) 19:29

Это в будущем от ошибок не избавит
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 26

    TopList