Excel VBA: форматирование на основе формата другой ячейки, ошибка метода получения - PullRequest
0 голосов
/ 15 января 2019

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

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

Я взял код из этой темы, что по сути является результатом, которого я хочу достичь, за исключением того, что его ключ находится на том же листе, а мой не может быть: https://superuser.com/questions/472918/excel-conditionally-format-a-cell-using-the-format-of-another-content-matching

Пока что я скомпилировал это:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

If VarType(Target) > vbArray Then Exit Sub
' if multiple cells are changed at once, then exit

Dim kr1 As Range
Dim kr2 As Range
Dim KeyRange As Range
Dim TargetRange As Range
Dim lCell As Object
Dim kCell As Object

Set kr1 = Application.Range("ESFormattingRange")
Set kr2 = Application.Range("CSFormattingRange")
Set KeyRange = Application.Union(Range("kr1"), Range("kr2"))
' formatting key is here
Set TargetRange = ThisWorkbook.Worksheet("Sheet3").Range("A:X")
' changing cells in this area

For Each kCell In KeyRange.Cells
 If kCell.Value <> "" Then
  For Each lCell In TargetRange.Cells
    If lCell.Value = kCell.Value Then
    ' only change cells that match the edited cell
        lCell.Font.Color = kCell.Font.Color
        lCell.Interior.Color = kCell.Interior.Color
        ' copy whatever you feel needs to be copied
    End If
  Next
  End If
Next

End Sub

Когда я запускаю это, я получаю следующую ошибку метода, но при попытке отладки строки не выделяются:

Ошибка компиляции: Метод или элемент данных не найден

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

Любая помощь очень ценится!

1 Ответ

0 голосов
/ 15 января 2019

VBE должен выделять слово Worksheet в ThisWorkbook.Worksheet("Sheet3").Range("A:X").

«Метод или элемент данных не найден» означает, что Worksheet не является членом ThisWorkbook.

Вы можете исправить это, нажав CTRL + SPACE , чтобы автоматически заполнить имя члена до Worksheets.

В качестве альтернативы, вы можете повторно ввести оператор разыменования . после ThisWorkbook и нажать TAB , когда отобразится раскрывающийся список со списком имен, выделив элемент Worksheets, что также приведет к автозаполнению имя члена Worksheets.

Правило большого пальца: если вы введете оператор разыменования ., а затем введете что-то, чего нет в списке имен, вы можете ожидать эту ошибку компиляции.

Когда вы делаете эту опечатку для переменной Variant или Object, код скомпилируется с радостью, но ошибка 438 будет выдана во время выполнения - как это:

ThisWorkbook.Worksheets("Sheet3").Ragne("A:X") ' <~ typo compiles. Option Explicit can't save you.

Причина в том, что Worksheets возвращает ссылку Object, поэтому любые вызовы членов, связанные с ней, разрешаются во время выполнения. Более безопасный способ написания кода - объявить локальную переменную Worksheet для хранения этого объекта, а затем вместо этого работать с этим объектом:

Dim sourceSheet As Worksheet
Set sourceSheet = ThisWorkbook.Worksheets("Sheet3")

sourceSheet.Rnage("A:X") ' <~ typo throws at compile-time now!

Если объект рабочего листа существует в ThisWorkbook во время компиляции, то, вероятно, лучше вместо этого работать с кодовым именем . Найдите Sheet3 в Project Explorer ( CTRL + R), затем найдите его свойство (Name) - измените его, например, на. SourceSheet. И тогда вы можете сделать это:

SourceSheet.Range("A:X") ' <~ a typo wouldn't compile here.

... без необходимости явно объявлять SourceSheet.

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