1

私は VBA エラー 91 という奇妙な問題に直面しました。他の多くの人がオブジェクトにキーワード「Set」を使用しなかったためにこの問題を抱えているのを見ましたが、私の場合はそうではありませんでした。

以下は私のコードです:

Dim eventWS As Worksheet
Set eventWS = Worksheets("Event Sheet")

Dim eventRange As Range
Set eventRange = eventWS.Columns("A:A").Find(240, , xlValues, xlWhole)

If Not eventRange Is Nothing Then 

      Dim eventFirstAddress As String 
      eventFirstAddress = eventRange.Address 

      Do 
         If eventWS.Range("L" & eventRange.Row).Value = busId Then 
              If commuter = True Then 
                 Count = Count + Affected(eventWS.Range("Q" & eventRange.Row).Value)
              Else
                 Count = Count + 1
              End If 
         End If 
         MsgBox("Before call move next: " & eventRange.Row )
         Set eventRange = eventWS.Columns("A:A").FindNext(eventRange)
         MsgBox("After call move next: " & eventRange.Row )
      Loop While Not eventRange Is Nothing And eventRange.Address <> eventFirstAddress 
End If

Affected() は、内部処理を行うために呼び出すことができる関数です。そして、この "Count = Count + Affected(....)" を削除すると、コードは正常に機能していました。これを追加すると、"Loop While" でエラー 91 がスローされます。eventRange の移動前後の行番号を出力するメッセージ ボックスを追加すると、"MsgBox("After call move next: " & eventRange.Row )" はエラー 91 をスローします。

したがって、問題が内部関数または eventRange によって引き起こされているかどうかはわかりません。誰かが私の間違いを指摘してくれることを願っています。どうもありがとうございました。

内部関数のコードは次のとおりです。

Function Affected(markerId As Integer) As Integer

'initialized return value'
AffectedCoummters = 0

'get total financial sheets'
Dim totalFinancial As Integer
totalFinancial = 0
For Each ws In Worksheets
    If InStr(ws.Name, "Financial") > 0 Then
        totalFinancial = totalFinancial + 1
    End If
Next

Dim i As Integer
'run through all financial sheets'
For i = 1 To totalFinancial

    'get current financial sheet'
    Dim financialWS As Worksheet
    Set financialWS = Worksheets("Financial Sheet" & i)

    'get total rows of current operation sheet'
    Dim rowSize As Long
    rowSize = financialWS.Range("A" & financialWS.Rows.Count).End(xlUp).Row

    'if reach the maximum number of rows, the value will be 1'
    'reInitialize rowSize based on version of Excel'
    If rowSize = 1 Then
        If Application.Version = "12.0" Then
            'MsgBox ("You are using Excel 2007")'
            If InStr(ThisWorkbook.Name, ".xlsx") > 0 Then
                rowSize = 1048576
            Else
                'compatible mode'
                rowSize = 65536
            End If
        ElseIf Application.Version = "11.0" Then
            'MsgBox ("You are using Excel 2003")'
            rowSize = 65536
        End If
    End If

    'filter by marker id first inside current financial sheet'
    Dim findMarker As Range
    Set findMarker = financialWS.Columns("K:K").Find(markerId, , xlValues, xlWhole)

    'if found any given marker id'
    If Not findMarker Is Nothing Then

        Dim firstAddress As String
        firstAddress = findMarker.Address

        'check all matched marker id'
        Do

                    AffectedCommuters = AffectedCommuters + financialWS.Range("O" & findMarker.Row).Value

            'move to next'
            Set findMarker = financialWS.Columns("K:K").FindNext(findMarker)

        Loop While Not findMarker Is Nothing And findMarker.Address <> firstAddress

    End If

Next i

End Function
4

1 に答える 1

1

申し訳ありませんが、コメントするのに十分な担当者がいないので、ここで答える必要があります:(使用するのは標準的な手順ですが、それを言いたいだけです

 Loop While Not eventRange Is Nothing And eventRange.Address <> eventFirstAddress 

このタイプのプロシージャでは、eventRange が実際に Nothing の場合、eventRange.address が存在しないため、この行はエラー 91 をスローします。これが意味することは、一度何かを見つけたら、.findnext を使用して再び見つからないように行を変更することはできないということです。

do...ループを終了した後、範囲を適切に変更できます...おそらく、配列を使用して.find...findnextの結果からすべての行を保持し、Doの後にそれらを操作したいでしょう。 ..ループ

于 2013-04-14T15:19:33.820 に答える