2017-02-16 23 views
1

Добрый день всем,См именованный диапазон от значения ячейки в For Loop

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

Что я Привязав делать

У меня есть два листа. Одна из них - это страница формы, которую заполняют пользователи, другая (Sheet1 .... я ее не называл) - это в основном страница данных.

Внутри Sheet1 У меня есть таблица, которая показывает 1 или 0 в зависимости от того, имеет ли диапазон в форме определенный выбор. Два столбца над значением ячейки определяют диапазон, для которого требуется входное сообщение. Предполагается, что Macro найдет все элементы 1, найдите именованный диапазон, содержащий два столбца и введя именованный диапазон. К сожалению, я продолжаю получать ошибку, связанную с Application или Object Defined. Мой код ниже:

PcentData = Sheets("Sheet1").Range("PcentData").Value 
    If PcentData > 0 Then 
     For Each pCell In Sheets("Sheet1").Range("PcentSwitch") 
      If pCell.Value = 1 Then 
       With Sheets("Payment-Deduction Form").Range(Cells(pCell.Row, pCell.Column + 2)).Validation 'Error here 
       .Add Type:=xlValidateInputOnly 
       .InputTitle = "Test" 
       .InputMessage = "Test" 

       End With 
      End If 

     Next pCell 
    End If 

EDIT:

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

Dim NamedRange As String 
PcentData = Sheets("Sheet1").Range("PcentData").Value 
    If PcentData > 0 Then 
     For Each pCell In Sheets("Sheet1").Range("PcentSwitch") 
      If pCell.Value = 1 Then 
       NamedRange = Sheets("Sheet1").Cells(pCell.Row, pCell.Column + 2).Value 
       MsgBox (Sheets("Sheet1").Cells(pCell.Row, pCell.Column + 2).Value) 
       With Sheets("Payment-Deduction Form").Range(NamedRange) 
        If .Validation Then .Validation.Delete 
        .Validation.Add /* Error Here */ Type:=xlValidateInputOnly 
        .InputTitle = "Test" 
        .InputMessage = "Test" 
       End With 
      End If 

     Next pCell 
    End If 

К сожалению, я получаю сообщение об ошибке. Объект не поддерживает это свойство или метод в разделе If .validation.

+0

Пробуйте: «С листами (« Форма вычета платежей »). Диапазон (листы (« Форма вычета платежей »). Ячейки (pCell.Row, pCell.Column + 2)). Validation' – Vityata

+0

Еще получить та же ошибка в той же строке, хотя я могу понять, почему это могло помочь. Было бы лучше иметь это в модуле, а не в листе? – JaayB

+1

Можете ли вы попробовать: «С листами (« Форма вычета платежей »). Ячейки (pCell.Row, pCell.Column + 2)). – Vityata

ответ

0

С помощью Vityata мне удалось найти решение моей проблемы. Проблема заключалась в том, что исходный цикл занимал позицию таблицы, которую я хотел найти с неправильного листа. Я сохранил это в переменной под названием «NamedRange» и подключил ее к оператору WITH вместо того, чтобы пытаться закодировать его непосредственно в Range().

Следующей проблемой была проверка данных. Кажется, он не любит иметь .Validation отдельно от оператора With, поэтому, если мне нужно сделать несколько изменений в ячейке, мне понадобятся несколько операторов With. Вот рабочий код:

Dim NamedRange As String 
PcentData = Sheets("Sheet1").Range("PcentData").Value 

    If PcentData > 0 Then 
     For Each pCell In Sheets("Sheet1").Range("PcentSwitch") 
      If pCell.Value = 1 Then 
       NamedRange = Sheets("Sheet1").Cells(pCell.Row, pCell.Column + 2).Value 
       With ThisWorkbook.Sheets("Payment-Deduction Form").Range(NamedRange).Validation 
        .Delete 
        .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator _ 
        :=xlBetween 
        .IgnoreBlank = True 
        .InCellDropdown = True 
        .InputTitle = "test" 
        .ErrorTitle = "" 
        .InputMessage = "test" 
        .ErrorMessage = "" 
        .ShowInput = True 
        .ShowError = True 
       End With 
      End If 

     Next pCell 
    End If 

Благодарим за помощь!

1

Возможно, вы можете попробовать, как это:

PcentData = Sheets("Sheet1").Range("PcentData").Value 
    If PcentData > 0 Then 
     For Each pCell In Sheets("Sheet1").Range("PcentSwitch") 
      If pCell.Value = 1 Then 
       With Sheets("Payment-Deduction Form").Cells(pCell.Row, pCell.Column + 2).validation 
        .delete 
        .Add Type:=xlValidateInputOnly 
        .InputTitle = "Test" 
        .InputMessage = "Test"  
       End With 
      End If  
     Next pCell 
    End If 

Я удалил .Range и я удалить проверку из текущей ячейки.

+0

Это будет работать, но появляется сообщение об ошибке: «Объект не поддерживает это свойство или метод». Я помещаю MsgBox (Листы («Форма вычитания платежа»). Ячейки (pCell.Row, pCell.Column + 1) .Value), которые появляются пустым. Поэтому он не получает именованный диапазон из таблицы ... По какой-то причине. – JaayB

+0

вы можете поместить в msgbox следующее: 'Таблицы (« Форма вычитания платежа »). Ячейки (pCell.Row, pCell.Column + 1).address' – Vityata

+0

Поставляется с $ V $ 2, который является правильным. Внутри этой ячейки (в Листе 1) указан именованный диапазон. Я предполагаю, что он пытается вытащить V2 из формы, которая пуста. – JaayB