Заполните ячейку VBA, если пользователь удалил содержимое - PullRequest
0 голосов
/ 21 февраля 2019

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

Теперь, если пользователь вводит свой собственный контент и затем снова удаляет его, ячейка пуста, чего я не хочу, так как это приведет только к путанице.

Я хочу написать макрос VBA, который распознает, удаляется ли содержимое ячейки в ранее объявленном диапазоне /пусто и если они удалены / пусто, то формула из другой (защищенной паролем и скрытой) ячейки должна быть скопирована в пустую ячейку.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim myRange As Range
Set myRange = Intersect(Range("F9:I108"), Target)    
If Not myRange Is Nothing Then

'I'm guessing something with WorksheetFunction and possibly CountA,
'but I don't know how to make it work

End If
End Sub

Формулы, которые следует вводить, если содержимоеячейка (или несколько ячеек) удаляется всегда в строке 117 (один и тот же лист).Например, если пользователь удаляет G50, то формула G117 должна быть скопирована в G50 так же, как вы обычно копируете формулы в Excel (поэтому, если в G117 есть не-$ - ссылка, указывающая на A117, она должна указывать на A50после того, как формула скопирована в G50).

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

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Вот еще один возможный ответ.Чтобы скопировать формулу и сохранить ее «относительную адресацию» формулы, вам необходимо скопировать ее с использованием нотации R1C1.Таким образом, быстрый саб для этого может выглядеть следующим образом:

Option Explicit

Sub RestoreFormula(ByRef emptyCell As Range)
    Dim formulaWS As Worksheet
    Dim formulaCell As Range
    Set formulaWS = ThisWorkbook.Sheets("Sheet1")
    Set formulaCell = formulaWS.Range("A17")
    emptyCell.FormulaR1C1 = formulaCell.FormulaR1C1
End Sub

Важной строкой здесь является emptyCell.FormulaR1C1 = formulaCell.FormulaR1C1 part.

Затем, в событии Worksheet_Change это может выглядеть следующим образом

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim checkRange As Range
    Set checkRange = ActiveSheet.Range("A1:A9")
    If Not Intersect(checkRange, Target) Is Nothing Then
        Dim changedCell As Range
        For Each changedCell In Target
            If IsEmpty(changedCell) Then
                RestoreFormula changedCell
            End If
        Next changedCell
    End If
End Sub
0 голосов
/ 22 февраля 2019

Если у кого-то еще есть такая же проблема и, возможно, он захочет использовать мое решение, которое представляет собой комбинацию предложений Питера и Гэри Студента (спасибо вам обоим):

Сначала я создал новый рабочий лист,в котором я скопировал все формулы, которые я хотел бы сохранить.Я обязательно скопировал их в ту же ячейку, что и в исходном листе.

Затем я добавил этот код к исходному листу:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

Dim Bereich1 As Range
Set Bereich1 = Range("F9:I108") 'Do NOT enter multiple, non-contiguous ranges here! It crashes Excel!
If Not Intersect(Bereich1, Target) Is Nothing Then
        Dim changedCell1 As Range
        For Each changedCell1 In Target
            If changedCell1 = "" Then
                changedCell1.Formula = Sheets("Tagebuch_secret").Range(changedCell1.Address).Formula
            End If
        Next changedCell1
End If

Dim Bereich2 As Range
Set Bereich2 = Range("E112") 'instead duplicate the code snippet
If Not Intersect(Bereich2, Target) Is Nothing Then
        Dim changedCell2 As Range
        For Each changedCell2 In Target
            If changedCell2 = "" Then
                changedCell2.Formula = Sheets("Tagebuch_secret").Range(changedCell2.Address).Formula
            End If
        Next changedCell2
End If

End Sub

Это прекрасно работает для каждого сценария, в которомсодержимое ячеек удаляется, если пользователь удаляет содержимое одной или нескольких ячеек!

Мой следующий шаг - сделать лист _secret очень скрытным, защитить паролем структуру рабочей книги и затем защитить мой проект vba паролем.,Тогда только люди, которые знают пароль (я), могут уничтожить мой файл:)

0 голосов
/ 21 февраля 2019

Вот очень простой пример, который включает только 3 ячеек, А1 , А2 и А3 ,Вы должны изменить это, чтобы приспособить ваши ячейки формулы.

Сначала мы создадим секретный рабочий лист (называемый secret) .Мы помещаем формулы от A1 до A3 из основного рабочего листа в секретный лист, но сохраняем их как Строки , а не Формулы :

enter image description here

Затем мы помещаем следующий макрос событий рабочего листа в основной лист:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range
    Set rng = Range("A1:A3")

    If Intersect(Target, rng) Is Nothing Then Exit Sub
    If Target.Count <> 1 Then Exit Sub
    If Target.Value <> "" Then Exit Sub

    Application.EnableEvents = False
        Target.Formula = Sheets("secret").Range(Target.Address).Value
    Application.EnableEvents = True

End Sub

Подмониторы изменяются натри ячейки, и если какая-либо из них будет очищена, эта формула будет восстановлена ​​из секретного рабочего листа.

Поскольку это код рабочего листа, очень просто установить и использовать автоматически:

  1. щелкните правой кнопкой мыши имя вкладки в нижней части окна Excel
  2. выберите Просмотр кода - откроется окно VBE
  3. , вставьте содержимое и закройтеОкно VBE

Если у вас есть какие-либо проблемы, сначала попробуйте его на пробном листе.

Если вы сохраните книгу, макрос будет сохранен вместе с ней.Если вы используете версию Excel более поздней, чем в 2003 году, вы должны сохранить файл как .xlsm, а не .xlsx

В удалить макрос:

  1. откройте окна VBE, как указано выше
  2. удалите код
  3. закройте окно VBE

Чтобы узнать больше о макросах в целом, см .:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

и

http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

Подробнее о макросах событий (код таблицы) см.

http://www.mvps.org/dmcritchie/excel/event.htm

Для работы должны быть включены макросы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...