请参阅For循环中的单元格值的命名范围

时间:2017-02-16 12:19:20

标签: excel vba excel-vba range offset

下午好,

我的VBA上有点生疏,因为我已经开始学习其他语言的编程,所以我希望有人能够帮助我。

我要做什么

我有两张纸。一个是用户填写的表单页面,另一个(Sheet1 ....我没有命名)基本上是一个数据页面。

在Sheet1中,我有一个显示1或0的表,具体取决于表单上的范围是否具有特定选择。单元格值上的两列表示需要输入消息的范围。宏应该找到所有的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").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

编辑:

我已经设法通过定义一个名为NamedRange的字符串并使其等于old 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
                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部分的这个属性或方法。

2 个答案:

答案 0 :(得分: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,我已从当前单元格中删除了验证。

答案 1 :(得分: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

感谢您的帮助!