2

Excel 2007でレポートを解析しようとしています。これは、基本的には会計手数料の例外のレポートです。レポートには、例外のタイプごとにヘッダーが付いたセクションがあります。レポートから削除される例外の種類があります。Do Whileループを使用して各ヘッダーを検索していますが、セクションを削除する必要がある場合は、削除する必要があります。何も削除する必要がない場合、コードは正常に機能しますが、セクションが削除された直後に、「範囲クラスのFindNextプロパティを取得できません」というエラーが発生します。これが私のコードです:

Sub merge_All_Section_Headers()
' Description:
' The next portion macro will find and format the Tranaction Source rows in the file
' by checking each row in column A for the following text: TRANSA.  If a cell
' has this text in it, it is selected and a function called merge_text_cells
' is run, which performs concatenation of each Transaction Source header row and
' deletes the text from the rest of the cells with broken up text.
'
lastRow = ActiveSheet.UsedRange.Rows.Count + 1
Range(lastRow & ":" & lastRow).Delete

ActiveSheet.PageSetup.Orientation = xlLandscape

With ActiveSheet.Range("A:A")
   Dim searchString As String

   searchString = "TRANSA"

   'The following sets stringFound to either true or false based on whether or not
   'the searchString (TRANSA) is found or not):
   Set stringFound = .Find(searchString, LookIn:=xlValues, lookat:=xlPart)

   If Not stringFound Is Nothing Then

      firstLocation = stringFound.Address

      Do
         stringFound.Select

         lastFound = stringFound.Address

         merge_Text_Cells

         If ((InStr(ActiveCell.Text, "CHARGE FILER") = 0) And _
             (InStr(ActiveCell.Text, "CREDIT FILER") = 0) And _
             (InStr(ActiveCell.Text, "PA MIDNIGHT FINAL") = 0) And _
             (InStr(ActiveCell.Text, "BAD DEBT TURNOVER") = 0)) Then

            section_Del 'Function that deletes unwanted sections

         End If

         Range(lastFound).Select

         Set stringFound = .FindNext(stringFound)

       Loop While Not stringFound Is Nothing And stringFound.Address <> firstLocation

     End If

End With
  '-----------------------------------------------------------------------------------
  'BELOW CONTAINS THE CODE THAT WORKS:
   Sub merge_All_Section_Headers()
   ' Description:
   ' The next portion macro will find and format the Tranaction Source rows in the file
   ' by checking each row in column A for the following text: TRANSA.  If a cell
   ' has this text in it, it is selected and a function called merge_text_cells
   ' is run, which performs concatenation of each Transaction Source header row and deletes
   ' the text from the rest of the cells with broken up text.
   '
   lastRow = ActiveSheet.UsedRange.Rows.Count + 1
   Range(lastRow & ":" & lastRow).Delete

   ActiveSheet.PageSetup.Orientation = xlLandscape

   With ActiveSheet.Range("A:A")
       Dim searchString As String
       Dim arrRangesToDelete(0 To 9) As Range

       searchString = "TRANSA"

       'The following sets stringFound to either true or false based on whether or not
       'the searchString (TRANSA) is found or not):
        Set stringFound = .Find(searchString, LookIn:=xlValues, lookat:=xlPart)

        If Not stringFound Is Nothing Then

           firstLocation = stringFound.Address

           counter = 0

           Do

              stringFound.Select

              lastFound = stringFound.Address

              merge_Text_Cells

              If ((InStr(ActiveCell.Text, "CHARGE FILER") = 0) And _
                  (InStr(ActiveCell.Text, "CREDIT FILER") = 0) And _
                  (InStr(ActiveCell.Text, "PA MIDNIGHT FINAL") = 0) And _
                  (InStr(ActiveCell.Text, "BAD DEBT TURNOVER") = 0)) Then

                  firstRowOfSection = ActiveCell.Row

                  lastRowOfSection = (ActiveSheet.Range(ActiveCell.Offset(2, 1).Address).End(xlDown).Row + 2)

                  Set arrRangesToDelete(counter) = Range(firstRowOfSection & ":" & lastRowOfSection)

                  counter = counter + 1

              End If

              Range(lastFound).Select

              Set stringFound = .FindNext(stringFound)

           Loop While Not stringFound Is Nothing And stringFound.Address <> firstLocation

        End If

   End With

   For i = 0 To counter - 1

       arrRangesToDelete(i).Delete

   Next i

   Range(firstLocation).Select

End Sub

したがって、配列はオブジェクトを破壊することなく機能し、その役割を果たします。私はまだユニオンメソッドを試して、それが機能するかどうかを確認したいと思っています。これもクールです。

4

2 に答える 2

3

の範囲オブジェクトStrFoundが破棄されたため、コードがフォールオーバーIs Nothingします。

提案されたbuJuriのエラー処理には、いくつかの選択肢があります(使用する場合は、すぐにリセットする必要があります)

ユニオンアプローチ

Sub UnionAPp()
Dim c As Range
Dim rng1 As Range
With Worksheets(1).Range("a1:a500")
    Set c = .Find(2, LookIn:=xlValues)
    If Not c Is Nothing Then
        firstaddress = c.Address
        Set rng1 = c
        Do
            Set c = .FindNext(c)
            Set rng1 = Union(rng1, c)
        Loop While c.Address <> firstaddress
    End If
    MsgBox "Your working range is " & rng1.Address
End With
End Sub

FindNextしたがって、からの標準のExcelヘルプを変更できます

標準

Sub TestInit()
With Worksheets(1).Range("a1:a500")
    Set c = .Find(2, LookIn:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            c.Value = 5
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With
End Sub

新着

Sub TestA()
With Worksheets(1).Range("a1:a500")
    Set c = .Find(2, LookIn:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            c.Value = 5
            Set c = .FindNext(c)
            If Not c Is Nothing Then c.Clear
            'your code: If Not StrFound Is Nothing Then Call Section_Del
        Loop While Not c Is Nothing
    End If
End With
End Sub
于 2012-11-11T00:27:28.920 に答える
0

すべてのオカレンスが削除された場合Findnext、エラーが発生するはずです。

ライン

On Error Goto ExitLoop

の前に追加する必要がありますSet stringFound = .FindNext(stringFound)

ライン

ExitLoop:

後に追加する必要がありますLoop While...

于 2012-11-10T22:51:08.740 に答える