Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Получить путь к файлу при перетаскивании файла мышью в тело открытого листа
 
Спасибо за ссылку. Нашел кое что интереное....
Да там тоже через форму, но использует ListViev и немного замудрено.

Я поместил Microsoft TreeView control на лист, но событие, такое же как на форме, на нем не запускается.
Как настроить не пойму.
Получить путь к файлу при перетаскивании файла мышью в тело открытого листа
 
Добрый день.
Открыл для себя TreeView для получения пути к файлу, но только через форму.
Скажите, есть ли способ расположить что-то аналогичное на самом листе или получить путь к файлу при перетаскивании файла мышью в тело открытого листа?
Совместный доступ. Проверка ячейки перед записью.
 
Цитата
Mizar написал:
2.Можно ли второму пользователю пред новой записью как-то обновить данные на предмет, не появилось ли что в книге. Как это сделать? 3. Можно ли макросом отследить сколько пользователей работают с книгой. Если больше одного, тогда  выполнять п.1 и п.2.  
Это задачи.
Цитата
Ігор Гончаренко написал:
а кода есть только ТЗ, над которым нужно работать не одну неделю
Форуму несколько лет, я решаю эту задачу впервые. Рассчитывал, что уже есть готовые решения.
Цитата
Ігор Гончаренко написал:
и... купите каску, скоро посыпятся благодарности от сотрудников
Не разделяю вашего сарказма, я указал, что сам работаю с таблицей, и это больше нужно для меня. И да, у меня есть белая каска.....

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

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

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

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

А на вопрос, куда делось, можно логи полистать.....
Изменено: Mizar - 24 янв 2021 21:58:30
Совместный доступ. Проверка ячейки перед записью.
 
Допилил. Заработало. Попасть в одну и туже ячейку двум пользователем теперь не получается. Макрос перекидывает на новую пустую.
Потом при следующем обновлении или сохранении данные в ячейках появляются сами.
Так как конфликтов нет, сообщениями 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 янв 2021 20:22:30 (Нашел ошибку в коде.)
Совместный доступ. Проверка ячейки перед записью.
 
Сделал через текстовый файл.
Работает быстро, и незаметно для пользователей.
У меня вопрос. Как обновить данные таблицы без диалоговых окон.
Нужно принять все сохранения другим пользователем.
Совместный доступ. Проверка ячейки перед записью.
 
Через интернет тут не подходит. Обособленная сеть предприятия.
По идее не должно так совпасть что бы оба пользователя одновременно обратились к одному и тому же листу, но это не исключено.
При редактировании разных листов, такого конфликта не возникнет.

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

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

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

Рассматривал такой способ:
1.Если при добавлении новой записи, когда макрос внесет первоначальные записи, сразу же сохранить книгу? На это конечно понадобится какое-то время, но тем не менее, запись уже будет записана в документ.
2.Можно ли второму пользователю пред новой записью как-то обновить данные на предмет, не появилось ли что в книге. Как это сделать?
3. Можно ли макросом отследить сколько пользователей работают с книгой. Если больше одного, тогда  выполнять п.1 и п.2.  
Вставить дату из TextBox в ячейку
 
Вот ведь чувствовал же, что что-то тут не так. Везде одни и те же примеры с Format().
Очень благодарю. Заработало.
С новым годом!
Вставить дату из TextBox в ячейку
 
Добрый день.
Макрос прописывает условное форматирование к некоторым ячейкам.
Условие: закрасить строку, если дата в ячейке меньше текущей.
Если дату в ячейку прописывает макрос, то Excel не видит ее как дату, и условное форматирование не работает.
Если вписывать дату вручную, то условное форматирование работает как задумано.

Подскажите пожалуйста, как исправить недуг.
Вот пример:
Защита листа при общем доступе
 
Спасибо за подсказку.
А как собрать Range("ЯчейкаX1Y1") заменив цифры переменными X  Y, соответствующие адресам ячейки.
Range("ЯчейкаX" & X & "Y" & Y)  будет работать?  
Защита листа при общем доступе
 
Хорошо.
Правильно ли я понимаю, что:
Ячейку я назову например ЯчейкаX1Y1
Чтение я делаю обычным методом Value=cells(x,y)  , а записывать буду  ЯчейкаX & x & "Y" & y = Value , где x y  адрес ячейки.
Защита листа при общем доступе
 
Это если заранее обработать макросом и переименовать все ячейки на листе, а потом к ним обращаться?
К сожалению этот вариант не подходит.
В таблице некий перечень. Для каждого элемента перечня много ячеек в строке.
Форма вносит данные в эти ячейки. Все очень усложняется. Но если прижмет, может и придется.
Изменено: Mizar - 13 июн 2019 09:19:42
Защита листа при общем доступе
 
Доброго времени суток.
Наверное тема банальна и проста, но я зашел  в тупик и прошу помощи.

Есть книга xls в ней лист, на листе защищаемые ячейки.
Редактирование ячеек происходит из формы. При открытии читаются данные, при сохранении записываются в ячейки.
Ничего сложного. Защищаю лист кодом:
Код
Sheets("Главная").Protect Password:="1234", UserInterfaceOnly:=True, AllowFormattingCells:=True, AllowFiltering:=True, DrawingObjects:=False 

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

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

Заметил особенность, доступ к ячейкам работает сразу после выполнения :
Код
Sheets("Главная").Protect Password:="1234", UserInterfaceOnly:=True, AllowFormattingCells:=True, AllowFiltering:=True, DrawingObjects:=False 
Если открыть без этого кода - выдают ошибку.

При общем доступе этот код не работает.
Изменено: Mizar - 12 июн 2019 10:58:32
Страницы: 1
Наверх