Файл уже используется excel vba

 

При открытии файла я сам макросом обрабатываю ситуацию, когда файл уже используется. Мне не нужно уведомление Excel «Файл уже используется».
Application.DisplayAlert = False в Workbook_Open не помогает.
Как убрать уведомление Excel?

 

New

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

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

#2

21.09.2020 11:33:41

Может так поможет

Код
Set TempWb = Workbooks.Open(Filename:="C:Excel.xlsx", ReadOnly:=True)

Изменено: New21.09.2020 11:34:33

 

Дмитрий(The_Prist) Щербаков

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

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

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

#3

21.09.2020 11:45:20

Цитата
Кирилл Найдёнов написал:
я сам макросом обрабатываю ситуацию, когда файл уже используется

как именно Вы это делаете? Файл на сетевом диске?

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

 

sokol92

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

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

Открывайте файл макросом.

Событие

Workbook.Open

возникает после того, как файл открыт.

 

Кирилл Найдёнов

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

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

#5

23.09.2020 15:13:33

Цитата
Дмитрий(The_Prist) Щербаков написал:
как именно Вы это делаете? Файл на сетевом диске?

Да, файл на сетевом диске.

Цитата
sokol92 написал:
Событие  Workbook.Open  возникает после того, как файл открыт.

Тогда какое событие можно взять, что бы оно возникало до появления этой надписи?

Смысл такой: разные пользователи могут открыть файл (не макросом, просто из Проводника) — если файл занят, то нужно видеть кто именно его взял. Стандартное оповешение Excel не подхидит, т.к. часто пишет «другой пользователь». Я при открытии для редактирования записываю в текстовый файл информацию кто открыл и когда (благо при открытии имя пользователя Excel определяет правильно).
Пользователям чаще нужно открывать файл в режиме для чтения. Кнопки переоткрытия в режиме чтения я давно сделал, они висят на верхней панели, но люди ленятся. Поэтому теперь при открытии возникает большая форма с выбором: «для чтения / для записи», и стандартное окно о том, что файл занят не нужно — мой макрос показывает в каком режиме можно открыть, и кто занял файл.
Нужно вообще избавиться от уведомления при открытии.

 

Дмитрий(The_Prist) Щербаков

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

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

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

#6

23.09.2020 16:02:44

Цитата
Кирилл Найдёнов написал:
нужно видеть кто именно его взял

это сложно. Даже сам Excel часто не может определить этого.
Ну и опять же чтобы помочь надо понять, как Вы обрабатываете ситуацию, когда файл уже открыт? Как это выглядит, чем не подходит? Я уже спрашивал, но ответ был только на второй вопрос: где файл.

Цитата
Кирилл Найдёнов написал:
Кнопки переоткрытия в режиме чтения я давно сделал

если можете определить, что файл уже кто-то открыл — смысла в этой кнопке нет, можно открывать в зависимости от этого знания. Если уже открыт — открывать на чтение. Если нет — на запись.

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

 

sokol92

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

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

#7

23.09.2020 19:56:13

Цитата
Кирилл Найдёнов написал:
Тогда какое событие можно взять, что бы оно возникало до появления этой надписи?

Перечень событий объекта Application приведен

здесь

. События типа «WorkbookBeforeOpen» в нем нет.

Владимир

 

Ігор Гончаренко

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

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

#8

23.09.2020 20:04:52

Цитата
Кирилл Найдёнов написал:
Как избавиться от предупреждения «Файл уже используется», При открытии файла

закрыть уже используемый файл перед открытием нового

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Кирилл Найдёнов

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

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

#9

28.09.2020 11:05:19

Цитата
Дмитрий(The_Prist) Щербаков написал: …как Вы обрабатываете ситуацию, когда файл уже открыт? Как это выглядит, чем не подходит?

Я обрабатываю в Workbook.Open: если файл открывается для редактирования — я вывожу форму где есть выбор «Открыть для редактирования / Для чтения».
При нажатии «Для редактирвования» — во внешний текстовый файл записывается имя текущего пользователя.
При нажатии «Для чтение» — меняю режим на «для чтения».
Если файл сразу открыт для чтения (т.е. его кто-то уже занял) — я вывожу информацию о том, кто именно его занял.
.
Зачем это нужно: 1) пользователям чаще нужен файл для чтения — теперь они сразу могут выбрать такой режим (раньше я делал кнопку «Открыть в режиме для чтения» — но на неё ленились нажимать), 2) Excel часто писал «открыт другим пользователем», а нужно знать кто именно открыл.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
Function IsOpen(File$) As Boolean
 Dim FN%
 FN = FreeFile
 On Error Resume Next
 Open File For Random Access Read Write Lock Read Write As #FN
Close #FN
 IsOpen = Err
End Function
 
Sub Test()
 Debug.Print IsOpen("....xlsx")
End Sub
 
Sub Get_All_File_from1()
 
 
'убрать окно с  ПредупреждениеОКонфиденциальнойИнформации
ActiveWorkbook.RemovePersonalInformation = 0
If ActiveWorkbook.RemovePersonalInformation Then
    ActiveWorkbook.RemovePersonalInformation = False
End If
 'Отключаем обновление экрана, чтобы наши действия не мелькали
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.DisplayStatusBar = False
    Application.DisplayAlerts = False
 
    
    Dim sFolder As String, sFiles As String, m As Range, s As Integer, i As Integer, wbReturn As Workbook, rFiles As String
'    Адрес папки, где все файлы сотрудников
    sFolder = "..."
    
    sFiles = Dir(sFolder & "*.xlsx")
    
    rFiles = sFolder & sFiles
    
    
    Do While sFiles <> ""
    
    If IsOpen(rFiles) = False Then
    
            'открываем книги сотрудников
            Workbooks.Open sFolder & sFiles
            n = ActiveWorkbook.Name
            'действия с файлом
            ActiveWorkbook.Sheets(1).Select
            
        If Not IsEmpty(Range("A2")) Then
                FinalRow = Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
                FinalColumn = Sheets(1).Cells(1, Columns.Count).End(xlToLeft).Column
                Sheets(1).Range(Sheets(1).Cells(2, 1), Sheets(1).Cells(FinalRow, FinalColumn)).Copy
        
            'Активация книги "..."
            Workbooks("....xlsm").Worksheets("...").Activate
            'Определение следующей пустой строки в файле "..."
            NextRow = Application.WorksheetFunction.CountA(Range("A:A")) + 1
            Rows(NextRow).Select
                    ActiveSheet.Paste
                    
            ' Активация листа"
            Worksheets("...").Activate
            'Определение следующей пустой строки в файле "..."
            NextRow = Application.WorksheetFunction.CountA(Range("A:A")) + 1
            Rows(NextRow).Select
                    ActiveSheet.Paste
                    Application.CutCopyMode = False
                    
            'Переход к активной книге сотрудников и удаление добавленных строк
            Workbooks(n).Activate
            ActiveWorkbook.Sheets(1).Select
            Sheets(1).Range(Sheets(1).Cells(2, 1), Sheets(1).Cells(FinalRow, FinalColumn)).Select
            Selection.Delete
            'Закрытие файлов сотрудников и сохранение
            ActiveWorkbook.Save
            ActiveWorkbook.Close
        
    Else: ActiveWorkbook.Close
 
    End If
    
End If
 
        sFiles = Dir
    Loop
    
'   Удаление записей по меткам
 
Workbooks("....xlsm").Worksheets("...").Activate
 
i = 1
 
    Do While Cells(i, 1) <> Empty
        If (Cells(i, 9).Value) Like "*новое время*" Or (Cells(i, 9).Value) Like "*последний перезвон*" Then
'            MsgBox Cells(i, 1).Value
            If (Cells(i, 9).Value) Like "*новое время*" Then a1 = Cells(i, 1).Value
            If (Cells(i, 9).Value) Like "*последний перезвон*" Then a2 = Cells(i, 1).Value
        End If
 
            b = 1
            Do While Cells(b, 1) <> Empty
 
                If (Cells(b, 1).Value) = a1 And Not (Cells(b, 9).Value) Like "*новое время*" And Not (Cells(b, 9).Value) Like "*последний перезвон*" Then
                    Rows(b).Delete
                    b = b - 1
                End If
                
                If (Cells(b, 1).Value) = a2 Then
                    Rows(b).Delete
                    b = b - 1
                End If
 
            b = b + 1
            Loop
 
    i = i + 1
    Loop
'
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.DisplayStatusBar = True
    Application.DisplayAlerts = True
 
    Workbooks("....xlsm").Close True 'Если поставить False - книга будет закрыта без сохранения
    
End Sub
  • Remove From My Forums

 none

«файл уже используется», редактирование запрещено пользователем «другой пользователь»

  • Вопрос

  • Доброго дня!

    MS Office 2010 Pro Plus x86. 14.0.66123.5001.

    Файл открывается с сетевого диска. Файл ни у кого не открыт, доступ в папку имеет только один пользователь.

    Кто нибудь сталкивался с подобным?

Ответы

  • На файловом сервере стоит kaspersky endpoint 8. Отключать антивирус либо добавлять в доверенною зону не спасает.

    По поводу пересоздания файла — отличная мысль! Однако, как можно перенести данные из одного фала в другой, не перенося лишние метаданные? Такой вариант возможен или это маловероятно?

    *добавлено*

    Есть ли смысл использовать libre office для чистоты эксперимента?

    *решение*

    в процессе обработки данных файлов через open /libre/ office — вылезла куча косяков. Косяки исправились, файлы стали открываться без ошибок.

    • Изменено

      14 декабря 2012 г. 8:53
      решено.

    • Помечено в качестве ответа
      NEX Vi
      14 декабря 2012 г. 8:53

Function IsOpen(File$) As Boolean
 Dim FN%
 FN = FreeFile
 On Error Resume Next
 Open File For Random Access Read Write Lock Read Write As #FN
Close #FN
 IsOpen = Err
End Function
 
Sub Test()
 Debug.Print IsOpen("....xlsx")
End Sub
 
Sub Get_All_File_from1()
 
 
'убрать окно с  ПредупреждениеОКонфиденциальнойИнформации
ActiveWorkbook.RemovePersonalInformation = 0
If ActiveWorkbook.RemovePersonalInformation Then
    ActiveWorkbook.RemovePersonalInformation = False
End If
 'Отключаем обновление экрана, чтобы наши действия не мелькали
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.DisplayStatusBar = False
    Application.DisplayAlerts = False
 
    
    Dim sFolder As String, sFiles As String, m As Range, s As Integer, i As Integer, wbReturn As Workbook, rFiles As String
'    Адрес папки, где все файлы сотрудников
    sFolder = "..."
    
    sFiles = Dir(sFolder & "*.xlsx")
    
    rFiles = sFolder & sFiles
    
    
    Do While sFiles <> ""
    
    If IsOpen(rFiles) = False Then
    
            'открываем книги сотрудников
            Workbooks.Open sFolder & sFiles
            n = ActiveWorkbook.Name
            'действия с файлом
            ActiveWorkbook.Sheets(1).Select
            
        If Not IsEmpty(Range("A2")) Then
                FinalRow = Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
                FinalColumn = Sheets(1).Cells(1, Columns.Count).End(xlToLeft).Column
                Sheets(1).Range(Sheets(1).Cells(2, 1), Sheets(1).Cells(FinalRow, FinalColumn)).Copy
        
            'Активация книги "..."
            Workbooks("....xlsm").Worksheets("...").Activate
            'Определение следующей пустой строки в файле "..."
            NextRow = Application.WorksheetFunction.CountA(Range("A:A")) + 1
            Rows(NextRow).Select
                    ActiveSheet.Paste
                    
            ' Активация листа"
            Worksheets("...").Activate
            'Определение следующей пустой строки в файле "..."
            NextRow = Application.WorksheetFunction.CountA(Range("A:A")) + 1
            Rows(NextRow).Select
                    ActiveSheet.Paste
                    Application.CutCopyMode = False
                    
            'Переход к активной книге сотрудников и удаление добавленных строк
            Workbooks(n).Activate
            ActiveWorkbook.Sheets(1).Select
            Sheets(1).Range(Sheets(1).Cells(2, 1), Sheets(1).Cells(FinalRow, FinalColumn)).Select
            Selection.Delete
            'Закрытие файлов сотрудников и сохранение
            ActiveWorkbook.Save
            ActiveWorkbook.Close
        
    Else: ActiveWorkbook.Close
 
    End If
    
End If
 
        sFiles = Dir
    Loop
    
'   Удаление записей по меткам
 
Workbooks("....xlsm").Worksheets("...").Activate
 
i = 1
 
    Do While Cells(i, 1) <> Empty
        If (Cells(i, 9).Value) Like "*новое время*" Or (Cells(i, 9).Value) Like "*последний перезвон*" Then
'            MsgBox Cells(i, 1).Value
            If (Cells(i, 9).Value) Like "*новое время*" Then a1 = Cells(i, 1).Value
            If (Cells(i, 9).Value) Like "*последний перезвон*" Then a2 = Cells(i, 1).Value
        End If
 
            b = 1
            Do While Cells(b, 1) <> Empty
 
                If (Cells(b, 1).Value) = a1 And Not (Cells(b, 9).Value) Like "*новое время*" And Not (Cells(b, 9).Value) Like "*последний перезвон*" Then
                    Rows(b).Delete
                    b = b - 1
                End If
                
                If (Cells(b, 1).Value) = a2 Then
                    Rows(b).Delete
                    b = b - 1
                End If
 
            b = b + 1
            Loop
 
    i = i + 1
    Loop
'
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.DisplayStatusBar = True
    Application.DisplayAlerts = True
 
    Workbooks("....xlsm").Close True 'Если поставить False - книга будет закрыта без сохранения
    
End Sub

Повторное открытие одного и того же файла Word

Dмитрий

Дата: Вторник, 01.04.2014, 23:30 |
Сообщение № 1

Группа: Пользователи

Ранг: Участник

Сообщений: 91


Репутация:

9

±

Замечаний:
40% ±


Excel 2010

Всем добрый вечер. Можно ли как-то запретить открытие одного и того же файла несколько раз. Событие обрабатывается по кнопке. Если открываю разные файлы, то все в порядке, проблема — если файл тот же. Хотел сделать, чтобы при попытке повторного открытия выскакивало сообщение, что-то типа: Файл уже открыт! и т.д. Так у меня получается ошибка: «Файл уже используется!»/ Пробовал не запрещать открытие, а просто открывать в новом окне — тоже неудача.
[vba]

Код

Dim strFileName As String
   Dim strFile As String
    ‘ Имя и путь  файла
    strFile = «» & Cells(r3, 25) & «.doc»
    strFileName = «E:ДОГОВОР» & Cells(r3, 23) & «» & Cells(r3, 25) & «.doc»
    ‘ Проверяю (наверное правильно)
    If Dir(strFileName) <> «» Then ‘ найден
    Dim objWrdApp As Object, objWrdDoc As Object
      ‘ пробовал так  
     If objWrdApp Is Nothing Then
         Set objWrdApp = CreateObject(«Word.application»)
End If  
     objWrdApp.Visible = True
   ‘ и так  
     ‘If objWrdDoc Is Nothing Then
  Set objWrdDoc = objWrdApp.Documents.Open(«E:ДОГОВОР» & Cells(r3, 23) & «» & Cells(r3, 25) & «.doc») ‘откр. документ Word
   ‘End If
Set objWrdDoc = Nothing: Set objWrdApp = Nothing

[/vba]

 

Ответить

doober

Дата: Среда, 02.04.2014, 02:10 |
Сообщение № 2

Группа: Друзья

Ранг: Ветеран

Сообщений: 913


Репутация:

317

±

Замечаний:
0% ±


Excel 2010

Так должно правильно работать
[vba]

Код

Dim strFileName As String
          Dim strFile As String
          ‘ Имя и путь  файла
          strFile = «» & Cells(r3, 25) & «.doc»
          strFileName = «E:ДОГОВОР» & Cells(r3, 23) & «» & Cells(r3, 25) & «.doc»
          ‘ Проверяю (наверное правильно)
          If Dir(strFileName) <> «» Then    ‘ найден
              Dim objWrdApp As Object, objWrdDoc As Object
              ‘ пробовал так
              If objWrdApp Is Nothing Then
                  Set objWrdApp = CreateObject(«Word.application»)
              End If
              objWrdApp.Visible = True
              ‘ и так
              ‘If objWrdDoc Is Nothing Then
              strFileName = «E:ДОГОВОР» & Cells(r3, 23) & «» & Cells(r3, 25) & «.doc»

              For Each d In objWrdApp.Windows’   Внес изменения
                  If d.Document.FullName = strFileName Then
                      Set objWrdDoc = d.Document: GoTo Дальше
                  End If
              Next
              Set objWrdDoc = objWrdApp.Documents.Open(«E:ДОГОВОР» & Cells(r3, 23) & «» & Cells(r3, 25) & «.doc»)    ‘откр. документ Word
Дальше:

              ‘End If
              Set objWrdDoc = Nothing: Set objWrdApp = Nothing

[/vba]

Забыл,что работа не в ворде идет

 For Each d In objWrdApp.Windows’ Внес изменения


Сообщение отредактировал dooberСреда, 02.04.2014, 02:23

 

Ответить

Dмитрий

Дата: Среда, 02.04.2014, 09:26 |
Сообщение № 3

Группа: Пользователи

Ранг: Участник

Сообщений: 91


Репутация:

9

±

Замечаний:
40% ±


Excel 2010

Всем Доброе утро!!!
Уважаемый doober, так в принципе тоже самое. Упорно пытается открыть уже открытый файл.
[vba]

Код

  If Dir(strFileName1) <> «» Then ‘ найден
       Dim objWrdApp As Object, objWrdDoc As Object       
        If objWrdApp Is Nothing Then
Set objWrdApp = CreateObject(«Word.application»)
End If      
        objWrdApp.Visible = True           
        For Each d In objWrdApp.Windows
                    If d.Document.FullName = strFileName Then
                        Set objWrdDoc = d.Document: GoTo Дальше
                    End If
                Next     
     Set objWrdDoc = objWrdApp.Documents.Open(«E:ДОГОВОР» & Cells(r3, 23) & «» & Cells(r3, 25) & «.doc»)
Дальше:
Set objWrdDoc = Nothing: Set objWrdApp = Nothing
Else
Beep
MsgBox «Файл поврежден либо отсутствует!!!», vbInformation
End If

[/vba]
Ругается на строку:

Цитата

Set objWrdDoc = objWrdApp.Documents.Open(«E:ДОГОВОР» & Cells(r3, 23) & «» & Cells(r3, 25) & «.doc»)

Ошибка Error 462. Может я что-то не так сделал

Сообщение отредактировал DмитрийСреда, 02.04.2014, 09:31

 

Ответить

anvg

Дата: Среда, 02.04.2014, 09:56 |
Сообщение № 4

Группа: Друзья

Ранг: Ветеран

Сообщений: 581


Репутация:

271

±

Замечаний:
0% ±


2016, 365

Доброе время суток
Может проще получать ссылку на документ так?

Код

Set objWrdDoc = GetObject(«E:ДОГОВОР» & Cells(r3, 23) & «» & Cells(r3, 25) & «.doc»)

Если файл открыт — вернёт ссылку на открытый, иначе откроет.

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Файл текстового редактора word это документ
  • Файл текстового редактора word называется
  • Файл текстового процессора word по умолчанию называется
  • Файл табуляция в excel это
  • Файл табличного процессора excel называется