【问题标题】:Using Range.Replace method on protected sheet在受保护的工作表上使用 Range.Replace 方法
【发布时间】:2021-02-14 19:57:40
【问题描述】:

我最近在使用 Range.Replace 方法时遇到了一个问题。

'more code here
Worksheets(1).Range("A1:D10").Replace What:="x", Replacement:="", LookAt:=xlPart`
‘more code here`

在未受保护的工作表上,这可以按预期工作。但是在未受保护的工作表上没有进行任何更改,而且它在下一行停止并出现 1004 错误。

另外,奇怪的是,如果在范围内没有找到替换字符(示例中的“x”),一切都会正常进行而不会引发错误。

所以我的解决方法是在 Replace 行之前和之后取消保护/保护工作表。 该工作表受 UserInterfaceOnly = True 保护,因此我觉得需要解决方法令人费解。

我在运行 Windows 10 Pro ver 2004 build 19041.804 的 xl2003 和 xl 2010 上体验到相同的结果。

所以我想知道是不是有什么东西坏了,或者就是这样。

谢谢。

【问题讨论】:

  • @FaneDuru,感谢您的回复,这就是我正在做的。但正如我在帖子中所说,我会认为使用 UserInterfaceOnly = True 进行保护会使这变得不必要。
  • 在旧版本的 Excel 中,关闭工作簿后不会记住 UserInterfaceOnly,重新打开时必须重新应用它。我认为这已在最新版本中得到修复,但只是最近。这能解释清楚吗?
  • @SeniorMomentum 不,这里不是这种情况,打开工作簿时会重新应用 UserInterfaceOnly。还是谢谢。

标签: excel vba


【解决方案1】:

在受保护的工作表上替换

  • Range.Replace 不适用于受保护的工作表。
  • 尝试以下解决方法。您甚至不必解锁单元格。

守则

Sub replaceProtectedTest()
    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim ws As Worksheet: Set ws = wb.Worksheets("Sheet1")
    Dim rg As Range: Set rg = ws.Range("A1:D10")
    replaceProtected rg, "x", ""
    ' Or just:
    'replaceProtected ThisWorkbook.Worksheets("Sheet1").Range("A1:D10"), "x", ""
End Sub

Sub replaceProtected( _
        ByRef rg As Range, _
        ByVal SearchString As String, _
        ByVal ReplaceString As String, _
        Optional ByVal CompareMethod As VbCompareMethod = vbTextCompare)
    If Not rg Is Nothing Then
        Dim rCount As Long: rCount = rg.Rows.Count
        Dim cCount As Long: cCount = rg.Columns.Count
        Dim Data As Variant
        If rCount + cCount > 2 Then
            Data = rg.Value
        Else
            ReDim Data(1 To 1, 1 To 1): Data(1, 1) = rg.Value
        End If
        Dim r As Long
        Dim c As Long
        Dim cValue As Variant
        For r = 1 To rCount
            For c = 1 To cCount
                cValue = Data(r, c)
                If VarType(cValue) = vbString Then
                    Data(r, c) = Replace(cValue, SearchString, _
                        ReplaceString, , , CompareMethod)
                End If
            Next c
        Next r
        rg.Value = Data
    End If
End Sub

【讨论】:

  • “Range.Replace 不适用于受保护的工作表”。是的,我知道,我试图找出的是为什么它不适用于 UserInterfaceOnly = True。大多数事情都是这样,但这似乎是一个例外。到目前为止,我还没有遇到任何文档来支持这一点,但似乎是这样。虽然我很欣赏您对解决方法的建议,但我认为我的更简单,只需在上面添加一个 Sheets(x).Unprotect "Password:="pword" 语句和一个 Sheets(x).Protect Password:="pword", UserInterfaceOnly:=True 语句位于 Range.Replace 行下方。
猜你喜欢
  • 2016-11-24
  • 2015-05-03
  • 2015-05-16
  • 1970-01-01
  • 2018-03-11
  • 2022-01-23
  • 1970-01-01
  • 2019-04-20
  • 1970-01-01
相关资源
最近更新 更多