Есть общий файл с таблицей которая заполняется разными людьми. Так как люди часто заполняют строчки одновременно возникают конфликты. И не всегда они решаются в пользу того кто первым сделал запись. В итоге некоторые записи перезаписываются и теряются.
Придумали такое решение - зашёл в книгу, написал например Резерв и свою фамилию в строчках которые планируешь заполнить и вышел с сохранением. Если случился конфликт - то выбрать пункт где приоритет имеют чужие данные (те что раньше вводились). Затем заходишь снова и уже вводишь вместо Резерва со своей фамилией то что хотел. Не уверен на счёт выхода. По идее должно работать и просто сохранение, но мы для верности закрываем файл, возможно зря.
Нужен макрос чтобы данная процедура сама выполнялась например от сочетания клавиш. Обработка конфликта (пусть и гипотетического) для меня пока нерешаемая задача, хотя если кто-то сможет написать и без этого, буду признателен. Макрос понятное дело должен уметь понимать где закончились строчки с данными и пошли пустые строчки, спускаться на строку ниже, резервировать, прописывать имя пользователя в одну из ячеек резервируемой строки (у всех файлов ведь есть автор - вот хотя бы этого автора или имя компьютера), сохранять файл (совсем круто если ещё и конфликт решать).
Есть общий файл с таблицей которая заполняется разными людьми. Так как люди часто заполняют строчки одновременно возникают конфликты. И не всегда они решаются в пользу того кто первым сделал запись. В итоге некоторые записи перезаписываются и теряются.
Придумали такое решение - зашёл в книгу, написал например Резерв и свою фамилию в строчках которые планируешь заполнить и вышел с сохранением. Если случился конфликт - то выбрать пункт где приоритет имеют чужие данные (те что раньше вводились). Затем заходишь снова и уже вводишь вместо Резерва со своей фамилией то что хотел. Не уверен на счёт выхода. По идее должно работать и просто сохранение, но мы для верности закрываем файл, возможно зря.
Нужен макрос чтобы данная процедура сама выполнялась например от сочетания клавиш. Обработка конфликта (пусть и гипотетического) для меня пока нерешаемая задача, хотя если кто-то сможет написать и без этого, буду признателен. Макрос понятное дело должен уметь понимать где закончились строчки с данными и пошли пустые строчки, спускаться на строку ниже, резервировать, прописывать имя пользователя в одну из ячеек резервируемой строки (у всех файлов ведь есть автор - вот хотя бы этого автора или имя компьютера), сохранять файл (совсем круто если ещё и конфликт решать).fairylive
Почти. Имя компьютера как оказалось мало подходит (не имеет отношения к пользователю). Видимо нужно имя пользователя username (фамилия пользователя на английском языке), хотя оно всё равно не совпадает с именем Автор (Имя и Фамилия на русском языке). И с переходом строк. Если не делать автоопределение конца таблицы с данными, логика в том чтобы строчки (дата, пользователь) вставлялись относительно выделенной ячейки есть. Но тогда логично что пользователь будет выбирать пустую строчку и резервировать её. То есть макрос не должен спускаться ниже относительно выбранной. А оставаться в той строке которую выбрал пользователь. Дату хорошо бы вводить только во второй столбец, фамилию в шестой. Ну и хорошо бы тогда проверку сделать - пустые ли эти ячейки. Чтобы макрос не срабатывал на строчках с уже введёными данными. Первый столбец - это порядковый номер строк с данными - часто уже заполнен. То есть проверку надо делать начиная со второго столбца.
Почти. Имя компьютера как оказалось мало подходит (не имеет отношения к пользователю). Видимо нужно имя пользователя username (фамилия пользователя на английском языке), хотя оно всё равно не совпадает с именем Автор (Имя и Фамилия на русском языке). И с переходом строк. Если не делать автоопределение конца таблицы с данными, логика в том чтобы строчки (дата, пользователь) вставлялись относительно выделенной ячейки есть. Но тогда логично что пользователь будет выбирать пустую строчку и резервировать её. То есть макрос не должен спускаться ниже относительно выбранной. А оставаться в той строке которую выбрал пользователь. Дату хорошо бы вводить только во второй столбец, фамилию в шестой. Ну и хорошо бы тогда проверку сделать - пустые ли эти ячейки. Чтобы макрос не срабатывал на строчках с уже введёными данными. Первый столбец - это порядковый номер строк с данными - часто уже заполнен. То есть проверку надо делать начиная со второго столбца.fairylive
хорошо бы тогда проверку сделать - пустые ли эти ячейки
Макрос создаёт чистую строку сдвигая вниз всё содержание таблицы. Так что проверка не требуется.
Вот уточненный вариант с учётом Ваших пожеланий, вариант вставки строки можно выбрать, 1. Вставляем строку под выделенной ячейкой 2. Вставляем строку в самый низ (определяется по содержанию 1 столбца.)
[vba]
Код
Public Sub Name_Insert() Dim oRow As Integer Dim name_comp As String
Dim si As Object Set si = CreateObject("WScript.Network") name_comp = si.UserName 'выясняет имя пользователя
'================================================================ 'тут два варианта вставки новой строки нужный можно выбрать. ' по первому создаётся новая чистая строка под выделенной ячейкой ' по второму создаётся новая чистая строка в нижней части таблицы oRow = ActiveCell.Row + 1 'строка под выделенной ячейкой. 'oRow = Cells(Rows.Count, 1).End(xlUp).Row + 1 'находит самая нижнюю строку со свободной ячейкой в столбце1 '=================================================================
хорошо бы тогда проверку сделать - пустые ли эти ячейки
Макрос создаёт чистую строку сдвигая вниз всё содержание таблицы. Так что проверка не требуется.
Вот уточненный вариант с учётом Ваших пожеланий, вариант вставки строки можно выбрать, 1. Вставляем строку под выделенной ячейкой 2. Вставляем строку в самый низ (определяется по содержанию 1 столбца.)
[vba]
Код
Public Sub Name_Insert() Dim oRow As Integer Dim name_comp As String
Dim si As Object Set si = CreateObject("WScript.Network") name_comp = si.UserName 'выясняет имя пользователя
'================================================================ 'тут два варианта вставки новой строки нужный можно выбрать. ' по первому создаётся новая чистая строка под выделенной ячейкой ' по второму создаётся новая чистая строка в нижней части таблицы oRow = ActiveCell.Row + 1 'строка под выделенной ячейкой. 'oRow = Cells(Rows.Count, 1).End(xlUp).Row + 1 'находит самая нижнюю строку со свободной ячейкой в столбце1 '=================================================================
al-Ex, спасибо! Второй вариант подходит больше. Будем применять. Вообще считаю неплохое решение для всех кто имеет дело с общим файлом и построчным заполнением таблицы. По сочетанию клавиш например ctrl+р (рэ русская) резервируется строчка для дальнейшего редактирования. Фокус в том что делается это мгновенно и с сохранением. Меньше шансов встретиться с конфликтом с другим пользователем. Хотя шанс есть так как после моего сохранения другой пользователь пока сам не сохранится не увидит чужих изменений.
Возможно есть смысл в макрос перед добавлением строки внести ещё одно сохранение. Тогда сначала отобразятся чужие строки, затем после них добавится новая. В этом случае по идее вообще никогда конфликтов не будет. На практике правда подозреваю что при большом размере файла могут быть тормоза при его сохранении и не понятно как отработает макрос.
al-Ex, спасибо! Второй вариант подходит больше. Будем применять. Вообще считаю неплохое решение для всех кто имеет дело с общим файлом и построчным заполнением таблицы. По сочетанию клавиш например ctrl+р (рэ русская) резервируется строчка для дальнейшего редактирования. Фокус в том что делается это мгновенно и с сохранением. Меньше шансов встретиться с конфликтом с другим пользователем. Хотя шанс есть так как после моего сохранения другой пользователь пока сам не сохранится не увидит чужих изменений.
Возможно есть смысл в макрос перед добавлением строки внести ещё одно сохранение. Тогда сначала отобразятся чужие строки, затем после них добавится новая. В этом случае по идее вообще никогда конфликтов не будет. На практике правда подозреваю что при большом размере файла могут быть тормоза при его сохранении и не понятно как отработает макрос.fairylive
Возможно есть смысл в макрос перед добавлением строки внести ещё одно сохранение
Вряд-ли это снимет все Ваши проблемы, но можете поэкспериментировать:
[vba]
Код
Public Sub Name_Insert() Dim oRow As Integer Dim name_comp As String
'==сохраняем файл 1й раз ====================== ActiveWorkbook.Save 'сохраняем файл DoEvents '' Передаем управление операционной системе для возможного обновления листа '============================================
Dim si As Object Set si = CreateObject("WScript.Network") name_comp = si.UserName 'выясняет имя пользователя
'================================================================ 'тут два варианта вставки новой строки нужный можно выбрать. ' по первому создаётся новая чистая строка под выделенной ячейкой ' по второму создаётся новая чистая строка в нижней части таблицы oRow = ActiveCell.Row + 1 'строка под выделенной ячейкой. 'oRow = Cells(Rows.Count, 1).End(xlUp).Row + 1 'находит самая нижнюю строку со свободной ячейкой в столбце1 '=================================================================
* вообще, я бы иначе организовал работу с общей книгой. 1. Для исключения конфликтов каждому пользователю выделить свой лист в книге, на нём сохраняются строки только этого пользователя. 2. сводный лист где будут видны все строки всех пользователей, формировать макросом, каждый раз когда пользователь открывает книгу и сохранять его не надо при сохранении книги (перед сохранением удалить сводный лист, тоже макросом) Строки разных пользователей сохраняются на их индивидуальных листах. Так вы радикально избегаете возможных конфликтов и потерь части информации. в общих чертах, как-то так.
Возможно есть смысл в макрос перед добавлением строки внести ещё одно сохранение
Вряд-ли это снимет все Ваши проблемы, но можете поэкспериментировать:
[vba]
Код
Public Sub Name_Insert() Dim oRow As Integer Dim name_comp As String
'==сохраняем файл 1й раз ====================== ActiveWorkbook.Save 'сохраняем файл DoEvents '' Передаем управление операционной системе для возможного обновления листа '============================================
Dim si As Object Set si = CreateObject("WScript.Network") name_comp = si.UserName 'выясняет имя пользователя
'================================================================ 'тут два варианта вставки новой строки нужный можно выбрать. ' по первому создаётся новая чистая строка под выделенной ячейкой ' по второму создаётся новая чистая строка в нижней части таблицы oRow = ActiveCell.Row + 1 'строка под выделенной ячейкой. 'oRow = Cells(Rows.Count, 1).End(xlUp).Row + 1 'находит самая нижнюю строку со свободной ячейкой в столбце1 '=================================================================
* вообще, я бы иначе организовал работу с общей книгой. 1. Для исключения конфликтов каждому пользователю выделить свой лист в книге, на нём сохраняются строки только этого пользователя. 2. сводный лист где будут видны все строки всех пользователей, формировать макросом, каждый раз когда пользователь открывает книгу и сохранять его не надо при сохранении книги (перед сохранением удалить сводный лист, тоже макросом) Строки разных пользователей сохраняются на их индивидуальных листах. Так вы радикально избегаете возможных конфликтов и потерь части информации. в общих чертах, как-то так.al-Ex
Сообщение отредактировал al-Ex - Суббота, 27.02.2016, 02:10