Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/лог если данные изменены. - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
Страница 1 из 212»
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK 
Мир MS Excel » Вопросы и решения » Вопросы по VBA » лог если данные изменены. (Макросы/Sub)
лог если данные изменены.
koyaanisqatsi Дата: Пятница, 15.04.2016, 09:53 | Сообщение № 1
Группа: Проверенные
Ранг: Ветеран
Сообщений: 610
Репутация: 15 ±
Замечаний: 0% ±

Excel 2010
Здравствуйте.
Есть идея вести лог изменений заполненных ячеек. Если пустая ячейка заполняется то вносить это в лог не надо.
В логе должна содержатся старая и новая информация. И каким-то образом должно быть понятно из какой это было ячейки.
И сразу доп вопрос VBA сможет писать лог на скрытую страницу которая будет доступна по определенному паролю ?
 
Ответить
СообщениеЗдравствуйте.
Есть идея вести лог изменений заполненных ячеек. Если пустая ячейка заполняется то вносить это в лог не надо.
В логе должна содержатся старая и новая информация. И каким-то образом должно быть понятно из какой это было ячейки.
И сразу доп вопрос VBA сможет писать лог на скрытую страницу которая будет доступна по определенному паролю ?

Автор - koyaanisqatsi
Дата добавления - 15.04.2016 в 09:53
SLAVICK Дата: Пятница, 15.04.2016, 11:02 | Сообщение № 2
Группа: Модераторы
Ранг: Старожил
Сообщений: 1849
Репутация: 614 ±
Замечаний: 0% ±

2007,2010,2013,2016
И сразу доп вопрос VBA сможет писать лог на скрытую страницу которая будет доступна по определенному паролю

VBA сможет - но тогда будет недоступна функция отмены действия.
Есть несколько вариантов:
Самый простой - сделать книгу "общей" Рецензирование -- защитить книгу и дать общий доступ. - Это штатное средство excel
С использованием ВБА:
Делать как Вы написали и вести лог на отдельный лист.
Записывать изменения в примечания к ячейке например так. Недостатки как и выше + неудобно сводить такие данные
Записывать изменения в отдельный массив, и выгружать его на лист при сохранении или закрытии - если будет какой-то сбой макроса - все изменения и массив потеряются. Но будут доступна отмена действий.
Записывать изменения в отдельный ТХТ(СSV) файл - самый оптимальный способ. Такие Лог файлы ведутся многими системами - из неудобств - нужно будет его импортировать, чтобы обработать информацию, или только смотреть.

ЗЫ в первой ссылке - есть и примеры почти всех способов.


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Пятница, 15.04.2016, 11:11
 
Ответить
Сообщение
И сразу доп вопрос VBA сможет писать лог на скрытую страницу которая будет доступна по определенному паролю

VBA сможет - но тогда будет недоступна функция отмены действия.
Есть несколько вариантов:
Самый простой - сделать книгу "общей" Рецензирование -- защитить книгу и дать общий доступ. - Это штатное средство excel
С использованием ВБА:
Делать как Вы написали и вести лог на отдельный лист.
Записывать изменения в примечания к ячейке например так. Недостатки как и выше + неудобно сводить такие данные
Записывать изменения в отдельный массив, и выгружать его на лист при сохранении или закрытии - если будет какой-то сбой макроса - все изменения и массив потеряются. Но будут доступна отмена действий.
Записывать изменения в отдельный ТХТ(СSV) файл - самый оптимальный способ. Такие Лог файлы ведутся многими системами - из неудобств - нужно будет его импортировать, чтобы обработать информацию, или только смотреть.

ЗЫ в первой ссылке - есть и примеры почти всех способов.

Автор - SLAVICK
Дата добавления - 15.04.2016 в 11:02
koyaanisqatsi Дата: Пятница, 15.04.2016, 11:16 | Сообщение № 3
Группа: Проверенные
Ранг: Ветеран
Сообщений: 610
Репутация: 15 ±
Замечаний: 0% ±

Excel 2010
SLAVICK, Лог весьма скромный может быть, если вообще будет. Лог хочется для того чтобы можно было судить при отверждении двух людей что один написал другой не видел. Если Того о чем первый говорит нет то в логе можно посмотреть сохраненное изменение. Если в лог не попало тогда первый говорит не правду. Так как обычно спорных ситуаций не происходит то и лог будет если будет весьма скромный. Так же это актуально не в случае удаления информации а если информация корректируется но таких случаем тоже очень мало. Но не смотря что это все редкость это при возникновении вопроса очень серьезный камень преткновения.
 
Ответить
СообщениеSLAVICK, Лог весьма скромный может быть, если вообще будет. Лог хочется для того чтобы можно было судить при отверждении двух людей что один написал другой не видел. Если Того о чем первый говорит нет то в логе можно посмотреть сохраненное изменение. Если в лог не попало тогда первый говорит не правду. Так как обычно спорных ситуаций не происходит то и лог будет если будет весьма скромный. Так же это актуально не в случае удаления информации а если информация корректируется но таких случаем тоже очень мало. Но не смотря что это все редкость это при возникновении вопроса очень серьезный камень преткновения.

Автор - koyaanisqatsi
Дата добавления - 15.04.2016 в 11:16
koyaanisqatsi Дата: Пятница, 15.04.2016, 11:23 | Сообщение № 4
Группа: Проверенные
Ранг: Ветеран
Сообщений: 610
Репутация: 15 ±
Замечаний: 0% ±

Excel 2010
SLAVICK,
Мне кстати даже первый вариант бы очень подошел.
[vba]
Код

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim oComment As Comment
    On Error Resume Next
    Set oComment = Target.Comment
    If oComment Is Nothing Then
        Set oComment = Target.AddComment(Target.Text & " " & Format(Now, "dd.mm.yy HH:MM"))
    Else
        oComment.Text oComment.Text & Chr(10) & Target.Text & " " & Format(Now, "dd.mm.yy HH:MM")
        oComment.Shape.TextFrame.AutoSize = True
    End If
End Sub
[/vba]

Вставил этот код на лист "Овощи"

только на листе доступном высшему руководству должна быть какая-то кнопа сбрасывать логи. (На листе "доп" ирархия доступа обозначена.)
пароли доступа:
Шеф 111
Овощи 222
Мясо 333
Бакалея 444

И при общем доступе не подписывает в примечании какой юзер сделал данное изменение. А это тоже важно.
К сообщению приложен файл: 45454521111.xlsb(29Kb)


Сообщение отредактировал koyaanisqatsi - Пятница, 15.04.2016, 11:24
 
Ответить
СообщениеSLAVICK,
Мне кстати даже первый вариант бы очень подошел.
[vba]
Код

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim oComment As Comment
    On Error Resume Next
    Set oComment = Target.Comment
    If oComment Is Nothing Then
        Set oComment = Target.AddComment(Target.Text & " " & Format(Now, "dd.mm.yy HH:MM"))
    Else
        oComment.Text oComment.Text & Chr(10) & Target.Text & " " & Format(Now, "dd.mm.yy HH:MM")
        oComment.Shape.TextFrame.AutoSize = True
    End If
End Sub
[/vba]

Вставил этот код на лист "Овощи"

только на листе доступном высшему руководству должна быть какая-то кнопа сбрасывать логи. (На листе "доп" ирархия доступа обозначена.)
пароли доступа:
Шеф 111
Овощи 222
Мясо 333
Бакалея 444

И при общем доступе не подписывает в примечании какой юзер сделал данное изменение. А это тоже важно.

Автор - koyaanisqatsi
Дата добавления - 15.04.2016 в 11:23
SLAVICK Дата: Пятница, 15.04.2016, 11:53 | Сообщение № 5
Группа: Модераторы
Ранг: Старожил
Сообщений: 1849
Репутация: 614 ±
Замечаний: 0% ±

2007,2010,2013,2016
какой юзер сделал данное изменение.

[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim oComment As Comment
    On Error Resume Next
    Set oComment = Target.Comment
    If oComment Is Nothing Then
        Set oComment = Target.AddComment(Sheets(1).Cells(1, "b").Value & ": " & Target.Text & " " & Format(Now, "dd.mm.yy HH:MM"))
    Else
        oComment.Text oComment.Text & Chr(10) & Sheets(1).Cells(1, "b").Value & ": " & Target.Text & " " & Format(Now, "dd.mm.yy HH:MM")
        oComment.Shape.TextFrame.AutoSize = True
    End If
End Sub
[/vba]
высшему руководству должна быть какая-то кнопа сбрасывать логи

[vba]
Код
Sub ClearComm()
On Error Resume Next
ActiveSheet.UsedRange.ClearComments
End Sub
[/vba]
К сообщению приложен файл: 6665517.xlsb(30Kb)


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщение
какой юзер сделал данное изменение.

[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim oComment As Comment
    On Error Resume Next
    Set oComment = Target.Comment
    If oComment Is Nothing Then
        Set oComment = Target.AddComment(Sheets(1).Cells(1, "b").Value & ": " & Target.Text & " " & Format(Now, "dd.mm.yy HH:MM"))
    Else
        oComment.Text oComment.Text & Chr(10) & Sheets(1).Cells(1, "b").Value & ": " & Target.Text & " " & Format(Now, "dd.mm.yy HH:MM")
        oComment.Shape.TextFrame.AutoSize = True
    End If
End Sub
[/vba]
высшему руководству должна быть какая-то кнопа сбрасывать логи

[vba]
Код
Sub ClearComm()
On Error Resume Next
ActiveSheet.UsedRange.ClearComments
End Sub
[/vba]

Автор - SLAVICK
Дата добавления - 15.04.2016 в 11:53
koyaanisqatsi Дата: Пятница, 15.04.2016, 12:18 | Сообщение № 6
Группа: Проверенные
Ранг: Ветеран
Сообщений: 610
Репутация: 15 ±
Замечаний: 0% ±

Excel 2010
SLAVICK, Ага вот вроде и все теперь как надо. Попробуем так и оформить. Спасибо.
 
Ответить
СообщениеSLAVICK, Ага вот вроде и все теперь как надо. Попробуем так и оформить. Спасибо.

Автор - koyaanisqatsi
Дата добавления - 15.04.2016 в 12:18
koyaanisqatsi Дата: Пятница, 15.04.2016, 14:24 | Сообщение № 7
Группа: Проверенные
Ранг: Ветеран
Сообщений: 610
Репутация: 15 ±
Замечаний: 0% ±

Excel 2010
SLAVICK, а как написать что бы макрос обнуления срабатывал с любого листка на всю книгу ?
 
Ответить
СообщениеSLAVICK, а как написать что бы макрос обнуления срабатывал с любого листка на всю книгу ?

Автор - koyaanisqatsi
Дата добавления - 15.04.2016 в 14:24
Roman777 Дата: Пятница, 15.04.2016, 14:27 | Сообщение № 8
Группа: Проверенные
Ранг: Ветеран
Сообщений: 703
Репутация: 75 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
koyaanisqatsi, думаю, что нужно определить, для начала, как будет называться лист, или какой у него будет индекс.... Я имею в виду лист, на котором Вы чистите.


Много чего не знаю!!!!
 
Ответить
Сообщениеkoyaanisqatsi, думаю, что нужно определить, для начала, как будет называться лист, или какой у него будет индекс.... Я имею в виду лист, на котором Вы чистите.

Автор - Roman777
Дата добавления - 15.04.2016 в 14:27
koyaanisqatsi Дата: Пятница, 15.04.2016, 14:30 | Сообщение № 9
Группа: Проверенные
Ранг: Ветеран
Сообщений: 610
Репутация: 15 ±
Замечаний: 0% ±

Excel 2010
Roman777, Чистка будет происходить листов 2-4 в этом файле. Либо Овощи, Мясо, Бакалея.
 
Ответить
СообщениеRoman777, Чистка будет происходить листов 2-4 в этом файле. Либо Овощи, Мясо, Бакалея.

Автор - koyaanisqatsi
Дата добавления - 15.04.2016 в 14:30
Manyasha Дата: Пятница, 15.04.2016, 14:42 | Сообщение № 10
Группа: Модераторы
Ранг: Старожил
Сообщений: 1589
Репутация: 669 ±
Замечаний: 0% ±

Excel 2007, 2010
koyaanisqatsi, так попробуйте
[vba]
Код
'По всем листам
For Each sh In ThisWorkbook.Sheets
    sh.UsedRange.ClearComments
Next sh
'Только листы со 2-го по 4-й
For i = 2 To 4
    ThisWorkbook.Sheets(i).UsedRange.ClearComments
Next i
[/vba]


marinamorozova_box@mail.ru
ЯД: 410013299366744 WM: R193491431804
 
Ответить
Сообщениеkoyaanisqatsi, так попробуйте
[vba]
Код
'По всем листам
For Each sh In ThisWorkbook.Sheets
    sh.UsedRange.ClearComments
Next sh
'Только листы со 2-го по 4-й
For i = 2 To 4
    ThisWorkbook.Sheets(i).UsedRange.ClearComments
Next i
[/vba]

Автор - Manyasha
Дата добавления - 15.04.2016 в 14:42
koyaanisqatsi Дата: Пятница, 15.04.2016, 14:49 | Сообщение № 11
Группа: Проверенные
Ранг: Ветеран
Сообщений: 610
Репутация: 15 ±
Замечаний: 0% ±

Excel 2010
Manyasha, Спасибо. попробовал второй вариант. работает.
 
Ответить
СообщениеManyasha, Спасибо. попробовал второй вариант. работает.

Автор - koyaanisqatsi
Дата добавления - 15.04.2016 в 14:49
koyaanisqatsi Дата: Пятница, 15.04.2016, 15:17 | Сообщение № 12
Группа: Проверенные
Ранг: Ветеран
Сообщений: 610
Репутация: 15 ±
Замечаний: 0% ±

Excel 2010
SLAVICK,
А этот мокрос можно заточить под то чтобы он при копипасте тоже сохранял в пометку данные из ячейку куда копипаст произведен из другой ячейки ?

[vba]
Код

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim oComment As Comment
    On Error Resume Next
    Set oComment = Target.Comment
    If oComment Is Nothing Then
        Set oComment = Target.AddComment(Sheets(1).Cells(1, "b").Value & ": " & Target.Text & " " & Format(Now, "dd.mm.yy HH:MM"))
    Else
        oComment.Text oComment.Text & Chr(10) & Sheets(1).Cells(1, "b").Value & ": " & Target.Text & " " & Format(Now, "dd.mm.yy HH:MM")
        oComment.Shape.TextFrame.AutoSize = True
    End If
End Sub
[/vba]

Во вкладке овощи заполнил несколько ячеек. История отлично работает до того момента как вставляешь через копипаст в уже заполненую ячейку. В таком случае мы видим только кто сделал запись но что было до этого пропадает.
К сообщению приложен файл: 0350771.xlsb(33Kb)
 
Ответить
СообщениеSLAVICK,
А этот мокрос можно заточить под то чтобы он при копипасте тоже сохранял в пометку данные из ячейку куда копипаст произведен из другой ячейки ?

[vba]
Код

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim oComment As Comment
    On Error Resume Next
    Set oComment = Target.Comment
    If oComment Is Nothing Then
        Set oComment = Target.AddComment(Sheets(1).Cells(1, "b").Value & ": " & Target.Text & " " & Format(Now, "dd.mm.yy HH:MM"))
    Else
        oComment.Text oComment.Text & Chr(10) & Sheets(1).Cells(1, "b").Value & ": " & Target.Text & " " & Format(Now, "dd.mm.yy HH:MM")
        oComment.Shape.TextFrame.AutoSize = True
    End If
End Sub
[/vba]

Во вкладке овощи заполнил несколько ячеек. История отлично работает до того момента как вставляешь через копипаст в уже заполненую ячейку. В таком случае мы видим только кто сделал запись но что было до этого пропадает.

Автор - koyaanisqatsi
Дата добавления - 15.04.2016 в 15:17
SLAVICK Дата: Пятница, 15.04.2016, 15:31 | Сообщение № 13
Группа: Модераторы
Ранг: Старожил
Сообщений: 1849
Репутация: 614 ±
Замечаний: 0% ±

2007,2010,2013,2016
Так?:
[vba]
Код
Private s$
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim oComment As Comment
    On Error Resume Next
    Set oComment = Target.Comment
    If oComment Is Nothing Then
        Set oComment = Target.AddComment(Sheets(1).Cells(1, "b").Value & " " & Format(Now, "dd.mm.yy HH:MM") & ":" & Chr(10) & s & "-->>" & Target.Text)
    Else
        oComment.Text oComment.Text & Chr(10) & Sheets(1).Cells(1, "b").Value & " " & Format(Now, "dd.mm.yy HH:MM") & ":" & Chr(10) & s & "-->>" & Target.Text
        oComment.Shape.TextFrame.AutoSize = True
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
s = Target.Cells(1, 1)
End Sub
[/vba]
К сообщению приложен файл: 3111442.xlsb(37Kb)


Иногда все проще чем кажется с первого взгляда.
 
Ответить
СообщениеТак?:
[vba]
Код
Private s$
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim oComment As Comment
    On Error Resume Next
    Set oComment = Target.Comment
    If oComment Is Nothing Then
        Set oComment = Target.AddComment(Sheets(1).Cells(1, "b").Value & " " & Format(Now, "dd.mm.yy HH:MM") & ":" & Chr(10) & s & "-->>" & Target.Text)
    Else
        oComment.Text oComment.Text & Chr(10) & Sheets(1).Cells(1, "b").Value & " " & Format(Now, "dd.mm.yy HH:MM") & ":" & Chr(10) & s & "-->>" & Target.Text
        oComment.Shape.TextFrame.AutoSize = True
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
s = Target.Cells(1, 1)
End Sub
[/vba]

Автор - SLAVICK
Дата добавления - 15.04.2016 в 15:31
koyaanisqatsi Дата: Пятница, 15.04.2016, 16:05 | Сообщение № 14
Группа: Проверенные
Ранг: Ветеран
Сообщений: 610
Репутация: 15 ±
Замечаний: 0% ±

Excel 2010
SLAVICK, почти. Только срабатывает один раз. Но и так лучше чем ничего. И еще одно я дико извиняюсь. А можно имя брать не из данных кто пароль ввел и из данных с какого компа сделано изменение. Я как-то сразу не заметил что вы выбрали имя того кто зашел под определенным паролем. В многопользовательском режиме есть такая функция как журнал изменений когда его нажимаешь с определенной даты он показывает кто вносил данные. И берет имя из программы экселя (общая настройка/личная настройка пользователя/имя пользователя: **** ) того компьютера с которого было это изменение внесено. Этот вариант был бы значительно предпочтительнее. Людей много кто должен вносить данные а логины и пароли хотелось бы минимализировать. Хотя я могу и каждому раздать пароль с логином.
 
Ответить
СообщениеSLAVICK, почти. Только срабатывает один раз. Но и так лучше чем ничего. И еще одно я дико извиняюсь. А можно имя брать не из данных кто пароль ввел и из данных с какого компа сделано изменение. Я как-то сразу не заметил что вы выбрали имя того кто зашел под определенным паролем. В многопользовательском режиме есть такая функция как журнал изменений когда его нажимаешь с определенной даты он показывает кто вносил данные. И берет имя из программы экселя (общая настройка/личная настройка пользователя/имя пользователя: **** ) того компьютера с которого было это изменение внесено. Этот вариант был бы значительно предпочтительнее. Людей много кто должен вносить данные а логины и пароли хотелось бы минимализировать. Хотя я могу и каждому раздать пароль с логином.

Автор - koyaanisqatsi
Дата добавления - 15.04.2016 в 16:05
SLAVICK Дата: Пятница, 15.04.2016, 16:25 | Сообщение № 15
Группа: Модераторы
Ранг: Старожил
Сообщений: 1849
Репутация: 614 ±
Замечаний: 0% ±

2007,2010,2013,2016
. Только срабатывает один раз.

Что Вы имеете ввиду?
Я добавил вывод данных в виде:
[vba]
Код
Что было-->> что стало.
[/vba]
И берет имя из программы экселя

См. вложение - так?
К сообщению приложен файл: 7078094.xlsb(38Kb)


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщение
. Только срабатывает один раз.

Что Вы имеете ввиду?
Я добавил вывод данных в виде:
[vba]
Код
Что было-->> что стало.
[/vba]
И берет имя из программы экселя

См. вложение - так?

Автор - SLAVICK
Дата добавления - 15.04.2016 в 16:25
koyaanisqatsi Дата: Пятница, 15.04.2016, 16:39 | Сообщение № 16
Группа: Проверенные
Ранг: Ветеран
Сообщений: 610
Репутация: 15 ±
Замечаний: 0% ±

Excel 2010
SLAVICK, Да я понял что вы по исправлениям сделали. И история скидывается при повторном копипасте. Но это не беда. Все равно здорово.

По поводу имен. Если нажать на общий доступ к книге. То ну скажем можно будет раздать доступ человекам например 7-10 было бы логично ограничить группами доступ. Поэтому лучше выводить имя непосредственно которое забито в программе для данного человека компьютера. (общая настройка/личная настройка пользователя/имя пользователя: **** )

Если вы дадите общий доступ а потом внесете изменения и нажмете исправления вывести за сегодняшнее число и в графе кто будет указано ВСЕ то вы увидите наведя на ячейку где вносили изменение имя данное программе при установке. Оно задается тут (общая настройка/личная настройка пользователя/имя пользователя: **** )

Вот если это имя писать тогда все значительно легче становится.

Я посмотрел последний вариант почемуто у меня вообще перестало какоебыто нибыло имя выводится. У меня оффис 2010 если это важно.

А вы случайно не из виндовса пытаетесь брать имя ? Надо из программы самой Оффис 2010. Так можно ?


Сообщение отредактировал koyaanisqatsi - Пятница, 15.04.2016, 16:50
 
Ответить
СообщениеSLAVICK, Да я понял что вы по исправлениям сделали. И история скидывается при повторном копипасте. Но это не беда. Все равно здорово.

По поводу имен. Если нажать на общий доступ к книге. То ну скажем можно будет раздать доступ человекам например 7-10 было бы логично ограничить группами доступ. Поэтому лучше выводить имя непосредственно которое забито в программе для данного человека компьютера. (общая настройка/личная настройка пользователя/имя пользователя: **** )

Если вы дадите общий доступ а потом внесете изменения и нажмете исправления вывести за сегодняшнее число и в графе кто будет указано ВСЕ то вы увидите наведя на ячейку где вносили изменение имя данное программе при установке. Оно задается тут (общая настройка/личная настройка пользователя/имя пользователя: **** )

Вот если это имя писать тогда все значительно легче становится.

Я посмотрел последний вариант почемуто у меня вообще перестало какоебыто нибыло имя выводится. У меня оффис 2010 если это важно.

А вы случайно не из виндовса пытаетесь брать имя ? Надо из программы самой Оффис 2010. Так можно ?

Автор - koyaanisqatsi
Дата добавления - 15.04.2016 в 16:39
Roman777 Дата: Пятница, 15.04.2016, 16:41 | Сообщение № 17
Группа: Проверенные
Ранг: Ветеран
Сообщений: 703
Репутация: 75 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
SLAVICK, Добрый день, а не подскажите, зачем тут
[vba]
Код
Function GetUserName()
'WMI (Win32_ComputerSystem)
   Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
    For Each objItem In colItems
        strUserName = strUserName & "|" & objItem.UserName
    Next
    GetUserName = strUserName
    Exit Function
End Function
[/vba]
строчка
[vba]
Код
Exit Function
[/vba]?


Много чего не знаю!!!!
 
Ответить
СообщениеSLAVICK, Добрый день, а не подскажите, зачем тут
[vba]
Код
Function GetUserName()
'WMI (Win32_ComputerSystem)
   Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
    For Each objItem In colItems
        strUserName = strUserName & "|" & objItem.UserName
    Next
    GetUserName = strUserName
    Exit Function
End Function
[/vba]
строчка
[vba]
Код
Exit Function
[/vba]?

Автор - Roman777
Дата добавления - 15.04.2016 в 16:41
SLAVICK Дата: Пятница, 15.04.2016, 16:51 | Сообщение № 18
Группа: Модераторы
Ранг: Старожил
Сообщений: 1849
Репутация: 614 ±
Замечаний: 0% ±

2007,2010,2013,2016
Это кусок функции - просто лишнее удалил.
Там были несколько вариантов вывода информации.
Если интересно вот функция целиком :D :
[vba]
Код
Function GetUserName_2(Optional t%)
'Environment Variable
If t = 0 Then
    Set wshShell = CreateObject("WScript.Shell")
    strUserName = wshShell.ExpandEnvironmentStrings("%USERNAME%")
    GetUserName_2 = strUserName
    Exit Function
End If
'WshNetwork
If t = 1 Then
    Set wshNetwork = CreateObject("WScript.Network")
    strUserName = wshNetwork.UserName
    GetUserName_2 = strUserName
    Exit Function
End If
'ADSI (WinNTSystemInfo)
If t = 2 Then
    Set objSysInfo = CreateObject("WinNTSystemInfo")
    strUserName = objSysInfo.UserName
    GetUserName_2 = strUserName
    Exit Function
End If
'WMI (Win32_ComputerSystem)
If t = 3 Then
    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
    For Each objItem In colItems
        strUserName = strUserName & "|" & objItem.UserName
    Next
    GetUserName_2 = strUserName
    Exit Function
End If
End Function
[/vba]
Поэтому лучше выводить имя непосредственно которое забито в программе для данного человека

Попробуйте вышеприведенную функцию с разными параметрами t - что то подходит?
К сообщению приложен файл: 7078094-1-.xlsb(37Kb)


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Пятница, 15.04.2016, 17:00
 
Ответить
СообщениеЭто кусок функции - просто лишнее удалил.
Там были несколько вариантов вывода информации.
Если интересно вот функция целиком :D :
[vba]
Код
Function GetUserName_2(Optional t%)
'Environment Variable
If t = 0 Then
    Set wshShell = CreateObject("WScript.Shell")
    strUserName = wshShell.ExpandEnvironmentStrings("%USERNAME%")
    GetUserName_2 = strUserName
    Exit Function
End If
'WshNetwork
If t = 1 Then
    Set wshNetwork = CreateObject("WScript.Network")
    strUserName = wshNetwork.UserName
    GetUserName_2 = strUserName
    Exit Function
End If
'ADSI (WinNTSystemInfo)
If t = 2 Then
    Set objSysInfo = CreateObject("WinNTSystemInfo")
    strUserName = objSysInfo.UserName
    GetUserName_2 = strUserName
    Exit Function
End If
'WMI (Win32_ComputerSystem)
If t = 3 Then
    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
    For Each objItem In colItems
        strUserName = strUserName & "|" & objItem.UserName
    Next
    GetUserName_2 = strUserName
    Exit Function
End If
End Function
[/vba]
Поэтому лучше выводить имя непосредственно которое забито в программе для данного человека

Попробуйте вышеприведенную функцию с разными параметрами t - что то подходит?

Автор - SLAVICK
Дата добавления - 15.04.2016 в 16:51
koyaanisqatsi Дата: Пятница, 15.04.2016, 17:26 | Сообщение № 19
Группа: Проверенные
Ранг: Ветеран
Сообщений: 610
Репутация: 15 ±
Замечаний: 0% ±

Excel 2010
SLAVICK, последняя выдает пустоту все остальные выдают сетевое имя. В принципе думаю можно трансформировать сетевое имя в имя оператора компа.

На листе "Доп" выделил желтеньким сопоставление сетевых имен с именами людей. Теперь бы эту ячеку приделать к макросу который должен выдавать имя. к вот этой функции наверно [vba]
Код
strUserName
[/vba] ?
К сообщению приложен файл: 1111.xlsb(40Kb)


Сообщение отредактировал koyaanisqatsi - Пятница, 15.04.2016, 17:43
 
Ответить
СообщениеSLAVICK, последняя выдает пустоту все остальные выдают сетевое имя. В принципе думаю можно трансформировать сетевое имя в имя оператора компа.

На листе "Доп" выделил желтеньким сопоставление сетевых имен с именами людей. Теперь бы эту ячеку приделать к макросу который должен выдавать имя. к вот этой функции наверно [vba]
Код
strUserName
[/vba] ?

Автор - koyaanisqatsi
Дата добавления - 15.04.2016 в 17:26
SLAVICK Дата: Пятница, 15.04.2016, 18:06 | Сообщение № 20
Группа: Модераторы
Ранг: Старожил
Сообщений: 1849
Репутация: 614 ±
Замечаний: 0% ±

2007,2010,2013,2016
последняя выдает пустоту все остальные выдают сетевое имя.

А у меня первые 3-и выдают "Ярослав" а последняя имя компа|Ярослав :D
бы эту ячеку приделать к макросу который должен выдавать имя.

Попробуйте так:[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim oComment As Comment, un$
    On Error Resume Next
    Set oComment = Target.Comment
    un = WorksheetFunction.VLookup(GetUserName_3(2), Лист4.[A2:B999], 2, False)
    If oComment Is Nothing Then
        Set oComment = Target.AddComment(un & " " & Format(Now, "dd.mm.yy HH:MM") & ":" & Chr(10) & s & "-->>" & Target.Text)
        oComment.Shape.TextFrame.AutoSize = True
    Else
        oComment.Text oComment.Text & Chr(10) & un & " " & Format(Now, "dd.mm.yy HH:MM") & ":" & Chr(10) & s & "-->>" & Target.Text
        oComment.Shape.TextFrame.AutoSize = True
    End If
End Sub
[/vba]
Только не знаю какой номер в функции Вы используете.
В 1-м столбце - нужно указать имена, которые выдает функция у пользователей.

Зы если что - разговор смогу продолжить с понедельника. На даче у меня нет компа :(
К сообщению приложен файл: 8031436-1-.xlsb(37Kb)


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Пятница, 15.04.2016, 18:12
 
Ответить
Сообщение
последняя выдает пустоту все остальные выдают сетевое имя.

А у меня первые 3-и выдают "Ярослав" а последняя имя компа|Ярослав :D
бы эту ячеку приделать к макросу который должен выдавать имя.

Попробуйте так:[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim oComment As Comment, un$
    On Error Resume Next
    Set oComment = Target.Comment
    un = WorksheetFunction.VLookup(GetUserName_3(2), Лист4.[A2:B999], 2, False)
    If oComment Is Nothing Then
        Set oComment = Target.AddComment(un & " " & Format(Now, "dd.mm.yy HH:MM") & ":" & Chr(10) & s & "-->>" & Target.Text)
        oComment.Shape.TextFrame.AutoSize = True
    Else
        oComment.Text oComment.Text & Chr(10) & un & " " & Format(Now, "dd.mm.yy HH:MM") & ":" & Chr(10) & s & "-->>" & Target.Text
        oComment.Shape.TextFrame.AutoSize = True
    End If
End Sub
[/vba]
Только не знаю какой номер в функции Вы используете.
В 1-м столбце - нужно указать имена, которые выдает функция у пользователей.

Зы если что - разговор смогу продолжить с понедельника. На даче у меня нет компа :(

Автор - SLAVICK
Дата добавления - 15.04.2016 в 18:06
Мир MS Excel » Вопросы и решения » Вопросы по VBA » лог если данные изменены. (Макросы/Sub)
Страница 1 из 212»
Поиск:

Яндекс цитирования
© 2010-2016 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!