Я пытаюсь сохранить текущее значение ячейки в переменной, изменить ее новое значение на формулу, а затем отформатировать ячейку с помощью пользовательского типа хранимой переменной.
Например: Ячейка B3 говорит "Привет" «Привет» хранится в переменной sValue Ячейка B3 изменяется на равную D3 (= D3) Пользовательский тип формата завершен, чтобы по-прежнему читать «Hello».
Тем не менее, я получаю
Ошибка выполнения «13»:
Несоответствие типов
По значению.
Обновленный код на основе комментариев:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sValue As Long
If Not Intersect(Target, Range("B3:B41")) Is Nothing Then
sValue = Target.Value
Target.Formula = "=D" & Target.Row
Target.NumberFormat = Chr(34) & sValue & Chr(34)
End If
End Sub
Причина смещения в том, что когда я нажимаю ENTER, он выполняет скрипт в новой ячейке, когда я намереваюсь, чтобы он был в строке выше, которую я редактировал. Не уверен, как заставить его работать в текущей ячейке без изменения ячейки.
Это полезно знать, поэтому по существу измените ActiveCell.Value на Target.Value и Target.Formula.
правильно, используйте Target
вместо всех ActiveCell
и удалите Offset
Вам также нужно будет экранировать \
любую букву, которая используется в качестве короткой руки формата. Например H
это час и будет читаться как таковой. Таким образом, вам нужно будет сделать замену для каждого, который может быть использован, а это довольно много.
должно быть Target.NumberFormat =
Не уверен, что вы имеете в виду, я понимаю, что вы говорите о сокращении, но где это мешает в моем случае? Также все еще получаю ошибку в моей переменной.
см. мой последний комментарий об ошибке. например, Hello
будет выглядеть как {somenumber}ello
, где {somenumber}
будет числом от 0 до 23.
Я обновил пост новыми подробностями. Итак, я не могу просто сохранить значение ячейки в виде строки переменной?
Вы обновили код, но не проблема. Поскольку ошибка, вероятно, теперь другая.
Помогает ли то, что моя переменная всегда будет текстовой? Я думаю, что неправильно использовал Long.
Да, это должна быть строка, но она все равно не будет правильно отформатирована. Это исправит ошибку.
Поэтому я изменил его на String и получил ошибку времени выполнения «28»: недостаточно места в стеке.
Теперь вам нужно отключить события и снова включить после внесения изменений.
Кстати: я был неправ, что мне нужен побег.
судя по комментариям:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sValue As String
If Not Intersect(Target, Range("B3:B41")) Is Nothing Then
Application.EnableEvents = False
On Error GoTo safeout
sValue = Target.Value
Target.Formula = "=D" & Target.Row
Target.NumberFormat = Chr(34) & sValue & Chr(34)
End If
safeout:
Application.EnableEvents = True
End Sub
когда вы вручную меняете ячейку,
Target
будет ячейкой, которая только что изменилась, а не ячейкой, в которую вы только что вошли.