Excel not closing files

  • Remove From My Forums
  • Вопрос

  • I work on a network and sometimes move from building to buiding or work from home.  When I try to open files sometimes I get the message that the file is already opened by another user…but that isn’t true. I think excel is not closing my files down
    properly because the network still thinks they are open. Also, excel is taking 100% of processing space just to open a file, sometimes for a few seconds, sometimes more, but many times, excel won’t open because there is not enough space to open a small spreadsheet. 
    it’s been blamed on my spreadsheets and large spreadsheets, too many formulas, but it will blow up sometimes just opening a small file also. 

    Please help me fix this.  I have been making sure that I shut down when I go from one building to another or leave for home.  but I am till getting this message.  Once I have opened and  closed about 4 or 5 files, I know pretty soon it
    is going to deny being able to handle any more work.

  1. 04-11-2014, 11:49 AM


    #1

    ghost186 is offline


    Registered User


    Excel Workbook Not Closing If I Don’t Save

    Hello,

    The issue I am having is when I try to close a workbook (one of the several that are open) it prompts me to save — I click «Don’t Save» because I do not want to save the file. Then the file will not close. I can still close other excel files within that excel window without saving them and they close fine. It just so happens to not close one file every once in a while. I kill the excel.exe process in order to get rid of it. This is time consuming though because sometimes I have up to ten Excel files open and have to save those before killing the process. It doesn’t seem to matter if I’m working on the network or the local drive.

    I tried to run the command «taskkill /FI «WindowTitle eq Microsoft Excel — FILENAME» but it does not recognize the file name. I also tried to run the following VBscript as a .vbs file:

    > set WshShell = WScript.CreateObject(«WScript.Shell»)
    > WshShell.AppActivate «Microsoft Excel — FILENAME«
    > WScript.Sleep 1000
    > WshShell.SendKeys «^w»
    > WScript.Sleep 2500

    The .vbs file prompts to close the specified file but when I click «Don’t Save» it still won’t close. It doesn’t force-close the specified file. Is there a way to kill the one file without saving it while keeping the other excel files open? Any help or insight will be much appreciated!!


On one specific PC I get this behavior where closing a window won’t free the corresponding xls/xslx file.
I can see the temporary file and cannot delete the original. Only when all windows are closed excel frees all file resources at once.
This is true for network shares as well as local folders.

I’m looking for an explanation so I’ll be able to circumvent or fix the problem.

I’d rule out the antivirus (Kaspersky) because it is the same on all PCs and doesn’t have suspicious settings.

asked Dec 6, 2017 at 14:57

meh's user avatar

2

Turns out the user had installed a misbehaving program without authorization, possibly without even knowing.
Right now the problem seems solved.

answered Dec 7, 2017 at 11:08

meh's user avatar

  • Remove From My Forums
  • Question

  • I am creating a workbook using Transferspreadsheet in MS Access 2010 VBA  Running under Windows 7 Enterprise. I am removing the headings from the workbook and copying a new row of headings with specific formating from another workbook
    When I close the workbook in VBA and then try to open the workbook in Windows Explorer I get a message that the file is open. It is not clear what is causing the file to remain open. Here is my code:

    Private Sub cmdTemplate_Click()
        Dim varFile As Variant
        Dim strvarFile As String
        Dim strRange As String
        Dim strName As String
        Dim strNewCol As String
        Dim strLastCol As String
        Dim strRangeOrigCols As String
        Dim strRangeDestCols As String
        Dim strPath As String
        Dim strFullPath As String
        Dim xlApp As Excel.Application
        Dim xlWB1 As Excel.Workbook
        Dim xlWB2 As Excel.Workbook
        Dim wk1 As Worksheet
        Dim wk2 As Worksheet
        Dim rData As Range
        Dim rData1 As Range
        Dim rData2 As Range
        Dim intLastCol As Integer
        Dim intCol As Integer
        Dim lst As Long
        Dim lngColumn As Long
        Dim bolFiletoProcess As Boolean

        strPath = «J:ServiceMB EnrollmentENROLLMENTIREProd»
        strName = Dir(strPath, vbNormal)
        strFullPath = strPath & strName

        ‘turn off alerts for query verification
        DoCmd.Hourglass True
        DoCmd.SetWarnings False

        bolFiletoProcess = False

        Do While strName <> «»
            If strName <> «CMS Universe Templates.xls» Then
                Kill (strFullPath)
            End If
            strName = Dir
            strFullPath = strPath & strName

           
        Loop

       
         If IsNull(Me.txtFrom) Or IsNull(Me.txtTo) Then
            MsgBox «Please select a date range», vbOKOnly, «Queries»
            Me.txtFrom.SetFocus
        Else

           
            varFile = «J:ServiceMB EnrollmentENROLLMENTIREProdCMS Universe Template_» & Format(Date, «mmddyyyy»)

           
            DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, _
                    «qryCMSUniverseTemplate», varFile

           
            strvarFile = varFile & «.XLS»
            ‘Open workbook that was the results of Transferspreadsheet
            Set xlWB1 = Workbooks.Open(strvarFile, , False)

          
           Set wk1 = xlWB1.Worksheets(«qryCMSUniverseTemplate»)

          
           wk1.Activate
           strName = ActiveSheet.Name
           Rows(«1:1»).Select
           strName = ActiveSheet.Name
           intLastCol = xlLastCol(strName)
           strLastCol = ColumnNumberToLetter(intLastCol)
           ‘Delete current headings
           Selection.Delete Shift:=xlUp
           ‘Insert new line for headings from CMS Universe Template
           Rows(«1:1»).Select
           Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

          
           Set rData1 = xlWB1.Sheets(«qryCMSUniverseTemplate»).Range(«A1:AH1»)

          
          ‘Open CMS Universe Templates that has column headings
           Set xlWB2 = Workbooks.Open(«J:ServiceMB EnrollmentENROLLMENTGAugustIRE DatabaseDevelopmentCMS Universe Templates.xls», , False)

          
          
           Set wk2 = xlWB2.Worksheets(«IRE»)
           wk2.Activate

          
           For intCol = 1 To intLastCol
                strNewCol = ColumnNumberToLetter(intCol)
                strRangeOrigCols = strNewCol & «2» & «:» & strNewCol & «2»
                strRangeDestCols = strNewCol & «1» & «:» & strNewCol & «1»
                xlWB2.Worksheets(«IRE»).Range(strRangeOrigCols).Copy _
                    Destination:=xlWB1.Worksheets(«qryCMSUniverseTemplate»).Range(strRangeDestCols)
           Next intCol

          
           DoEvents

          
           xlWB2.Close

          
           Set xlWB2 = Nothing

          
           wk1.Activate
           xlWB1.Save
           xlWB1.Close

         
           Set xlWB1 = Nothing

          
           MsgBox «Done», vbOKOnly, «Create Template»

     
        End If

       
        DoCmd.Hourglass False
        DoCmd.SetWarnings True

       
       
    End Sub

Answers

  • Hi gaugust,

    Please try to close Excel calling the
    Quit method of the Application class from the Excel object model. Does it help?

    • Marked as answer by

      Thursday, January 23, 2014 11:56 AM

  • You never created nor referenced an instance of the Excel application — though you declared a variable for it — so an Excel instance was created behind the scenes, and that is remaining open.  In general, when automating Excel, you need to qualify
    *every* object reference, or you will often get this problem.  Write it like this:

    Set xlApp = New Excel.Application 'Open workbook that was the results of Transferspreadsheet Set xlWB1 = xlApp.Workbooks.Open(strvarFile, , False) Set wk1 = xlWB1.Worksheets("qryCMSUniverseTemplate") wk1.Activate strName = xlApp.ActiveSheet.Name xlApp.Rows("1:1").Select strName = xlApp.ActiveSheet.Name intLastCol = xlLastCol(strName) strLastCol = ColumnNumberToLetter(intLastCol) 'Delete current headings xlApp.Selection.Delete Shift:=xlUp 'Insert new line for headings from CMS Universe Template xlApp.Rows("1:1").Select xlApp.Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Set rData1 = xlWB1.Sheets("qryCMSUniverseTemplate").Range("A1:AH1") 'Open CMS Universe Templates that has column headings Set xlWB2 = xlApp.Workbooks.Open("J:ServiceMB EnrollmentENROLLMENTGAugustIRE DatabaseDevelopmentCMS Universe Templates.xls", , False) Set wk2 = xlWB2.Worksheets("IRE") wk2.Activate For intCol = 1 To intLastCol strNewCol = ColumnNumberToLetter(intCol) strRangeOrigCols = strNewCol & "2" & ":" & strNewCol & "2" strRangeDestCols = strNewCol & "1" & ":" & strNewCol & "1" xlWB2.Worksheets("IRE").Range(strRangeOrigCols).Copy _ Destination:=xlWB1.Worksheets("qryCMSUniverseTemplate").Range(strRangeDestCols) Next intCol DoEvents xlWB2.Close Set xlWB2 = Nothing wk1.Activate xlWB1.Save xlWB1.Close Set xlWB1 = Nothing xlApp.Quit

    Set xlApp = Nothing

    I may have overlooked some references, and I don’t know what’s happening in the functions you call, but I trust you get the idea.


    Dirk Goldgar, MS Access MVP
    Access tips: www.datagnostics.com/tips.html

    • Marked as answer by
      Luna Zhang — MSFT
      Thursday, January 23, 2014 11:55 AM

 

Badamyan

Пользователь

Сообщений: 72
Регистрация: 21.07.2016

#1

21.07.2016 14:40:19

Код
Sub All_in_one()
    
For Each x In Application.GetOpenFilename(filefilter:="all excel files, *.xl*", Title:="select files to open", MultiSelect:=True)
Workbooks.Open x     
        For Each c In Sheets
            y = Workbooks("All.xlsm").Sheets.Count
               If c.Name <> "MS-Excel" Then
               c.Copy after:=Workbooks("All.xlsm").Sheets(y)
            End If            
        Next c
Workbooks.Close x
Next x

End Sub

Изменено: Badamyan21.07.2016 15:08:59

 

Badamyan,
И о чём говорит название темы? Нормальное название предложите.

И в чём, собственно, вопрос?

Изменено: РОБОТ_РОБИН21.07.2016 14:45:58

 

Badamyan

Пользователь

Сообщений: 72
Регистрация: 21.07.2016

простите я впервые в этом форуме
VBA, с помощью цикла открываю несколько файлов, но потом не могу их закрыть, что пишу не так
Workbooks.Close x  вот это строка не работает, как написать

 

Ts.Soft

Пользователь

Сообщений: 576
Регистрация: 13.04.2016

#4

21.07.2016 14:56:54

Попробуйте так:

Код
Workbooks(x).Close

Не стреляйте в тапера — он играет как может.

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#5

21.07.2016 14:59:25

Цитата
Badamyan написал:
простите я впервые в этом форуме

Ну а нормальное название сформулировать это разве мешает? VBA — и что?
Название исправил, а в следующий раз сами думайте над формулировками.
Ещё момент: код следует оформлять соответствующим тегом. Ищите такую кнопку и исправьте своё сообщение.
И не нужно столько пустых строк.
Спасибо!

Прикрепленные файлы

  • Тег VBA.jpg (19.2 КБ)

 

Badamyan

Пользователь

Сообщений: 72
Регистрация: 21.07.2016

#6

21.07.2016 15:02:15

окей Юрий, спасибо
так тоже пробовал, не работает

Код
Workbooks(x).Close 

Изменено: Badamyan21.07.2016 15:04:53

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#7

21.07.2016 15:08:00

Не исправили стартовое сообщение…
В общем случае можно так:

Код
ActiveWorkbook.Close
 

Badamyan

Пользователь

Сообщений: 72
Регистрация: 21.07.2016

Юрий так тоже не будет работать, активным считаеться тот файл в котором работает макрос, при таком коде он и будет закрываться

Изменено: Badamyan21.07.2016 15:12:25

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

#9

21.07.2016 15:18:55

Цитата
Badamyan написал:
тот файл в котором работает макрос

это вообще может быть любой файл…
А сразу после открытия файл активен — вот тут его сразу можно… и закрыть :)
Вообще удобнее делать так:

Код
set wb=workbooks.open(x)

Тогда всегда с этим wb можно делать что угодно.

 

Ts.Soft

Пользователь

Сообщений: 576
Регистрация: 13.04.2016

#10

21.07.2016 15:19:28

Цитата
Badamyan написал:
активным считаеться тот файл в котором работает макрос

Нет, активным считается именно активный файл, а тот в котором работает макрос называется ThisWorkbook

Не стреляйте в тапера — он играет как может.

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#11

21.07.2016 15:19:34

Цитата
Badamyan написал:
активным считаеться тот файл в котором работает макрос

Проверяли?

 

Badamyan

Пользователь

Сообщений: 72
Регистрация: 21.07.2016

Hugo,Огромное спасибо ) сработал  

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Тот в котором содержится макрос называется ThisWorkbook.
А работать он может в любой другой книге, ну смотря что понимать над «работать» — я понимаю как «делать работу».

 

Badamyan

Пользователь

Сообщений: 72
Регистрация: 21.07.2016

Юрий М,да, но не сработал, закрывает тот файл в котором макрос

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

У меня сработал.
И обратите внимание на #10 и #13 — там пишут то же самое: что является ActiveWorkbook

 

Ts.Soft

Пользователь

Сообщений: 576
Регистрация: 13.04.2016

#16

21.07.2016 15:34:21

Сейчас проверил код:

Код
Sub nnn()
    x = "Книга2.xlsx"
    Workbooks.Open x
    Workbooks(x).Close
End Sub

работает
а код

Код
Sub nnn1()
    For Each x In Application.GetOpenFilename(filefilter:="all excel files, *.xl*", Title:="select files to open", MultiSelect:=True)
        Workbooks.Open x
        Workbooks(x).Close
    Next x
End Sub

даёт ошибку Subscript out of range. Получается, что x не является объектом Workbook?

Не стреляйте в тапера — он играет как может.

 

The_Prist

Пользователь

Сообщений: 14181
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#17

21.07.2016 15:35:38

Цитата
Ts.Soft написал:
Получается, что x не является объектом Workbook?

нет. Получается что в x содержится полный путь до книги, а не только её имя, как того требует коллекция Workbooks.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Ts.Soft

Пользователь

Сообщений: 576
Регистрация: 13.04.2016

The_Prist, спасибо. Учту на будущее.

Не стреляйте в тапера — он играет как может.

 

Badamyan

Пользователь

Сообщений: 72
Регистрация: 21.07.2016

Юрий М, получился и по вашему, наверника запустил макрос не с правильного файла
Всем огромное спасибо

 

Badamyan

Пользователь

Сообщений: 72
Регистрация: 21.07.2016

The_Prist,а как получить только имя ?
может с right ? взять символы до последнего

 

Ts.Soft

Пользователь

Сообщений: 576
Регистрация: 13.04.2016

#21

21.07.2016 15:51:24

Цитата
Badamyan написал:
как получить только имя ?

можно так

Код
Workbooks(Mid(x, InStrRev(x, "") + 1)).Close

Проверил — работает

Изменено: Ts.Soft21.07.2016 15:53:53

Не стреляйте в тапера — он играет как может.

 

Badamyan

Пользователь

Сообщений: 72
Регистрация: 21.07.2016

Ts.Soft,а что делает InStrRev ? находит в X ? ведь в нем несколько -ов
простите я новичок, может задам уж слишком примитивные вопросы, да еще и не Русский, прощу прощение за свой Русский

Изменено: Badamyan21.07.2016 15:55:16

 

Мотя

Пользователь

Сообщений: 3218
Регистрация: 25.12.2012

#23

21.07.2016 15:57:17

Код
Sub xxx()  ' всегда работает безотказно
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim Katal As Variant

Katal = GetFolderPath("Укажите каталог с файлами", ThisWorkbook.Path)

If Katal <> "" Then

Dim FS, KATALOG, FILE, MASSIV As Object
Set FS = CreateObject("Scripting.FileSystemObject")
Set KATALOG = FS.GetFolder(Katal)
Set MASSIV = KATALOG.Files

For Each FILE In MASSIV
    Workbooks.Open Filename:=FILE

'например, всяческие действия в основной книге

    Windows(Dir(FILE)).Activate
    ActiveWindow.Close
Next

    MsgBox "ГОТОВО"
Else
    MsgBox "Каталог не выбран"
End If
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
Function GetFolderPath(Optional ByVal Title As String = "Выберите папку", _
                       Optional ByVal InitialPath As String = "c:") As String
    Dim PS As String: PS = Application.PathSeparator
    With Application.FileDialog(msoFileDialogFolderPicker)
        If Not Right$(InitialPath, 1) = PS Then InitialPath = InitialPath & PS
        .ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
        If .Show <> -1 Then Exit Function
        GetFolderPath = .SelectedItems(1)
        If Not Right$(GetFolderPath, 1) = PS Then GetFolderPath = GetFolderPath & PS
    End With
End Function

Изменено: Мотя21.07.2016 16:03:02

 

The_Prist

Пользователь

Сообщений: 14181
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#24

21.07.2016 15:57:22

Цитата
Badamyan написал:
как получить только имя ?
Код
workbooks(Dir(x,16)).close 0

но лучше использовать метод Hugo — надежнее.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Ts.Soft

Пользователь

Сообщений: 576
Регистрация: 13.04.2016

Badamyan, InStrRev ищет заданный символ с конца строки, но возвращает порядковый номер от начала, т.е. в данном случае находит последний «», к его номеру добавляется единица и с этой позиции до конца выделяется подстрока

Не стреляйте в тапера — он играет как может.

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#26

21.07.2016 17:57:31

Цитата
Badamyan написал:
как получить только имя ?

Вариант:

Код
        Next c
        n = Split(x, "")(UBound(Split(x, "")))
        Workbooks(n).Close
 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

#27

21.07.2016 19:26:56

Зачем всё усложнять?
Попробуйте:

Код
Sub All_in_one()
    Dim x, wb As Workbook, c As Worksheet

    Application.ScreenUpdating = False

    For Each x In Application.GetOpenFilename(filefilter:="all excel files, *.xl*", Title:="select files to open", MultiSelect:=True)
        Set wb = Workbooks.Open(x)
        For Each c In wb.Worksheets
            If c.Name <> "MS-Excel" Then
                With Workbooks("All.xlsm")
                    c.Copy after:=.Sheets(.Sheets.Count)
                End With
            End If
        Next c
        wb.Close 0
    Next x

    Application.ScreenUpdating = True

End Sub

Like this post? Please share to your friends:
  • Excel not calculating sum
  • Excel norm inv на русском
  • Excel no ipad mini
  • Excel no formula results
  • Excel new activexobject excel application