Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: Excel не выгружается! Помогите! Добавлено: 16.02.06 21:32  

Автор вопроса:  shelte-don

Ответить

  Ответы Всего ответов: 24  

Номер ответа: 16
Автор ответа:
 SerJ



Вопросов: 24
Ответов: 332
 Профиль | | #16 Добавлено: 22.02.06 20:31
Я просто прозреваю............ Слушай, а ты вышеприведенный код сам-то юзал? Если юзал, то где? В екселе или в ВБ{6.0|.NET}?
ЗЫ. Короче, скажи мне задачу - что тебе нужно сделать? Мммдда..... :(

Ответить

Номер ответа: 17
Автор ответа:
 iLLyuzor



ICQ: 223685087 

Вопросов: 9
Ответов: 77
 Профиль | | #17 Добавлено: 23.02.06 10:42
Попробуй сделать это жестоко:

'*************************************************
Public Const PROCESS_TERMINATE = &H1
Public Const WM_QUERYENDSESSION = &H11
Public Const WM_ENDSESSION = &H16
Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, _
lpdwProcessId As Long) As Long
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, _
ByVal uExitCode As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" ( _
ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Public Const WM_CLOSE = &H10

Dim strCaptions() As String ' Здесь будут лежать заголовки всех найденных окон
Dim lngHandle() As Long ' А здесь все хэндлы этих окон

Public Function CloseExcel(strCaption As String) As Boolean
Dim iCount As Integer
Dim i As Integer
Dim Pos As Integer
Dim lngEnum As Long

ReDim strCaptions(0) ' Обнуляем массив от возможных прошлых результатов
ReDim lngHandle(0) ' то же чистим
lngEnum = EnumWindows(AddressOf Callback1_EnumWindows, 0)
' вот эта функция будет циклически вызвана столько раз,
' сколько будет найдено окон
' т.е. после ее выполнения оба массива будут наполнены
For i = 0 To UBound(strCaptions)
    ' перебираем эти массивы
    Pos = InStr(1, strCaptions(i), strCaption, vbTextCompare)
    ' ищем строку, которая должна характеризовать
    ' искомое окно
    If Pos > 0 Then
' SendMessage lngHandle(i), WM_CLOSE, 0, 0 ' Это команда окну честно закрыться.
    KillProcess lngHandle(i)
        ' Заметьте будут закрыты все окна с таким заголовком
        iCount = iCount + 1
    End If
Next
If iCount >= 1 Then
   CloseProg = True ' работа выпонена
Else
   CloseProg = False 'такое окно не найдено
End If
End Function

Public Function Callback1_EnumWindows(ByVal hwnd As Long, ByVal lpData As Long) As Long
Dim cnt As Long
Dim rttitle As String * 256
cnt = GetWindowText(hwnd, rttitle, 255)
' ищем следующее окно
If cnt > 0 Then ' нашли, тогда добавляем элемент в массивы
    ReDim Preserve lngHandle(UBound(strCaptions) + 1)
    ReDim Preserve strCaptions(UBound(strCaptions) + 1)
    strCaptions(UBound(strCaptions)) = Left$(rttitle, cnt)
    lngHandle(UBound(lngHandle)) = hwnd
End If
Callback1_EnumWindows = 1 ' продолжаем перебирать
End Function

Public Sub KillProcess(ByVal hwnd As Long)

Dim pID As Long
Dim hProc As Long
GetWindowThreadProcessId hwnd, pID
hProc = OpenProcess(PROCESS_TERMINATE, False, pID)
Call SendMessage(hwnd, WM_QUERYENDSESSION, 0, 1)
Call SendMessage(hwnd, WM_ENDSESSION, -1, 1)
TerminateProcess hProc, 0
CloseHandle hProc

End Sub

'************************************************

Потом вызываешь CloseExcel("заголовок экселевского окна";) или просто CloseExcel("Microsoft Excel";), но тогда прибьёт все открытые эксели. На VB6 у меня работало при аналогичной проблеме.

Ответить

Номер ответа: 18
Автор ответа:
 shelte-don



Вопросов: 8
Ответов: 15
 Профиль | | #18 Добавлено: 23.02.06 12:24
Я понимаю может такой код каким пользуюсь я простоват, слабоват или еще что-то, но как меня научили так я и делаю! Этот код написал я и использую его я и обратился я сюда чтобы спросить о помощи, а мне из десяти ответов 9 о том что у меня код какой то ни такой! НУ НЕ ЗНАЮ Я В чем причина! Я перевернул MSDN и еще другую литературу по .NET! и не нашел ничего внятного!
Сделать мне нужно вот что!
У меня есть некий файл *.xls путь к которому хранится как ты понял в переменной PutFile!
В этом файле мне необходимо изменить несколько значений на другие (из текстовых переменных Hdv2 Tdv2 Sdv2 Bdv2)
и все!
Помогите пожалуйста а не критикуйте код!

Ответить

Номер ответа: 19
Автор ответа:
 shelte-don



Вопросов: 8
Ответов: 15
 Профиль | | #19 Добавлено: 23.02.06 12:27
Спасибо iLLyuzorу обязательно попробую! А тому меня дела стоят мне после этой процедуры нобходимо открывать SOLIDWORKS 2005! а он эти фалы подгружает к себе, и как понимаешь прописывает мне болты потому что они заняты другим приложением!
Спасибо за совет по решению этой проблемки!

Ответить

Номер ответа: 20
Автор ответа:
 dr_sveta



Вопросов: 0
Ответов: 1
 Профиль | | #20 Добавлено: 16.11.06 13:28
У меня была аналогичная проблема. Долго маялась. Помогло:
GC.Collect()

Ответить

Номер ответа: 21
Автор ответа:
 Артем



ICQ: 312119975 

Вопросов: 0
Ответов: 6
 Профиль | | #21 Добавлено: 03.04.07 19:01
Dim EXL As New Application()
        Dim WSheet As New Worksheet()
        Dim WSheet1 As New Worksheet()
        WSheet = EXL.Workbooks.Open(cfgPathXLS).Worksheets.Item(1)
        WSheet = EXL.Workbooks.Item(1).Worksheets("Дата";)
        WSheet.Cells(2, 1) = intCod
        WSheet.Cells(2, 2) = strVid
        WSheet.Cells(2, 3) = strName
        WSheet.Cells(2, 4) = strName1
        WSheet.Cells(2, 5) = strName2
        WSheet.Cells(2, 6) = strName3
        WSheet.Cells(2, 7) = strMassaP
        WSheet.Cells(2, 8) = strSrok
        WSheet.Cells(2, 9) = strGOST
        WSheet.Cells(2, 10) = strOrg
        WSheet.Cells(2, 11) = strGOST1
        WSheet.Cells(4, 1) = CInt(strDate) + CInt(strNKach)
        WSheet.Cells(4, 3) = strDateVip
        WSheet.Cells(4, 4) = NPart.Text
        WSheet1 = EXL.Workbooks.Item(1).Worksheets("Сертификат";)
       
        EXL.Workbooks.Item(1).Close()



у меня все прекрасно сохраняет и закрывает :)

Ответить

Номер ответа: 22
Автор ответа:
 Stavr



Вопросов: 2
Ответов: 3
 Профиль | | #22 Добавлено: 12.04.07 01:31
посмотри статью http://ishodniki.ru/art/artshow.php?cat=1&id=455&show=net&pr=net_frame

Ответить

Номер ответа: 23
Автор ответа:
 Born



ICQ: 178155071 

Вопросов: 21
Ответов: 52
 Профиль | | #23 Добавлено: 12.04.07 08:28
На с# с такой же бедой столкнулся. 100% помогает: GC.GetTotalMemory(true);

Ответить

Номер ответа: 24
Автор ответа:
 Георгич



Вопросов: 16
Ответов: 52
 Профиль | | #24 Добавлено: 12.04.07 16:37
Я поступаю так


Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
        

        MsgBox("Если есть, открытые и не сохраненные документы «Excel», то обязательно их закрыть или сохранить, при закрытии программы, все открытые и не сохраненные документы «Excel», будут уничтожены. ", MsgBoxStyle.Exclamation, "ВНИМАНИЕ";)

        ;Dim Прог, Processes() As Process
        Processes = Process.GetProcessesByName("excel";)

        For Each Прог In Processes
            Прог.Kill()
        Next
End Sub

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам