2015-12-04 4 views
-1

Я написал очень простой код для перемещения кучки ячеек на один блок влево или вправо с помощью кнопок. Проблема в том, что я не хочу, чтобы пользователь мог перемещать ячейку дважды в одном направлении. Для этого мне нужно добавить скрытое свойство в ячейку, которое можно использовать для проверки того, был ли он уже перенесен из исходной позиции и сохранить эту информацию, когда файл закрыт и снова открыт.Excel VBA: Добавить скрытую информацию/свойство в ячейку

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

Было бы достаточно, если бы я мог установить это свойство равным -1, 0 или +1 в зависимости от того, был ли он перемещен влево, центрирован или перемещен вправо. Я знаю, что могу использовать свойство comment, но я бы предпочел использовать для этого скрытое свойство.

Есть ли чистый способ сделать это? Любое предложение будет оценено по достоинству.

+0

Что такое код выполняет ход? – shg

+0

Я вижу движущиеся ячейки слева или справа, но как выглядит «центрирование»? –

+0

ActiveCell.MergeArea.Cut ... ActiveCell.Offset (0, 1) .Activate ... ActiveSheet.Paste ... Я использую MergeArea, потому что ячейка, которую я перемещаю, объединяется –

ответ

1

Один из способов - создать скрытый Name s на листе, используя определенное соглашение об именах, чтобы сохранить значение статуса перемещения.

Логика потока будет:

  • На попытке переместить ячейку, проверьте, если имя существует для этой ячейки
  • , если нет, то ячейка не ранее были перемещены, таким образом разрешить движение
  • если да, получите значение имени, чтобы проверить, разрешен ли перемещение.

.

  • Если движение выполняется:
  • если имя alerady существует, обновить его значение
  • если нет, то создать и заданное значение

фрагменты Пример кода:

Sub SetHiddenName(r As Range, v As Long) 
    Dim nm As Name 
    On Error Resume Next 
    Set nm = r.Worksheet.Names("__" & r.Address(0, 0)) 
    On Error GoTo 0 
    If nm Is Nothing Then 
     Set nm = r.Worksheet.Names.Add(Name:="__" & r.Address(0, 0), _ 
     RefersTo:=v, _ 
     Visible:=False) 
    Else 
     nm.RefersTo = v 
    End If 
End Sub 


Function GetValueOfName(r As Range) As Variant 
    Dim nm As Name 
    On Error Resume Next 
    Set nm = r.Worksheet.Names("__" & r.Address(0, 0)) 
    On Error GoTo 0 
    If nm Is Nothing Then 
     ' Return required value for not previously set range 
     GetValueOfName = "" 
    else 
     GetValueOfName = nm.RefersTo 
    End If 
End Function 
+0

Я пробовал это сегодня, хотя кажется, что он работает с одной ячейкой, когда я переключаюсь между листами или перемещаю одну ячейку, а затем выбираю другую и пытаюсь ее переместить, появляется это сообщение об ошибке: временная ошибка '' 1004 '': Определенная пользователем или объектная ошибка. ' .. Btw в вашем коде, информация, которую я хочу сохранить, хранится в RefersTo, а не в названии, так что r - это ячейка, в которой я перемещаюсь, и v - это информация, верно? –

+0

Ответ: _not_ полное решение, а скорее подход, который вы можете использовать для хранения скрытых данных. Вам нужно будет создать решение вокруг него. Управление именами, именами имен и хранящимися данными остаются для вас ... –

Смежные вопросы