【问题标题】:VBA Protected sheet prevents macro from replacing text but cells are not protectedVBA 受保护的工作表可防止宏替换文本,但单元格不受保护
【发布时间】:2021-11-30 01:32:57
【问题描述】:

所以我有这个宏:

Application.Goto (ActiveWorkbook.Sheets("Fetch").Range("C33"))

Range("C33").Value = text
Range("B3").Value = text

Cells.Replace What:="ÿþ", Replacement:="", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

Excel 工作表受到保护,但 C33 和 B3 两个单元格不受保护,因为我希望在这两个单元格中替换文本。

当我在工作表不受保护的情况下运行上述宏时,它可以完美运行。 它与将文本字符串导入 Excel 的脚本一起运行。

当我保护工作表时,宏不会替换文本而是保持不变。

基本上我只想运行宏,定位这两个单元格中的文本,将指定部分替换为空,然后保留其余部分,即使工作表受到保护。

【问题讨论】:

  • 您需要删除保护(ws.Unprotect),更新字段并重新保护(ws.Protect)
  • 1.您是否了解您的上述代码的作用,尤其是Replace 部分?它尝试从所有活动工作表单元格 中替换“ÿþ\”字符串。讨论中的两个单元格是否具有类似字符串的值? 2.“单元格不受保护”是什么意思,因为保护会阻止它们的文本替换?
  • @ceci Bad advice.
  • @GSerg 您可以在保护工作表时手动将单元格单独标记为不受保护。然后,当您保护整个工作表时,那些特定的单元格就会成为例外。

标签: excel vba replace


【解决方案1】:

假设:

  • 单元格 C33 和 B3 处于“提取”状态并且未锁定,并且
  • “Fetch”工作表受到保护

以下方法可行:

With ActiveWorkbook.Sheets("Fetch")

    Union(.Range("C33"), .Range("B3")).Replace What:="ÿþ", Replacement:="", LookAt:=xlPart, SearchOrder _
            :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
            
End With

如果这两个单元格已解锁,则无需移除工作表保护。


或者,您可以使用以下方法一次替换一个单元格:

With ActiveWorkbook.Sheets("Fetch")

    .Range("C33").Value = Replace(.Range("C33").Value, "ÿþ", "")
    .Range("B3").Value = Replace(.Range("B3").Value, "ÿþ", "")
            
End With

最后,现在我们对发生的事情以及文本如何到达那里有了更清晰的了解,以下可能是最简单的方法:

Sub ParentPath_Import_To_Excel()

    Dim myFile As String
    Dim text As String
    Dim textline As String

    myFile = "H:\Temp\PublicFolder-powershell\ParentPath-FETCH\fullpath_X.txt"
      
    Open myFile For Input As #1
        Do Until EOF(1)
            Line Input #1, textline
            text = text & textline
        Loop
    Close #1

    With ActiveWorkbook.Sheets("Fetch")
        .Range("C33").Value = Replace(text, "ÿþ", "")
        .Range("B3").Value = .Range("C33").Value
        .Range("B3").Activate
    End With
        
End Sub

如果在写入单元格时上述操作失败并出错,则说明您尚未解锁要写入的两个单元格。您可以在格式菜单中解锁一次单元格(这是最好的解决方案),或者您可以解锁整个工作表并在运行时重新锁定它 - 但这对于破解某种解决方案来说是一把大锤。

【讨论】:

    【解决方案2】:

    我决定使用 unprotect 方法,因为上面的联合建议在工作表受到保护时不起作用。

    所以我最终得到了以下结果:

    Sub ParentPath_Import_To_Excel()
    
        Dim myFile As String
        Dim text As String
        Dim textline As String
    
    myFile = "H:\Temp\PublicFolder-powershell\ParentPath-FETCH\fullpath_X.txt"
    
    Application.Goto (ActiveWorkbook.Sheets("Fetch").Range("C33"))
    
    Open myFile For Input As #1
    Do Until EOF(1)
        Line Input #1, textline
         text = text & textline
    Loop
    
    Close #1
    
    Application.Goto (ActiveWorkbook.Sheets("Fetch").Range("C33"))
    
    Range("C33").Value = text 'writes text to cell C33
    Range("B3").Value = text 'writes text to cell B3
    
    ActiveWorkbook.Sheets("Fetch").Unprotect  ' This removes the protection of the worksheet, so the search for the BOM-chars can be done, and changed.
    
    Cells.Replace What:="ÿþ", Replacement:="", LookAt:=xlPart, SearchOrder _
            :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    
    ActiveWorkbook.Sheets("Fetch").Protect ' This protects the worksheet again
    
    End Sub
    
    

    【讨论】:

    • 你还没有解决你的问题,你把它藏在了窗帘后面。这段代码并没有按照您的想法执行,而您在受保护单元格中遇到的错误表明了这一点。
    • 我的答案中的代码已经过测试,并且在受保护的工作表上运行良好。我可能会再试一次,确保这两个单元格都未设置锁定标志。
    • GSerg - 对于这种特殊情况,解锁工作表更容易,做我需要的然后再次锁定它。而且您使用 UNION 的解决方案不起作用,当工作表受到保护且单元格未锁定时,结果确实删除了 ÿþ。 CLR,它是一个文本字符串并且无关紧要,我更改了原始帖子以反映。我刚刚从原始文本文件中删除了反斜杠,ÿþ 仍然存在,因为它是不可见的“BOM”字符。当您使用 VBA 将文本字符串导入 Excel 时,它会以明文形式显示,因为原始 txt 文件是 Unicode。
    • 也许您错过了我回答的第一行? “假设:单元格 C33 和 B3 处于 'Fetch' 状态并且未锁定。” 如果它们未锁定,那么您可以写入/修改它们 - 不管表的保护状态。如果它们被锁定,那么当然,您需要解除对整个工作表的保护。如果我的假设不正确,请告诉我,我可以为您提供替代解决方案。当然,告诉我们您收到的错误以及代码中断的位置会有所帮助。
    • 不,我没有错过。它们没有被锁定,但您的脚本因同样的错误而失败......换句话说,没有从我想从其他受保护的工作表上删除的单元格中删除文本。
    猜你喜欢
    • 2018-03-11
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    相关资源
    最近更新 更多