1

ワークブックの大規模なコレクション内の 3 つの特定のワークシートで、リンクされたすべてのセルをチェックボックスに再割り当てしようとしています。

私が持っているマクロは、開いているすべての本で正常に機能します。

Sub CheckBoxesControl()

On Error Resume Next

    Dim i As Long

    For i = 1 To 400
        Sheet4.CheckBoxes("Check Box " & i).LinkedCell = "ChkBoxOutput!AA" & i
        Sheet21.CheckBoxes("Check Box " & i).LinkedCell = "ChkBoxOutput!AB" & i
        Sheet22.CheckBoxes("Check Box " & i).LinkedCell = "ChkBoxOutput!AC" & i

    Next i

End Sub

ただし、これを多数のシートで実行したいので、次のことを試しました。

Sub CheckBoxesControl()

On Error Resume Next
    Dim path As String
    Dim file As String
    Dim wkbk As Workbook
    Dim i As Long


    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    path = "C:\file\path\"
    file = Dir(path)

    Do While Not file = ""
        Workbooks.Open (path & file)
        Set wkbk = ActiveWorkbook

    For i = 1 To 400
        Sheet4.CheckBoxes("Check Box " & i).LinkedCell = "ChkBoxOutput!AA" & i
        Sheet21.CheckBoxes("Check Box " & i).LinkedCell = "ChkBoxOutput!AB" & i
        Sheet22.CheckBoxes("Check Box " & i).LinkedCell = "ChkBoxOutput!AC" & i

    Next i

    wkbk.Save
    wkbk.Close
    file = Dir
    Loop

End Sub

マクロは確かに各ファイルを開いたり閉じたりし、エラーなしで実行されますが、望ましい効果はありません。

マクロを実行したシートのチェックボックスのみを変更します(明らかに保存を開いて他のすべてを閉じているにもかかわらず)。

アクティブなワークブックを正しく設定できていませんか?

編集 1: 修正案 (失敗)

コメントで提案された方法(失敗したことが判明):

Sub CheckBoxesControl()

On Error Resume Next
    Dim path As String
    Dim file As String
    Dim wkbk As Workbook
    Dim i As Long


    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    path = "C:\file\path\"
    file = Dir(path)

    Do While Not file = ""

        Set wkbk = Workbooks.Open(path & file)
    For i = 1 To 400
        wkbk.Sheet4.CheckBoxes("Check Box " & i).LinkedCell = "ChkBoxOutput!AA" & i
        wkbk.Sheet21.CheckBoxes("Check Box " & i).LinkedCell = "ChkBoxOutput!AB" & i
        wkbk.Sheet22.CheckBoxes("Check Box " & i).LinkedCell = "ChkBoxOutput!AC" & i
        If Err.Number <> 0 Then

        End If
    Next i

    wkbk.Save
    wkbk.Close
    file = Dir
    Loop

End Sub

EDIT 2: RESUME NEXT のエラーでの削除

無視するエラーを削除するための提案は、次のことを示しています: マクロがエラーを実行したとき:

実行時エラー 1004 特定の名前のアイテムが見つかりませんでした。

このエラーをデバッグすると、次の点が強調されます。

Sheet4.CheckBoxes("Check Box " & i).LinkedCell = "ChkBoxOutput!AA" & i

この問題が何であるかを理解していると思います:「1 から 400 の間で移動」ループを使用して、各ページのすべてのチェックボックスを確実にキャッチしていますが、それらのインスタンスのそれぞれにチェックボックスがありません (checkbox1 はたとえば、すべてのページに存在しません - 特にシート 4 には存在しません)

これが、最初に On error resume next を持っていた理由であることを今覚えています...しかし、完全に次の式ではなく、ループ内の次の「i」であるためには「next」が必要です。

4

1 に答える 1