1

いくつかの結合セルがあり、結合セルのままにしておく必要がある状況にあります。セルの結合が VBA で発生する問題は認識していますが、この状況ではやむを得ません。

ワークブック内のすべてのシートを保護するコードを書いていますが、特定の塗りつぶしのセルをロック解除したままにしています。もちろん、結合されたセルは、セルのロックを解除しようとすると問題を引き起こします。

したがって、私のコードは、セルに正しい塗りつぶしがあるかどうかを確認してから、セルが結合されているかどうかを確認します。結合された場合、MergeArea アドレスは文字列配列に格納され、結合されたセルは結合解除されてからロック解除されます。

これらの塗りつぶされたセルのシートの関連領域をチェックした後、配列に格納されているすべてのセル領域を再マージするようにループを設定しました。

ワークブック内の任意の 1 つのシートに対して実行すると (つまり、ActiveWorkbook.Worksheets の For Each WS なしで)、これはすべて正常に機能します。ただし、For Each WS ループを追加すると、シート上のセルが誤って結合され始めます。

コードは次のとおりです。

Sub ProtectSheets()
    Application.ScreenUpdating = False
    Dim LRow As Integer, count As Integer
    Dim reMerge() As String
    Dim WS As Worksheet


    For Each WS In ActiveWorkbook.Worksheets
        count = 0
        Erase reMerge
        With WS
            LRow = .Range("h" & .Rows.count).End(xlUp).Row

            For Each c In Range("A1:AF" & LRow)
                If c.Interior.Color = RGB(253, 233, 217) Then '~~ Check for cell fill
                    If c.MergeCells = True Then '~~ Check to see if merged
                        ReDim Preserve reMerge(count)
                        reMerge(count) = c.MergeArea.Address '~~Store mergearea address in array
                        count = count + 1
                        c.MergeCells = False
                    End If
                    c.Locked = False
                End If
            Next c

            For i = LBound(reMerge) To UBound(reMerge)  '~~ Remerge all cells that were originally merged
                .Range(reMerge(i)).Merge
            Next i

        End With
        WS.Protect Password:="xxxx", userinterfaceonly:=True
    Next WS
    Application.ScreenUpdating = True
End Sub
4

1 に答える 1

2

For Each c In Range("A1:AF" & LRow)として資格を取得してみてくださいFor Each c In .Range("A1:AF" & LRow)

説明、将来同様の問題に直面する可能性がある人のために:

引数を修飾しないRangeと、Excel は、ActiveSheet. Withブロック ( )内で作業しているためWith WS、 を追加すると、ループの反復ごとに、これがワークシート上のオブジェクトとして.修飾されます。RangeWS

ブロック内で作業していない場合はWith、Range オブジェクトを完全に修飾する必要があります (例:WS.Range("A1")またはSheets(1).Range("B52")など)。

于 2013-04-29T14:10:23.860 に答える