Страницы: 1
RSS
Совместный доступ. Проверка ячейки перед записью.
 
Уважаемые программисты. Прошу простить, если тема где-то обсуждалась, но из того, что откопал, ответа не нашел.
В книге несколько листов.  на каждом некоторый список. (хронология событий).
Для добавления новой записи используется макрос, который ищет последнюю заполненную ячейку на листе, и на следующей строке вносит первоначальные реквизиты записи, (дата, имя пользователя и т.п.) ставит курсор в нужную ячейку и пользователь заполняет данные.

Есть желание организовать общий доступ двум пользователям, но если у них одновременно появится желание внести запись на один и тот же лист, думаю будет конфликт.
Какой способ вы можете посоветовать, что бы избежать конфликтных записей?

Рассматривал такой способ:
1.Если при добавлении новой записи, когда макрос внесет первоначальные записи, сразу же сохранить книгу? На это конечно понадобится какое-то время, но тем не менее, запись уже будет записана в документ.
2.Можно ли второму пользователю пред новой записью как-то обновить данные на предмет, не появилось ли что в книге. Как это сделать?
3. Можно ли макросом отследить сколько пользователей работают с книгой. Если больше одного, тогда  выполнять п.1 и п.2.  
 
Лучше дать (сказать) каждому пользователю свой диапазон. Ты заполняешь Лист А, а ты заполняешь Лист Б или Ты заполняешь столбец А, а ты заполняешь столбец В.

P.S. Вы знаете сколько ограничений у Excel файла появится, если включить общий доступ? Почитайте, например, тут https://exceltable.com/vozmojnosti-excel/sovmestnyi-dostup-k-failu-excel

Если только вот так https://support.microsoft.com/ru-ru/office/%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0-%d1%81-%d0%b4%d0%b0%...
Изменено: New - 24.01.2021 00:43:55
 
Через интернет тут не подходит. Обособленная сеть предприятия.
По идее не должно так совпасть что бы оба пользователя одновременно обратились к одному и тому же листу, но это не исключено.
При редактировании разных листов, такого конфликта не возникнет.

А если вот так?
Перед созданием новой записи, проверяем рядом лежащий текстовый файл.
Если в нем не содержится ссылки на этот же лист в эту же ячейку, то переписываем его и вносим ссылку на этот лист и эту ячейку, далее создаем новую запись.
Если макрос натыкается на то, что адреса совпадают, значит кто-то уже редактирует эту ячейку,
Создаем запись на следующей строке и обновляем ссылку в текстовом файле.

TXT быстро открывается, пользователь не заметит задержек перед проверкой
 
Mizar, максимально возможное разработчик уже за вас сделал, но вы хотите онлайн совместную работу и тут только один путь, использование инструментов для этого предназначенных.
По вопросам из тем форума, личку не читаю.
 
Сделал через текстовый файл.
Работает быстро, и незаметно для пользователей.
У меня вопрос. Как обновить данные таблицы без диалоговых окон.
Нужно принять все сохранения другим пользователем.
 
Цитата
Mizar написал:
Сделал через текстовый файл.
Работает быстро, и незаметно для пользователей.
А посмотреть можно файл с макросами?
 
Допилил. Заработало. Попасть в одну и туже ячейку двум пользователем теперь не получается. Макрос перекидывает на новую пустую.
Потом при следующем обновлении или сохранении данные в ячейках появляются сами.
Так как конфликтов нет, сообщениями Excel не закидывает.
Внес функцию определения количества пользователей, если их больше одного, только тогда работает проверка, и добавлена форма для ожидания обновления данных во время проверки.
Код
Sub FileSave(Name As String, N As Long)
    Dim IniFile ' полный путь для файла настроек
    Dim MyFile 'Объявляем переменную для свободного файла
    IniFile = NewFolderArh & Application.PathSeparator & "\" & "Set.ini"
    MyFile = FreeFile ' Присваиваем свободный канал, для работы с файлами
    Open (IniFile) For Output As #MyFile 'Открываем файл TEST.TXT для записи
    Print #MyFile, Name '' имя листа
    Print #MyFile, N '' имя листа
    Print #MyFile, Environ("username") '' имя последнего пользователя
    Close #MyFile 'Закрываем файл
End Sub
 
Function FileRead(Name As String, N As Long)
'' чтение файла
Dim NameSheet As String
Dim fN As Long
Dim UserName As String
Dim IniFile ' полный путь для файла настроек
Dim MyFile 'Объявляем переменную для свободного файла
Dim S As String 'Переменная для хранения считанных данных
FileRead = 0
    
    IniFile = NewFolderArh & Application.PathSeparator & "\" & "Set.ini"
    MyFile = FreeFile ' Присваиваем свободный канал, для работы с файлами
    On Error Resume Next                    ' обработка ошибки открытия файла
    Open (IniFile) For Input As #MyFile 'Открываем файл TEST.TXT для чтения
    If Err Then
 '       FileRead = 0
        Exit Function
    End If
   
    Line Input #MyFile, S 'Считываем первую строку из файла TEST.TXT в переменную S
    NameSheet = S
    Line Input #MyFile, S 'Считываем первую строку из файла TEST.TXT в переменную S
    fN = S
    Line Input #MyFile, S 'Считываем первую строку из файла TEST.TXT в переменную S
    UserName = S
    Close #MyFile 'Закрываем файл
    
    If Environ("username") <> UserName then
        If Name = NameSheet   Then
            If N <= fN Then
                MsgBox "Внимание! Строку " & N & " уже редактирует " & UserName
                FileRead = fN
            End If
        End If
    End If
End Function
Function UserStatus()
Dim NameUser As String
Dim CountUsers As Integer
CountUsers = 0
  'Свойство UserStatus Property возвращает 2D-массив (1 to 3), содержащий информацию _
   о каждом пользователе, открывшем книгу в режиме общего доступа.
  '1-й столбец - имя пользователя, открывшего книгу в режиме общего доступа, _
   2-й столбец - дата и время, когда этот пользователь открыл книгу, _
   3-й столбец - индикатор режима открытия книги (1 - монопольный, 2 - общий доступ).
   Users = ActiveWorkbook.UserStatus
        For Row = 1 To UBound(Users, 1)
            If Len(Users(Row, 1)) > 0 And NameUser <> Users(Row, 1) Then
                NameUser = Users(Row, 1)
                CountUsers = CountUsers + 1
            End If
        Next
   UserStatus = CountUsers
'   UserStatus = 2
End Function
Sub ZapNow()
Dim lRow As Long
Dim Xst As Integer
    ActiveSheet.Cells(2, 3).Select
    'Найти последнюю не пустую ячейку в столбце А(1)
    lRow = Cells(Rows.Count, 3).End(xlUp).Row + 1
    If Len(Cells(lRow, 3)) > 0 Then Exit Sub ' проверка, вдруг в этой строке что то есть
    
    If UserStatus > 1 Then ' с книгой работают больше одного пользователя
        Load FormMessage
        FormMessage.Show (0)
        DoEvents
        ' сохраним книгу, это обновит данные
        On Error Resume Next
        ThisWorkbook.Save
         ' проверим, нет ли к этой ячейке конфликтного доступа
        Xst = FileRead(ActiveSheet.Name, lRow)
        If Xst <> 0 Then
            lRow = Xst + 1
        End If
        Unload FormMessage
    End If
   
    Cells(lRow, 2) = Format(Now(), "dd.mm.yyyy")
    Cells(lRow, 1) = Environ("USERNAME")
    ' сохраним в файл метку наше присутствие
    FileSave ActiveSheet.Name, lRow
    Cells(lRow, 3).Select
    X = ActivateKeyboardLayout&(kb_lay_ru, 0) ' переключает раскладку на Русский язык. Если нет функции, убрать эту строку
 End Sub

Function NewFolderArh() As String
   NewFolderArh = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, "Архивные копи") '' тут называем папку куда складывать
    On Error Resume Next
    MkDir NewFolderArh
End Function
З.Ы. Надо понимать, что все это может сработать, только если пользователь добавляет записи через макросы. Выбор ячеек вручную не защищает от конфликтов, но это проблемы пользователей.
Изменено: Mizar - 24.01.2021 20:22:30 (Нашел ошибку в коде.)
 
Цитата
Mizar написал:
Выбор ячеек вручную не защищает от конфликтов, но это проблемы пользователей
какие у вас взаимоотношения с пользователями не знаю, но боюсь что очень скоро зададут вопрос, куда делось..... Если возможность ручного редактирования не заблокирована, то ждите.
По вопросам из тем форума, личку не читаю.
 
В данном проекте блокировать доступ к ячейкам не обязательно. Я сам один из пользователей, и будет обидно внести запись и узнать, что твой коллега в эту же ячейку внес свою запись и теперь предстоит выбор, либо ему переписывать текст либо мне.
Этим я могу исключить одновременное попадание в одну и туже ячейку.
Мне нужно было найти способ для своей задачи, да и потом был спортивный интерес.
А механизм можно развивать, менять, все зависит от конкретной задачи.

А на вопрос, куда делось, можно логи полистать.....
Изменено: Mizar - 24.01.2021 21:58:30
 
между спортивным интересом и практической пользой есть небольшая разница в данном случае  размером в огромную пропасть
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Mizar написал:
А на вопрос, куда делось, можно логи полистать.....
полистали, узнали, наказали. Данные то где? Вы пытаетесь сделать механнизхм блокировки конкретной записи, который реализован в базах.

Обратите внимание, что произойдет если ваш сервисный файл будет недоступен, по той или иной причине.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал: Вы пытаетесь сделать механнизхм блокировки конкретной записи, который реализован в базах.
Нет. Не блокировки записи, а исключить одновременный выбор одинаковой ячейки двум одинаковым макросам у разных пользователей. Запись не блокируется, но каждый пользователь работает в своей ячейке. Можно и лист заблокировать, если на нем работает другой пользователь. Вообще конфликтов не будет.

Цитата
БМВ написал: ...что произойдет если ваш сервисный файл будет недоступен
Ничего страшного, изначально его вообще нет.
Если ресурс с сервисным файл будет недоступен, то и работа с основным файлом будет тоже невозможна. При попытке сохранить такой файл, Excel предложит сохранить файл как....
Сервисный файл внезапно пропал? ну и ладно, Конфликт, если он есть, отслеживает сам Excel. Вы же наверняка пробовали менять одну и туже ячейку разными пользователями и видели этот механизм. Всегда есть возможность выбора, оставить чужую запись или сохранить свою. Я не видел такого, что бы записи сами по себе пропали.

У меня сложилось впечатление, что не я за помощью обратился, а вы от меня ждете какого то решения.....
Я не специалист, решаю задачи как умею. Я не базу данных пишу, у меня простая таблица.
Есть что предложить по теме?  Несколько вопросов остались без ответов......
 
Mizar, записью называют еще и конкретную строку.
Цитата
Mizar написал:
Всегда есть возможность выбора, оставить чужую запись или сохранить свою.
есть то она есть, но вот как это все будет отрабатывать и к чему приведет....

Не думаю что от вас тут что-то ждут, кроме как отказаться от этой затеи.
Цитата
Mizar написал:
Я не базу данных пишу, у меня простая таблица.
но она с этим обвесом становится не простой.  И я не критикую, а акцентирую внимание.
По вопросам из тем форума, личку не читаю.
 
Цитата
Mizar написал:
У меня сложилось впечатление, что не я за помощью обратился
у меня сложилось впечатление об отсутствии понимая сложности задачи и четкого алгоритма ее решения
нет задачи от автора темы - какое может быть решение?
а кода есть только ТЗ, над которым нужно работать не одну неделю - это не помощь, помощь это 10-15 минут и помог, а час - это уже работа, не говоря о неделе)
удачи!
и... купите каску, скоро посыпятся благодарности от сотрудников
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Mizar написал:
2.Можно ли второму пользователю пред новой записью как-то обновить данные на предмет, не появилось ли что в книге. Как это сделать? 3. Можно ли макросом отследить сколько пользователей работают с книгой. Если больше одного, тогда  выполнять п.1 и п.2.  
Это задачи.
Цитата
Ігор Гончаренко написал:
а кода есть только ТЗ, над которым нужно работать не одну неделю
Форуму несколько лет, я решаю эту задачу впервые. Рассчитывал, что уже есть готовые решения.
Цитата
Ігор Гончаренко написал:
и... купите каску, скоро посыпятся благодарности от сотрудников
Не разделяю вашего сарказма, я указал, что сам работаю с таблицей, и это больше нужно для меня. И да, у меня есть белая каска.....

Цитата
БМВ написал:
есть то она есть, но вот как это все будет отрабатывать и к чему приведет....
На данном этапе конфликты могут появится только при прямом доступе к ячейкам, пару тройку раз пересекутся записи, закроем доступ к ячейкам, заставим работать через форму. Данные в таблице не финансовые, можно и перепечатать.
Цитата
БМВ написал:
Не думаю что от вас тут что-то ждут, кроме как отказаться от этой затеи.
Очень жаль, что штатными средствами Excel не реализована защита от доступа к редактируемой ячейке.
Но почему я должен отказаться от того что у меня получилось, потому что оно работать не должно?

Всем спасибо за помощь.
 
Цитата
Mizar написал:
Но почему я должен отказаться от того что у меня получилось, потому что оно работать не должно?
Не должны, но пользуйтесь на свой страх и риск. даже если это протокол или подобное, то конечно все зависит от интенсивности работы.
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх