繁体   English   中英

使用多个range.find和findnext()时未设置对象变量

[英]No Object Variable Set when using multiple range.find and findnext()

我正在尝试在另一个Range.Find中搜索人的名字,但我不断收到运行时错误91-对象变量或未设置块变量。 “ getPaid”内的“ rngFound”发生了某些情况。

Sub EmailClick()

Dim lastSeasonRow As Double
lastSeasonRow = Worksheets("Season 2014-2015").Range("A" & Worksheets("Season 2014-2015").Rows.Count).End(xlUp).Row

Dim lastSeasonEmailRow1 As Double
lastSeasonEmailRow1 = Worksheets("Email").Range("A" & Worksheets("Email").Rows.Count).End(xlUp).Row

Dim rng As Range
Dim rngFound As Range
Dim getPaid As Range
Dim ErrorEmail As String
Dim colMyCol As New Collection 'Our collection

For j = 2 To lastSeasonRow
    Set rng = Worksheets("Email").Range("A2:A" & lastSeasonEmailRow1)
    Set rngFound = rng.Find(Worksheets("Season 2014-2015").Cells(j, 1).Value)
    If Not rngFound Is Nothing Then
        ' If its Found
        If DoesItemExist(colMyCol, rngFound.Offset(0, 1).Value) = False Then
            'Check If Already completed swimmer's family
            Dim CountSwimmers As String
            CountSwimmers = Application.CountIf(Worksheets("Email").Range("C2:C" & lastSeasonEmailRow1), rngFound.Offset(0, 2).Value)
            If CountSwimmers > 1 Then
                For s = 1 To CountSwimmers
                    If s = 1 Then
                        'If first swimmer
                        Set rng = Worksheets("Email").Range("C2:C" & lastSeasonEmailRow1)
                        Set rngFound = rng.Find(rngFound.Offset(0, 2).Value)
                        Debug.Print rngFound.Offset(0, -2).Value
                        Set rngBFound = rngFound
                    Else
                        'Next swimmer in family
                        Set rngFound = rng.FindNext(rngFound)
                        Debug.Print rngFound.Offset(0, -2).Value
********************** When Debugging, above line is Highlighted.
                    End If
********************************' TODO: Grab Worksheet's Name with persons' name and get Money column**
                         Set getPaid = Worksheets("Season 2014-2015").Range("A2:A" & lastSeasonRow).Find(rngFound.Offset(0, -2).Value)
                        If Not getPaid Is Nothing Then
                            'If its found
                            If getPaid.Offset(0, 14).Value <> "" Then
                                'If they do owe money
                                Debug.Print getPaid.Offset(0, 14).Value
                            Else
                            End If
                        End If
                Next s

                'write name to list, if name in array skip it, when lastSeasonRow, remove array.
                colMyCol.Add (rngFound.Offset(0, -1).Value)


                'TODO: change values below to strings that will correspond with aboves combined values
                If rngFound.Value = "Michael" Then
                    Call Send_Email_Using_VBA(rngFound.Offset(0, 2).Value, rngFound.Offset(0, 1).Value, rngFound.Value, Worksheets("Season 2014-2015").Cells(j, 15).Value)
                End If
            Else
                Debug.Print rngFound.Value
                If Worksheets("Season 2014-2015").Cells(j, 15).Value <> "" Then
                'If they do owe money
                    If rngFound.Offset(0, 3).Value <> "" Then
                    'if multiple emails (primary and cc)
                        If rngFound.Value = "Michael" Then
                            Call Send_Email_Using_VBA(rngFound.Offset(0, 2).Value, rngFound.Offset(0, 1).Value, rngFound.Value, Worksheets("Season 2014-2015").Cells(j, 15).Value, rngFound.Offset(0, 3).Value)
                        End If
                    Else
                        If rngFound.Value = "Michael" Then
                            Call Send_Email_Using_VBA(rngFound.Offset(0, 2).Value, rngFound.Offset(0, 1).Value, rngFound.Value, Worksheets("Season 2014-2015").Cells(j, 15).Value)
                        End If
                    End If
                End If
            End If
        End If
    Else
        ErrorEmail = ErrorEmail + Worksheets("Season 2014-2015").Cells(j, 1).Value + vbNewLine
    End If
Next j

If ErrorEmail <> "" Then
    MsgBox ("No Email Found For: " & vbNewLine & ErrorEmail)
End If

End Sub

谢谢

编辑:添加图像以供数据参考:

电子邮件工作表 电子邮件工作表


2014-2015赛季WorkSheet 2014-2015赛季WorkSheet

对于此建议的解决方案,您将需要将getPaid变量更改为long类型并添加一个double类型的变量(例如getPaid )。

Dim getPaid As Long, gotPaid As Double

更改下面的代码部分。

    Set getPaid = Worksheets("Season 2014-2015").Range("A2:A" & lastSeasonRow).Find(rngFound.Offset(0, -2).Value)
    If Not getPaid Is Nothing Then
        'If its found
        If getPaid.Offset(0, 14).Value <> "" Then
            'If they do owe money
            Debug.Print getPaid.Offset(0, 14).Value
        Else
        End If
    End If

对此。

    With Worksheets("Season 2014-2015")
        gotPaid = Application.SumIfs(.Columns("O"), .Columns("A"), rngFound.Offset(0, -2).Value)
        getPaid = Application.CountIfs(.Columns("A"), rngFound.Offset(0, -2).Value)
        If CBool(getPaid) Then
            'If its found
            If CBool(gotPaid) Then
                'If they do owe money
                Debug.Print rngFound.Offset(0, -2).Value & ": " & gotPaid
            Else
            End If
        End If
    End With

通过改组第二个查找操作,您无需重新定义第一个查找操作, .FindNext应该继续运行,直到您达到CountSwimmers编号为止。 或者,您可以通过不重用相同的变量来做到这一点,但是工作表功能在这里应该可以正常工作。

由于您的专业帮助程序功能(如DidItemExist),因此无法测试,但可以编译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM