Неклейкая форма - PullRequest
       0

Неклейкая форма

0 голосов
/ 28 февраля 2020

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

Свойство .visible = false, кажется, достигает этого результат, за исключением того, что объект, естественно, невидим для пользователя ... Есть ли какие-либо средства для достижения того же поведения, но оставить объект видимым?

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

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

1 Ответ

2 голосов
/ 28 февраля 2020

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

Нет, это не так :) Вот кое-что из надстройки, которую я создаю для Excel.

Чтобы добиться того, что вы хотите, мы будем использовать очень простую технику. Но сначала вам нужно понять логи c, стоящие за этим кодом.

Откройте MS Excel, затем выберите Column, затем нажмите клавишу CTRL , а затем выберите Row, чтобы выбрать диапазон ( mimi c выделение *) 1016 * г). Это будет выглядеть примерно так:

enter image description here

То же самое можно сделать, используя Range("B:B,4:4").Select

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

Logi c:

  1. Получить имя столбца из выбора
  2. Получить строку из выбора
  3. Создать новый адрес выбора, например B:B,4:4
  4. Выбрать новый диапазон
  5. Активируйте (а не выбирайте) исходное выделение
  6. Используйте код при каждом нажатии на ячейку, чтобы мы использовали Worksheet_SelectionChange
  7. Важное примечание: Поскольку мы используем Worksheet_SelectionChange, нам придется выключить Events, иначе Activate (пункт 5 выше) снова выстрелит Worksheet_SelectionChange

Код:

Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim aCell As Range
    Dim colName As String
    Dim RowName As String
    Dim adr As String

    On Error GoTo Whoa
    Application.EnableEvents = False

    Set aCell = Selection

    colName = Split(Cells(, aCell.Column).Address, "$")(1) & _
              ":" & _
              Split(Cells(, aCell.Column).Address, "$")(1)

    RowName = aCell.Row & ":" & aCell.Row

    '~~> Creating a range in this format B:B,4:4
    adr = RowName & "," & colName

    Range(adr).Select

    aCell.Activate

Whoa:
   Application.EnableEvents = True
End Sub

В действии:

enter image description here

Важное примечание :

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

enter image description here

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