Всем привет! Есть проблема, с которой не смог справиться сам. Может кто-нибудь поможет... Есть защищенный лист. Есть диапазоны которые разрешены для ввода данных пользователем. Нужно чтобы при вводе копированием вставлялись только значения. Например, при копировании из защищенной ячейки вставляется только значение. Нужно чтобы аналогично работала вставка в незащищенную ячейку. Спасибо.
Всем привет! Есть проблема, с которой не смог справиться сам. Может кто-нибудь поможет... Есть защищенный лист. Есть диапазоны которые разрешены для ввода данных пользователем. Нужно чтобы при вводе копированием вставлялись только значения. Например, при копировании из защищенной ячейки вставляется только значение. Нужно чтобы аналогично работала вставка в незащищенную ячейку. Спасибо.globalist
Я думаю что это можно достичь только административными мерами. Т.е. уволить студентов-неучей и бабок, принять на работу толковых сотрудников. Т.к. может быть вот сюда я хочу скопировать формулу с форматом, а вот сюда только значение. И так и буду делать. Ну можно конечно после копирования макросом заменять формулы на значения, убивать форматы. Но правильнее сразу копировать только значения. К тому же есть случаи, когда формулу копировать нельзя - она вернёт другое значение.
Я думаю что это можно достичь только административными мерами. Т.е. уволить студентов-неучей и бабок, принять на работу толковых сотрудников. Т.к. может быть вот сюда я хочу скопировать формулу с форматом, а вот сюда только значение. И так и буду делать. Ну можно конечно после копирования макросом заменять формулы на значения, убивать форматы. Но правильнее сразу копировать только значения. К тому же есть случаи, когда формулу копировать нельзя - она вернёт другое значение.Hugo
уволить бабок и неучей - это, конечно, интересное решение, но нереальное к реализации Неужели нет программного решения? Это своего рода защита от дурака. Когда лист заполняют путем копирования из другого файла и просто вставляют на защищенный лист, то как правило ячейка тут же становится защищенной (т.к. в источнике она по умолчанию защищенная) и повторный ввод информации уже не возможен. Сам Excel же работает нужным образом, когда копируешь из защищенной ячейки, значит должен быть способ в макросе что-то подобное прописать... или я не прав?
уволить бабок и неучей - это, конечно, интересное решение, но нереальное к реализации Неужели нет программного решения? Это своего рода защита от дурака. Когда лист заполняют путем копирования из другого файла и просто вставляют на защищенный лист, то как правило ячейка тут же становится защищенной (т.к. в источнике она по умолчанию защищенная) и повторный ввод информации уже не возможен. Сам Excel же работает нужным образом, когда копируешь из защищенной ячейки, значит должен быть способ в макросе что-то подобное прописать... или я не прав?globalist
Т.е. Вы желаете, чтоб никогда ни при каких условиях нельзя было скопировать диапазоны с форматами и формулами, а можно было копировать только данные? Копируйте в блокнот Думаю это невозможно - что и правильно. Возможно достаточно вывести на панель кнопку "Paste Values" или/и "Paste Special" и обучить сотрудников.
Т.е. Вы желаете, чтоб никогда ни при каких условиях нельзя было скопировать диапазоны с форматами и формулами, а можно было копировать только данные? Копируйте в блокнот Думаю это невозможно - что и правильно. Возможно достаточно вывести на панель кнопку "Paste Values" или/и "Paste Special" и обучить сотрудников.Hugo
Опять я. Несмотря на то, что ответы не давали повода надеяться на успешное решение вопроса. Я сделал так (взял за основу запуск макроса по нажатию ENTER):
1. В модуле листа [vba]
Код
Private Sub Worksheet_Selectionchange(ByVal Target As Range) Application.OnKey "~", "StartEnter" Application.OnKey "{ENTER}", "StartEnter" Application.OnKey "{ENTER}" Application.OnKey "~" End Sub
[/vba]
2. В модуле (забыл как называется, не "Эта Книга") [vba]
Код
Sub StartEnter() Select Case Application.CutCopyMode Case Is = False ActiveCell.Cells(2).Activate Case Is <> False Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False End Select End Sub
[/vba]
Потестил - вроде работает как надо. Еще надо будет предусмотреть попытку ввода с мышки и с командной строки, но это позже. Нужна критика решения, что может поломать этот макрос, что я не учел и т.д. [admin] Оформляйте коды тегами![/admin]
Опять я. Несмотря на то, что ответы не давали повода надеяться на успешное решение вопроса. Я сделал так (взял за основу запуск макроса по нажатию ENTER):
1. В модуле листа [vba]
Код
Private Sub Worksheet_Selectionchange(ByVal Target As Range) Application.OnKey "~", "StartEnter" Application.OnKey "{ENTER}", "StartEnter" Application.OnKey "{ENTER}" Application.OnKey "~" End Sub
[/vba]
2. В модуле (забыл как называется, не "Эта Книга") [vba]
Код
Sub StartEnter() Select Case Application.CutCopyMode Case Is = False ActiveCell.Cells(2).Activate Case Is <> False Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False End Select End Sub
[/vba]
Потестил - вроде работает как надо. Еще надо будет предусмотреть попытку ввода с мышки и с командной строки, но это позже. Нужна критика решения, что может поломать этот макрос, что я не учел и т.д. [admin] Оформляйте коды тегами![/admin]globalist
Сообщение отредактировал globalist - Четверг, 06.06.2013, 18:52
после дополнительного тестирования, выяснилось, что макрос запускаемый при изменении листа как-то не всегда запускается, пришлось эмпирически выяснить как эти косяки заткнуть. конечный вариант получился такой (кроме того, вместо листа отнес все к книге, т.к. мне нужно для всего файла):
1. В модуле "эта книга" [vba]
Код
'этим убрал несработку макроса при первой вставке на защищенный лист сразу после открытия или после копирований и вставок в других книгах Private Sub Workbook_Activate() Application.OnKey "~", "StartEnter" Application.OnKey "{ENTER}", "StartEnter" End Sub
'ну это запуск макроса при нажатии ввода Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, _ ByVal Target As Range) Application.OnKey "~", "StartEnter" Application.OnKey "{ENTER}", "StartEnter" End Sub
'этим убрал ненужную сработку макроса при первой вставке в другой книге (даже при закрытой защищенной первая вставка все-равно запускала макрос и открывала защищенную книгу) Private Sub Workbook_Deactivate() Application.OnKey "~" Application.OnKey "{ENTER}" End Sub
[/vba]
2. в обычном модуле (сделал движение курсора на 1 ячейку как при обычном вводе, если не в режиме копирования + чтобы системные ошибки также выдавались как при обычной вставке, например при попытке вставки в защищенную ячейку)
[vba]
Код
Sub StartEnter() On Error GoTo en
Select Case Application.CutCopyMode Case Is = False ActiveCell.Cells(2).Activate Case Is <> False Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False End Select
Application.CutCopyMode = False GoTo en1 en: MsgBox Err.Description en1: End Sub
[/vba]
вроде работает
после дополнительного тестирования, выяснилось, что макрос запускаемый при изменении листа как-то не всегда запускается, пришлось эмпирически выяснить как эти косяки заткнуть. конечный вариант получился такой (кроме того, вместо листа отнес все к книге, т.к. мне нужно для всего файла):
1. В модуле "эта книга" [vba]
Код
'этим убрал несработку макроса при первой вставке на защищенный лист сразу после открытия или после копирований и вставок в других книгах Private Sub Workbook_Activate() Application.OnKey "~", "StartEnter" Application.OnKey "{ENTER}", "StartEnter" End Sub
'ну это запуск макроса при нажатии ввода Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, _ ByVal Target As Range) Application.OnKey "~", "StartEnter" Application.OnKey "{ENTER}", "StartEnter" End Sub
'этим убрал ненужную сработку макроса при первой вставке в другой книге (даже при закрытой защищенной первая вставка все-равно запускала макрос и открывала защищенную книгу) Private Sub Workbook_Deactivate() Application.OnKey "~" Application.OnKey "{ENTER}" End Sub
[/vba]
2. в обычном модуле (сделал движение курсора на 1 ячейку как при обычном вводе, если не в режиме копирования + чтобы системные ошибки также выдавались как при обычной вставке, например при попытке вставки в защищенную ячейку)
[vba]
Код
Sub StartEnter() On Error GoTo en
Select Case Application.CutCopyMode Case Is = False ActiveCell.Cells(2).Activate Case Is <> False Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False End Select
Application.CutCopyMode = False GoTo en1 en: MsgBox Err.Description en1: End Sub