Excel VBA .Find功能在选择中更改值

时间:2018-04-04 09:47:02

标签: excel vba excel-vba excel-2016

Heya这可能很简单,但我无法弄清楚出了什么问题。

我正在尝试为特定日期执行.find并将该选择更改为用户输入日期。

我有一个userform从组合框中选择一个日期(date1_cbo)。组合框源链接到工作表(后端)上的日期。下面有一个文本框,用于编写新日期以将其更改为(date1_txt)。我一直收到错误

  

对象变量或未设置块变量。

我尝试了一些没有运气的选项,这是我的代码:

Dim selection As Range
Dim check As Boolean

'input box validation
check = IsDate(date1_txt.Value)
If check = True Then
    'find cell matching combobox
    With Worksheets("Backend").Range("A1:A500")
        Set selection = .Find(date1_cbo.Value) 'this is the problem
        selection.Value = date1_txt.Value
    End With
Else
End If

有趣的是.Find返回范围或Nothing。然而,因为组合框与我正在搜索的细胞相关联,所以不应该返回任何内容......我不明白为什么会发生错误。

2 个答案:

答案 0 :(得分:2)

一个名为'selection'的变量是错误的编码实践,但完全合法。为清楚起见,请勿使用此类名称。

当您尝试从null对象读取属性(.value)时,会导致错误91。您的选择变量为空,因为工作表和组合框上的日期格式不同。

在尝试在工作表中找到它之前,只需转换为日期。 Set selection = .Find(CDate(date1_cbo.Value)) '/ once again, selection is valid but bad name for variable.

答案 1 :(得分:1)

您正在使用名为Selection的变量。 VBA也使用它。将您的变量重命名为其他任何内容,重写您的代码,它应该工作。即使Selection1也很好:

Public Sub TestMe()

    Dim selection1 As Range
    With Worksheets(1).Range("A1:A500")
        Set selection1 = .Find("vi")
    End With

    If Not selection Is Nothing Then
        selection1.Value = "some other value"
    End If

End Sub

要使用Find()更改多个值 - A1:A10,那么可能会这样做:

Public Sub TestMe()

    Dim myRng As Range

    With Worksheets(1).Range("A1:A500")
        .Range("A1:A10") = "vi"
        Set myRng = .Find("vi")
        If Not myRng Is Nothing Then
            Do Until myRng Is Nothing
                myRng.Value = "New value"
                Set myRng = .Find("vi")
            Loop
        End If
    End With

End Sub

它有点慢,只要它每次都循环而且可以改进,如果范围是统一的并立即替换。