0

私は自分ので使いOn Error Resume NextすぎていVBAます。それは怠惰な習慣です。

autofitシートがワークブックからまだ削除されていない場合、以下は特定の列になります-シートが削除されている場合、エラーが発生し、コンパイラはコードの次の行に移動します。

同じ結果を達成するために他にどのようなアプローチを使用できますか?

On Error Resume Next
    bkExampleWorkbook.Sheets("Foo").Columns("E:G").AutoFit
    bkExampleWorkbook.Sheets("Bar").Columns("K:M").AutoFit
On Error GoTo 0
4

1 に答える 1

4

同じシート名で作業していて、存在する場合にのみサイズを変更したい場合は、関数を使用して、存在するかどうかを簡単に確認し、存在する場合はサイズを変更できます。

基礎

Function AutoFitSheetRange(objWorkBook As Workbook, _
                           strSheetName As String, _
                           strSheetRange As String) As Boolean

    Dim sheet As Worksheet, boolSheetFound As Boolean
    For Each sheet In objWorkBook.Worksheets
        If sheet.Name Like strSheetName Then
            boolSheetFound = True
            Exit For
        End If
    Next
    If boolSheetFound Then
        objWorkBook.Sheets(strSheetName).Range(strSheetRange).AutoFit
        AutoFitSheetRange= True
    Else
        AutoFitSheetRange= False
    End If
End Function

それを使用する

次に、特定の範囲のサイズを変更する(および列として短縮する)ために、適切な方法でシートをループできます。

AutoFitSheetRange bkExampleWorkbook, "Foo", "E:G"
AutoFitSheetRange bkExampleWorkbook, "Bar", "K:M"

エラー処理を追加することを忘れないでください

エラー処理を取り除きたくはありませんが、関数がエラーを確実に処理できるようにしたいのですが、On Error Resume Nextよりもエレガントであり、望ましくない結果を引き起こす可能性があります。

'Error Handled version
Function AutoFitSheetRange(objWorkBook As Workbook, _
                           strSheetName As String, _
                           strSheetRange As String) As Boolean
On Error Goto AutoFitSheetRangeError

    Dim sheet As Worksheet, boolSheetFound As Boolean
    For Each sheet In objWorkBook.Worksheets
        If sheet.Name Like strSheetName Then
            boolSheetFound = True
            Exit For
        End If
    Next

    If boolSheetFound Then 'Resize the range!
        objWorkBook.Sheets(strSheetName).Range(strSheetRange).AutoFit
        AutoFitSheetRange = True
    Else
        AutoFitSheetRange = False
    End If

Exit Function ' No error hit so exit

AutoFitSheetRangeError:
    AutoFitSheetRange = False
    Debug.Print Err.Message 'Print out the debug error
End Function

柔軟なエラー応答!

これにより、エラーの発生に関係なく列のサイズが変更されたかどうかを柔軟に確認できるため、将来の決定が容易になります。

If AutoFitSheetRange(bkExampleWorkbook, "Foo", "E:G") Then
    MsgBox "I couldn't resize Foo! Doing nothing."
End If
If AutoFitSheetRange(bkExampleWorkbook, "Bar", "K:M") Then
    'Do something here
End If

これを自分でテストする機会はありませんでしたが、どうなるか教えてください。

編集:

@brettdjのコメントを踏まえて、シートの存在を確認する機能を分離して、もう少し簡潔にするのがベストだと思いました。シートが存在することを確認するだけの場合は、この関数で十分です。

'Error Handled version
Function SheetExists(objWorkBook As Workbook, strSheetName As String) As Boolean
On Error Goto SheetExistsError

    Dim sheet As Worksheet 
    For Each sheet In objWorkBook.Worksheets
        If sheet.Name Like strSheetName Then
            SheetExists = True
            Exit Function
        End If
    Next

SheetExistsError:
    SheetExists = False
    Debug.Print "Couldn't find sheet " & Err.Description 'Print out the debug error
End Function
于 2013-03-18T11:10:11.643 に答える