Не получается закрыть Excel

NikP
Дата: 20.11.2006 15:51:57
Подскажите пожалуйста что не так?
в этом варианте все нормально
Private Sub Кнопка0_Click()
    
    Dim xlApp As Object
    Dim wkb As Workbook

    Set xlApp = CreateObject("excel.application")
    Set wkb = xlApp.Workbooks.Add
    
    xlApp.Visible = True
    
    wkb.SaveAs Filename:="D:\MyDB\Zakaz.xls", FileFormat:= _
        xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
        , CreateBackup:=False

        
    xlApp.Quit
    Set xlApp = Nothing

End Sub
а в этом варианте не хочет закрываться
Private Sub btn_Otchet_Click()
On Error GoTo Err_btn_Otchet_Click

    Dim xlApp As Object
    Dim wkb As Workbook

    Set xlApp = CreateObject("excel.application")
    Set wkb = xlApp.Workbooks.Add
    
    xlApp.Visible = True
        
    Manager = "((tbl_Zakaz.Manager_Zakaz)='" & Form_frm_Otchet.cb_Manager & "') AND "
    Manager = ""
    
    Set MyDb = CurrentDb
    MySQL = "SELECT q_Otchet.Grup_Grup, q_Otchet.Goods_Goods, q_Otchet.Ed_Goods, Sum(q_Otchet.Kolvo_Zakaz) AS Kolvo_Zakaz, Sum(q_Otchet.Ves) AS Ves" & _
            " FROM (SELECT tbl_Grup.ID_Grup, tbl_Grup.Grup_Grup, tbl_Goods.Goods_Goods, tbl_Goods.Ed_Goods, tbl_Zakaz.Kolvo_Zakaz, [Kolvo_Zakaz]*[Kr_Goods]/1000 AS Ves, tbl_Zavod.ID_Zavod" & _
            " FROM tbl_Zavod INNER JOIN (tbl_Grup INNER JOIN (tbl_Data INNER JOIN (tbl_Goods INNER JOIN tbl_Zakaz ON tbl_Goods.ID_Goods = tbl_Zakaz.Goods_Zakaz) ON tbl_Data.ID_Data = tbl_Zakaz.Data_Zakaz) ON tbl_Grup.ID_Grup = tbl_Goods.Grup_Goods) ON tbl_Zavod.ID_Zavod = tbl_Goods.Zavod_Goods" & _
            " WHERE (" & Manager & "((tbl_Data.Data_Data)=" & CLng(Form_frm_Zakaz.DataZakaz) & ") AND ((tbl_Zavod.ID_Zavod)=" & Form_frm_Zakaz.V_Zavod & "))) AS q_Otchet" & _
            " GROUP BY q_Otchet.Grup_Grup, q_Otchet.Goods_Goods, q_Otchet.Ed_Goods, q_Otchet.ID_Grup, q_Otchet.Goods_Goods" & _
            " ORDER BY q_Otchet.ID_Grup, q_Otchet.Goods_Goods"
    Set TestTable = MyDb.OpenRecordset(MySQL)
    TestTable.MoveLast
    If (TestTable.RecordCount > 0) Then
        TestTable.MoveFirst
' Вставка рекордсета
        MyRow = 2
        MyCol = 1
        Cells(MyRow, MyCol).CopyFromRecordset TestTable
' Вставка шапки(заголовков) рекордсета
        intFildCount = TestTable.Fields.Count - 1
        For intI = 0 To intFildCount
        Cells(MyRow - 1, intI + MyCol).Value = TestTable.Fields(intI).Name
        Next intI
    Else: MsgBox "Not Found"
    End If

    TestTable.Close
    MyDb.Close
    Set MyDb = Nothing


    GrupAr = Array("Ветчина", "в/к колбасы", "Вареные колбасы", "п/к колбасы", _
                    "с/к колбасы", "Колбаски", "Котлеты", "Пельмени", _
                    "м/к", "Паштет", "Ребра", "Сардельки", "Сервелат", "Сосиски", _
                    "Прочее", "Хлеб", "Полуфабрикаты", "Изделия в желе", "Фарш")
'----------------------------------------------------------------------------------------
    Sheets("Лист1").Select
    Cells.Copy
    Sheets("Лист2").Select
    Cells.Select
    ActiveSheet.Paste
'--------------------------------------------------------------------
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    With Selection.Font
        .Name = "Arial"
        .Size = 10
        .Bold = False
        .ColorIndex = 0
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
    End With
''---------------------------------------------------------------------------------
    Range("A2").Select
    Selection.End(xlDown).Select
    EndRow = Selection.Cells.Row
    b = 0
    For i = 2 To EndRow
        For j = 0 To 18
            If Cells(i, 1) = GrupAr(j) And Cells(i, 1) <> Cells(i - 1, 1) Then
                Range(Cells(i + 2, 1), Cells(i + 2, 1)).Select
                b = b + 1
            End If
        Next j
    Next i
    
    For i = 2 To EndRow + b
        For j = 0 To 18
            If Cells(i, 1) = GrupAr(j) And Cells(i, 1) <> Cells(i - 1, 1) Then
                Gr = GrupAr(j)
                Cells(i, 1).EntireRow.Insert
                Cells(i, 2) = Gr
                Range(Cells(i, 2), Cells(i, 5)).Select
                Selection.Merge
                With Selection.Interior
                    .ColorIndex = 48
                    .Pattern = xlSolid
                End With
                With Selection.Font
                    .Name = "Arial"
                    .Size = 12
                    .Strikethrough = False
                    .Superscript = False
                    .Subscript = False
                    .OutlineFont = False
                    .Shadow = False
                    .Underline = xlUnderlineStyleNone
                    .ColorIndex = 55
                    .Bold = True
                End With
                Range(Cells(i + 2, 1), Cells(i + 2, 1)).Select
                i = 1 + i
            End If
        Next j
    Next i

    Range("A1").EntireColumn.Delete
    
    Range("A1") = "Товар"
    Range("B1") = "Ед."
    Range("C1") = "Кол-во"
    Range("D1") = "Кг"
    
    Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Font.Bold = True
    Selection.HorizontalAlignment = xlCenter
    
    Range(Selection, Selection.End(xlDown)).Select
''---------------------------------------------------------------------------------
    Selection.Columns.AutoFit
            
    Gran = Array(xlEdgeLeft, xlEdgeTop, xlEdgeBottom, xlEdgeRight, _
            xlInsideVertical, xlInsideHorizontal)
            
    For i = 0 To 5 Step 1
        With Selection.Borders(Gran(i))
            .LineStyle = 1
            If i > 3 Then
                .Weight = xlThin
            Else:
                .Weight = xlMedium
            End If
            .ColorIndex = xlAutomatic
        End With
    Next i
'---------------------------------------------------------------------------------
    Range("A1").Select
    Selection.End(xlDown).Select
    EndRow = Selection.Cells.Row
    Range(Cells(EndRow + 1, 4), Cells(EndRow + 1, 4)).Select
    ActiveCell.FormulaR1C1 = "=SUM(R[-" & EndRow - 2 & "]C:R[-1]C)"
    Range("A1").Select
    Selection.EntireRow.Insert
    Selection.EntireRow.Insert
    Selection.EntireRow.Insert
'---------------------------------------------------------------------------------
    Range("A1").Select
    
    Set MyDb = CurrentDb
    MySQL = "SELECT [Zavod_Zavod] & ' тел:' & [Telephon] AS Zavod FROM tbl_Zavod WHERE (((tbl_Zavod.ID_Zavod)=" & Form_frm_Zakaz.V_Zavod & "))"
    Set TestTable = MyDb.OpenRecordset(MySQL)
    TestTable.MoveLast
    If (TestTable.RecordCount > 0) Then
        TestTable.MoveFirst
' Вставка рекордсета
        MyRow = 1
        MyCol = 1
        Cells(MyRow, MyCol).CopyFromRecordset TestTable
    Else: MsgBox "Not Found"
    End If

    TestTable.Close
    MyDb.Close
    Set MyDb = Nothing
    Range("A2") = "Заявка ИП Дружинин на " & Form_frm_Zakaz.DataZakaz


    wkb.SaveAs Filename:="D:\MyDB\Zakaz.xls", FileFormat:= _
        xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
        , CreateBackup:=False

        
    xlApp.Quit
    Set xlApp = Nothing

    MsgBox "Отчет готов"

Exit_btn_Otchet_Click:
    Exit Sub

Err_btn_Otchet_Click:
    MsgBox Err.Description
    Resume Exit_btn_Otchet_Click
    
End Sub
NikP
Дата: 20.11.2006 17:06:52
Люди я понимаю, что второй код длинный и полностью просматривать его особо не охота
Вы подскажите хотя бы в какую сторону копать
Бенедикт
Дата: 20.11.2006 17:15:54
NikP,
Cсылки на объектные типы прибей. "Невооружённым взглядом" видна по крайней мере одна: wkb. Set wkb = Nothing перед xlApp.Quit.

P.S. В Access-е есть достаточно мощные отчёты, ты в курсе?
NikP
Дата: 20.11.2006 17:21:55
Бенедикт
NikP,
Cсылки на объектные типы прибей. "Невооружённым взглядом" видна по крайней мере одна: wkb. Set wkb = Nothing перед xlApp.Quit.

P.S. В Access-е есть достаточно мощные отчёты, ты в курсе?

Щас попробую
похоже именно в этом и проблема

про отчеты в курсе
а как ты их открывать будешь если у тебя Акса нет?
не задумывался
NikP
Дата: 20.11.2006 17:27:58
wkb была единственная
но Excel закрываться всеравно не хочет
NikP
Дата: 20.11.2006 17:38:21
к тому же в первом варианте
Set wkb = Nothing
не стоит, но Excell закрывается
Не закрывался, когда перед SaveAs стояло ActiveWindow
поменял на wkb стал закрываться без проблем
Alexander G
Дата: 21.11.2006 00:18:02
NikP

Sheets("Лист1").Select
Cells.Copy
ActiveSheet.Paste
'--------------------------------------------------------------------
Range(Selection, Selection.End(xlToRight)).Select

Так ссылаться нельзя.
должно быть
wkb.Sheets(....)
wkb.Cells.....
вместо ActiveSheet, ссылайтесь на лист прямо
set sht=wkb.Sheets(....)
sht.Range...
ггггггг
Дата: 21.11.2006 13:08:03
NikP
Бенедикт
NikP,
Cсылки на объектные типы прибей. "Невооружённым взглядом" видна по крайней мере одна: wkb. Set wkb = Nothing перед xlApp.Quit.

P.S. В Access-е есть достаточно мощные отчёты, ты в курсе?

Щас попробую
похоже именно в этом и проблема

про отчеты в курсе
а как ты их открывать будешь если у тебя Акса нет?
не задумывался

Вьюер есть специальный. А также отчеты достаточно просто переносятся в html файл.
natalitvinenko
Дата: 22.11.2006 10:13:20
ггггггг
Вьюер есть специальный. А также отчеты достаточно просто переносятся в html файл.

С вьюером мороки много, да и редактировать нельзя. Плавали :-(
NikP
Дата: 22.11.2006 18:47:23
2 Alexander G
все прописал не помогает
все так же не закрывается
Private Sub btn_Otchet_Click()
On Error GoTo Err_btn_Otchet_Click

    Dim xlApp As Object
    Dim wkb As Workbook
    Dim sht1 As Worksheet
    Dim sht2 As Worksheet

    Set xlApp = CreateObject("excel.application")
    Set wkb = xlApp.Workbooks.Add
    Set sht1 = wkb.Sheets("Лист1")
    Set sht2 = wkb.Sheets("Лист2")
    
    xlApp.Visible = True
        
    Manager = "((tbl_Zakaz.Manager_Zakaz)<>'" & Form_frm_Otchet.cb_Manager & "') AND "
    Manager = ""
    
    Set MyDb = CurrentDb
    MySQL = "SELECT q_Otchet.Grup_Grup, q_Otchet.Goods_Goods, q_Otchet.Ed_Goods, Sum(q_Otchet.Kolvo_Zakaz) AS Kolvo_Zakaz, Sum(q_Otchet.Ves) AS Ves" & _
            " FROM (SELECT tbl_Grup.ID_Grup, tbl_Grup.Grup_Grup, tbl_Goods.Goods_Goods, tbl_Goods.Ed_Goods, tbl_Zakaz.Kolvo_Zakaz, [Kolvo_Zakaz]*[Kr_Goods]/1000 AS Ves, tbl_Zavod.ID_Zavod" & _
            " FROM tbl_Zavod INNER JOIN (tbl_Grup INNER JOIN (tbl_Data INNER JOIN (tbl_Goods INNER JOIN tbl_Zakaz ON tbl_Goods.ID_Goods = tbl_Zakaz.Goods_Zakaz) ON tbl_Data.ID_Data = tbl_Zakaz.Data_Zakaz) ON tbl_Grup.ID_Grup = tbl_Goods.Grup_Goods) ON tbl_Zavod.ID_Zavod = tbl_Goods.Zavod_Goods" & _
            " WHERE (" & Manager & "((tbl_Data.Data_Data)=" & CLng(Form_frm_Zakaz.DataZakaz) & ") AND ((tbl_Zavod.ID_Zavod)=" & Form_frm_Zakaz.V_Zavod & "))) AS q_Otchet" & _
            " GROUP BY q_Otchet.Grup_Grup, q_Otchet.Goods_Goods, q_Otchet.Ed_Goods, q_Otchet.ID_Grup, q_Otchet.Goods_Goods" & _
            " ORDER BY q_Otchet.ID_Grup, q_Otchet.Goods_Goods"
    Set TestTable = MyDb.OpenRecordset(MySQL)
    TestTable.MoveLast
    If (TestTable.RecordCount > 0) Then
        TestTable.MoveFirst
' Вставка рекордсета
        MyRow = 2
        MyCol = 1
        sht1.Cells(MyRow, MyCol).CopyFromRecordset TestTable
' Вставка шапки(заголовков) рекордсета
        intFildCount = TestTable.Fields.Count - 1
        For intI = 0 To intFildCount
        sht1.Cells(MyRow - 1, intI + MyCol).Value = TestTable.Fields(intI).Name
        Next intI
    Else: MsgBox "Not Found"
    End If

    TestTable.Close
    MyDb.Close
    Set MyDb = Nothing


    GrupAr = Array("Ветчина", "в/к колбасы", "Вареные колбасы", "п/к колбасы", _
                    "с/к колбасы", "Колбаски", "Котлеты", "Пельмени", _
                    "м/к", "Паштет", "Ребра", "Сардельки", "Сервелат", "Сосиски", _
                    "Нарезки", "Хлеб", "Полуфабрикаты", "Изделия в желе", "Фарш")
'----------------------------------------------------------------------------------------
    wkb.Sheets("Лист1").Select
    sht1.Cells.Copy
    wkb.Sheets("Лист2").Select
    sht2.Cells.Select
    sht2.Paste
'--------------------------------------------------------------------
    sht2.Range(Selection, Selection.End(xlToRight)).Select
    sht2.Range(Selection, Selection.End(xlDown)).Select
    With Selection.Font
        .Name = "Arial"
        .Size = 10
        .Bold = False
        .ColorIndex = 0
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
    End With
''---------------------------------------------------------------------------------
    sht2.Range("A2").Select
    Selection.End(xlDown).Select
    EndRow = Selection.Cells.Row
    b = 0
    For i = 2 To EndRow
        For j = 0 To 18
            If sht2.Cells(i, 1) = GrupAr(j) And sht2.Cells(i, 1) <> sht2.Cells(i - 1, 1) Then
                sht2.Range(sht2.Cells(i + 2, 1), sht2.Cells(i + 2, 1)).Select
                b = b + 1
            End If
        Next j
    Next i
    
    For i = 2 To EndRow + b
        For j = 0 To 18
            If sht2.Cells(i, 1) = GrupAr(j) And sht2.Cells(i, 1) <> sht2.Cells(i - 1, 1) Then
                Gr = GrupAr(j)
                sht2.Cells(i, 1).EntireRow.Insert
                sht2.Cells(i, 2) = Gr
                sht2.Range(sht2.Cells(i, 2), sht2.Cells(i, 5)).Select
                Selection.Merge
                With Selection.Interior
                    .ColorIndex = 48
                    .Pattern = xlSolid
                End With
                With Selection.Font
                    .Name = "Arial"
                    .Size = 12
                    .Strikethrough = False
                    .Superscript = False
                    .Subscript = False
                    .OutlineFont = False
                    .Shadow = False
                    .Underline = xlUnderlineStyleNone
                    .ColorIndex = 55
                    .Bold = True
                End With
                sht2.Range(sht2.Cells(i + 2, 1), sht2.Cells(i + 2, 1)).Select
                i = 1 + i
            End If
        Next j
    Next i

    sht2.Range("A1").EntireColumn.Delete
    
    sht2.Range("A1") = "Товар"
    sht2.Range("B1") = "Ед."
    sht2.Range("C1") = "Кол-во"
    sht2.Range("D1") = "Кг"
    
    sht2.Range("A1").Select
    sht2.Range(Selection, Selection.End(xlToRight)).Select
    Selection.Font.Bold = True
    Selection.HorizontalAlignment = xlCenter
    
    sht2.Range(Selection, Selection.End(xlDown)).Select
''---------------------------------------------------------------------------------
    Selection.Columns.AutoFit
            
    Gran = Array(xlEdgeLeft, xlEdgeTop, xlEdgeBottom, xlEdgeRight, _
            xlInsideVertical, xlInsideHorizontal)
            
    For i = 0 To 5 Step 1
        With Selection.Borders(Gran(i))
            .LineStyle = 1
            If i > 3 Then
                .Weight = xlThin
            Else:
                .Weight = xlMedium
            End If
            .ColorIndex = xlAutomatic
        End With
    Next i
'---------------------------------------------------------------------------------
    sht2.Range("A1").Select
    Selection.End(xlDown).Select
    EndRow = Selection.Cells.Row
    sht2.Range(sht2.Cells(EndRow + 1, 4), sht2.Cells(EndRow + 1, 4)).Select
    sht2.Range("A1").Select
    Selection.EntireRow.Insert
    Selection.EntireRow.Insert
    Selection.EntireRow.Insert
'---------------------------------------------------------------------------------
    sht2.Range("A1").Select
    
    Set MyDb = CurrentDb
    MySQL = "SELECT [Zavod_Zavod] & ' тел:' & [Telephon] AS Zavod FROM tbl_Zavod WHERE (((tbl_Zavod.ID_Zavod)=" & Form_frm_Zakaz.V_Zavod & "))"
    Set TestTable = MyDb.OpenRecordset(MySQL)
    TestTable.MoveLast
    If (TestTable.RecordCount > 0) Then
        TestTable.MoveFirst
' Вставка рекордсета
        MyRow = 1
        MyCol = 1
        sht2.Cells(MyRow, MyCol).CopyFromRecordset TestTable
    Else: MsgBox "Not Found"
    End If

    TestTable.Close
    MyDb.Close
    Set MyDb = Nothing
    sht2.Range("A2") = "Заявка ИП Дружинин на " & Form_frm_Zakaz.DataZakaz

    wkb.SaveAs Filename:="D:\MyDB\Zakaz.xls", FileFormat:= _
        xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
        , CreateBackup:=False

    Set sht1 = Nothing
    Set sht2 = Nothing
    Set wkb = Nothing
    xlApp.Quit
    Set xlApp = Nothing

    MsgBox "Отчет готов"

Exit_btn_Otchet_Click:
    Exit Sub

Err_btn_Otchet_Click:
    MsgBox Err.Description
    Resume Exit_btn_Otchet_Click
    
End Sub