当工作表受到保护时,宏不起作用。运行宏返回运行时错误 1004

2023-12-08

我的工作簿中有三个工作正常的宏。但是,当我保护任何工作表时,它们会停止工作,并且我会得到一个run-time error 1004.

我尝试按照网上找到的两个建议进行操作:

  • 在宏代码开始处取消保护,在宏代码结束处保护;
  • 仅用户界面),但运行时错误仍然存​​在。

我需要保护我的工作簿并让我的宏发挥作用,我该怎么办?

Macro 1:

Sub Macro1()

Dim historyWks As Worksheet
Dim inputWks As Worksheet

Dim nextRow As Long
Dim oCol As Long

Dim myCopy As Range
Dim myTest As Range

Dim lRsp As Long

Set inputWks = Worksheets("Visit & Order Entry Form")
Set historyWks = Worksheets("Visit & Order Database")

'check for duplicate order ID in database
If inputWks.Range("CheckID2") = True Then
  lRsp = MsgBox("Clinic ID already in database. Update database?", vbQuestion + vbYesNo, "Duplicate ID")
  If lRsp = vbYes Then
    UpdateLogRecord
  Else
    MsgBox "Please change Clinic ID to a unique number."
  End If

Else

  'cells to copy from Input sheet - some contain formulas
  Set myCopy = inputWks.Range("OrderEntry2")

  With historyWks
      nextRow = .Cells(.Rows.Count, "A").End(xlUp).Offset(1, 0).Row
  End With

  With inputWks
      Set myTest = myCopy.Offset(0, 2)

      If Application.Count(myTest) > 0 Then
          MsgBox "Please fill in all the cells!"
          Exit Sub
      End If
  End With

  With historyWks
      With .Cells(nextRow, "A")
          .Value = Now
          .NumberFormat = "mm/dd/yyyy hh:mm:ss"
      End With
      .Cells(nextRow, "B").Value = Application.UserName
      oCol = 3
      myCopy.Copy
      .Cells(nextRow, 3).PasteSpecial Paste:=xlPasteValues, Transpose:=True
      Application.CutCopyMode = False
  End With

  'clear input cells that contain constants
  With inputWks
    On Error Resume Next
       With myCopy.Cells.SpecialCells(xlCellTypeConstants)
            .ClearContents
            Application.GoTo .Cells(1) ', Scroll:=True
       End With
    On Error GoTo 0
  End With
End If

End Sub

Macro 2

Sub UpdateLogWorksheet()

Dim historyWks As Worksheet
Dim inputWks As Worksheet

Dim nextRow As Long
Dim oCol As Long

Dim myCopy As Range
Dim myTest As Range

Dim lRsp As Long

Set inputWks = Worksheets("Visit & Order Entry Form")
Set historyWks = Worksheets("Contact Details & Segm Database")

'check for duplicate order ID in database
If inputWks.Range("CheckID") = True Then
  lRsp = MsgBox("Clinic ID already in database. Update database?", vbQuestion + vbYesNo, "Duplicate ID")
  If lRsp = vbYes Then
    UpdateLogRecord
  Else
    MsgBox "Please change Clinic ID to a unique number."
  End If

Else

  'cells to copy from Input sheet - some contain formulas
  Set myCopy = inputWks.Range("OrderEntry")

  With historyWks
      nextRow = .Cells(.Rows.Count, "A").End(xlUp).Offset(1, 0).Row
  End With

  With inputWks
      Set myTest = myCopy.Offset(0, 2)

      If Application.Count(myTest) > 0 Then
          MsgBox "Please fill in all the cells!"
          Exit Sub
      End If
  End With

  With historyWks
      With .Cells(nextRow, "A")
          .Value = Now
          .NumberFormat = "mm/dd/yyyy hh:mm:ss"
      End With
      .Cells(nextRow, "B").Value = Application.UserName
      oCol = 3
      myCopy.Copy
      .Cells(nextRow, 3).PasteSpecial Paste:=xlPasteValues, Transpose:=True
      Application.CutCopyMode = False
  End With

  'clear input cells that contain constants
  With inputWks
    On Error Resume Next
       With myCopy.Cells.SpecialCells(xlCellTypeConstants)
            .ClearContents
            Application.GoTo .Cells(52) ', Scroll:=True
       End With
    On Error GoTo 0
  End With
End If

End Sub

Macro 3

Sub UpdateLogRecord()

Dim historyWks As Worksheet
Dim inputWks As Worksheet

Dim lRec As Long
Dim oCol As Long
Dim lRecRow As Long

Dim myCopy As Range
Dim myTest As Range

Dim lRsp As Long

Set inputWks = Worksheets("Visit & Order Entry Form")
Set historyWks = Worksheets("Contact Details & Segm Database")

'check for duplicate order ID in database
If inputWks.Range("CheckID") = False Then
  lRsp = MsgBox("Clinic ID not in database. Add clinic to database?", vbQuestion + vbYesNo, "New Order ID")
  If lRsp = vbYes Then
    UpdateLogWorksheet
  Else
    MsgBox "Please select Clinic ID that is in the database."
  End If

Else

  'cells to copy from Input sheet - some contain formulas
  Set myCopy = inputWks.Range("OrderEntry")

  lRec = inputWks.Range("CurrRec").Value
  lRecRow = lRec + 1

  With inputWks
      Set myTest = myCopy.Offset(0, 2)

      If Application.Count(myTest) > 0 Then
          MsgBox "Please fill in all the cells!"
          Exit Sub
      End If
  End With

  With historyWks
      With .Cells(lRecRow, "A")
          .Value = Now
          .NumberFormat = "mm/dd/yyyy hh:mm:ss"
      End With
      .Cells(lRecRow, "B").Value = Application.UserName
      oCol = 3

      myCopy.Copy
      .Cells(lRecRow, 3).PasteSpecial Paste:=xlPasteValues, Transpose:=True
      Application.CutCopyMode = False
  End With

  'clear input cells that contain constants
  With inputWks
    On Error Resume Next
       With myCopy.Cells.SpecialCells(xlCellTypeConstants)
            .ClearContents
            Application.GoTo .Cells(52) ', Scroll:=True
       End With
    On Error GoTo 0
  End With
End If

End Sub

您没有任何代码可以在宏开始时取消保护,然后在结束时再次保护。你一开始就需要这样的东西(我想你已经知道这一点,但只是想弄清楚)。

SheetName.Unprotect Password:=yourPassword

最后是这样的:

SheetName.Protect Password:=yourPassword

您说您已经尝试过此操作,但从您发布的代码中不清楚您在何处拥有这些命令。

通过尝试在这一端重现行为,我注意到您有两个不同的工作表,您将其称为historyWks这可能会导致锁定和解锁问题。

一种选择是在入口点取消所有工作表的保护,然后在出口处再次保护它们。

Private Const yourPassword As String = "password"

Sub UnprotectAll()
    Dim sh As Worksheet
    For Each sh In ActiveWorkbook.Worksheets
        sh.Unprotect Password:=yourPassword
    Next sh
End Sub

Sub ProtectAll()
    Dim sh As Worksheet
    For Each sh In ActiveWorkbook.Worksheets
        sh.Protect Password:=yourPassword
    Next sh
End Sub

你只需要在你的开始和结束时调用它们Macro1。您可能还想添加一个Application.ScreenUpdating = False在开始时避免闪烁,因为它循环遍历所有工作表,然后Application.ScreenUpdating = True在......的最后Macro1.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当工作表受到保护时,宏不起作用。运行宏返回运行时错误 1004 的相关文章

  • 无法使用 Excel JavaScript API 设置 NumberFormat

    我正在使用 Excel Javascript API 在搜索文档后 仍然找不到我想要实现的解决方案 因此 我想将所有内容设置为数字格式 文本 这样 Excel 的自动格式设置就不会与任何单元格的内容混淆 不会删除前导零或更改日期格式 文档建
  • 在 Django(Python) 中向用户提供 Excel(xlsx) 文件下载

    我正在尝试使用 Django 创建和提供 Excel 文件 我有一个 jar 文件 它获取参数并根据参数生成 excel 文件 并且它可以正常工作 但是 当我尝试获取生成的文件并将其提供给用户下载时 文件损坏了 它的大小为 0kb 这是我用
  • 如何使用 C# 在 MS Excel 单元格中添加数字验证

    我的目标是限制用户在 MS Excel 单元格中仅输入 1 到 100 范围内的值 我正在以编程方式生成 Excel 文件 但是当我添加上述验证时 抛出异常Exception from HRESULT 0x800A03EC 我写的代码如下
  • 使用 OpenXML 读取列中的 Excel 工作表数据

    有没有一种方法可以使用 OpenXML SDK 和 C 按列而不是按行读取 Excel 工作表 我已经尝试使用 EPPlus 包 但遇到了一些问题 因为我的应用程序还使用 EPPlus 不支持的 xslm 文件 因此 我需要 OpenXML
  • 二维数组作为字典的项目

    我想用一个项目的几个属性填充字典 例子 我正在考虑拥有Item 1 and Item 2 as Dictionary键与array这将保留其属性 我需要能够单独访问项目的每个属性 因此将它们连接为一个字符串不是一种选择 我正在考虑类似下面的
  • Excel VBA 用户窗体 - 当发生变化时执行 Sub

    我有一个包含很多文本框的用户表单 当这些文本框的值发生变化时 我需要通过调用子例程 AutoCalc 根据文本框值重新计算最终结果值 我有大约 25 个框 我不想向每个调用上述子例程的文本框单独添加 Change 事件 当某些值发生变化时调
  • 导入到 SQL Server 时忽略 Excel 文件中的列

    我有多个具有相同格式的 Excel 文件 我需要将它们导入 SQL Server 我当前遇到的问题是 有两个文本列我需要完全忽略 因为它们是自由文本 并且某些行的字符长度超出了服务器允许我导入的长度 这会导致截断错误 因为我的分析不需要这些
  • 当存储在集合中时,如何更改类属性的值

    我想将一个类存储在集合中 并且能够更改该类的属性 而不必删除集合项并再次将其添加回来 我的研究表明 如果不进行删除 替换操作 则无法更改项目本身 但是项目的属性又如何呢 下面的代码展示了如何执行此操作 当您运行宏时 调试窗口将显示存储对象的
  • 如何获取数据透视表的 ListObject 对象?

    这个问题最初是作为answer https stackoverflow com a 21321664 2712565作者 休 西格雷夫斯 Hugh Seagraves 关于相关问题的文章 他 想要引用一个工作表上的列表对象 表格 而另一工作
  • VBA 中的求和函数

    我在 vba 中对单元格求和时遇到问题 我需要使用单元格 a b Range A1 function SUM Range Cells 2 1 Cells 3 2 但它不起作用 函数不是范围内的属性 方法 如果您想对值求和 请使用以下命令 R
  • 如何在Excel中创建关系矩阵

    给定一个三元组列表 我想得到一个关系矩阵 如下所示 1 A X 1 A Y 1 B X A B C 1 B Z 1 X Y X Z 2 A Z gt 2 Z X Y 2 B X 3 Y Z 3 A Y 3 A Z 2 C Y 如何 可以在
  • 使用 C# 在 Excel 中查找和替换文本

    我想使用 C 在 Excel 中查找并替换一组文本 而且我希望此替换仅发生在第一行中的文本 我已经使用Google并找到了一些付费资源 例如Aspose API Spire Xls等 但我正在寻找开源资源或任何其他有效的方法来实现这一目标
  • 在 Python 中绘制 Excel 中的数据

    我必须从 Excel 文件中读取和绘制数据的代码是这样的 import pandas as pd import matplotlib pyplot as plt excel file file1 xlsx file1 pd read exc
  • 使用 PHP 代码和 HTML 表单将 Excel (.csv) 导入 MySQL

    我知道还有其他类似的帖子 但每个人都建议直接在 PHPMyAdmin 中将其导入 MySQL 这工作完美 但我需要通过 HTML 表单导入 PHP 到 MySQL 我想要一个收集文件的 HTML 表单 然后将该文件传递给 PHP 脚本 我想
  • Excel宏隐藏特定单元格和合并区域

    我试图根据另一个单元格的值隐藏特定单元格 到目前为止 我设法隐藏整行 但无法隐藏特定单元格 Local Currency value show hide item If Range Currency Value USD Then Range
  • excel使用单元格引用作为逻辑运算符并查找值

    我有一个表来查找这样的值 logical test points lt 0 1 lt 10 2 lt 20 4 gt 20 5 如果我的单元格 例如 A1 如果我的单元格 如果我的单元格 gt 20 则结果为 5 我可以为此使用多个 if
  • 用于导出到 CSV/Excel 的数据 URI(无服务器端请求):浏览器支持/限制?

    以下问题 Javascript 或 Flash 导出至 CSV Excel https stackoverflow com questions 8150516 javascript or flash export to csv excel
  • VBA 写入文件时对数值进行四舍五入 - 如何防止?

    在下面的代码中 我在确保文件编写器不会将我的数字四舍五入到一定的小数位数时遇到问题 我需要使用变体 因为有时该值是字符串 有时它是数字 我怎样才能强制它准确地写出变量是什么 例如 下面的代码可能显示 0 00038 我想显示确切的值 Dim
  • 使用 Excel 2010 通过存储过程读取/写入 SQL Server 2008 数据库

    我们有一个 SQL Server 2008 数据库 它有存储过程来处理读 写等 这些过程由各种应用程序内部使用 需要一个人直接更新数据库中名为 Employee 的表 更新非常简单 更新 VARCHAR 和 INT 外键 字段 问题是 Sh
  • 以编程方式将参数传递到访问报告中

    我有一个现有的 Access MDB 我正在向运行现有报表的现有表单添加一个命令按钮 所做的更改是 此按钮需要传入一个包含正在报告的记录 ID 的参数 当前报告在 MDB 中的每条记录上运行 我已经更改了报告运行的查询 以使用 ID 值参数

随机推荐

  • 如何抓取 Tableau 仪表板,其中单击地图后数据仅显示在图中?

    我正在尝试从中抓取数据这个公共 Tableau 仪表板 兴趣在于时间序列绘制的数据 如果我单击地图中的特定状态 时间序列将更改为该特定状态 下列的this and this我得到了在国家一级汇总的时间序列的结果 使用下面提供的代码 但我感兴
  • 我可以在打字稿中声明静态私有函数吗?

    我有以下代码 module Dialog export class Modal static createAccessModal link Link createModal link static createAdminModal link
  • 将 android:layoutAnimation 添加到 LinearLayout 会导致 FC

    我在 menu xml 中有以下 XML 它是一个我需要设置动画的 LinearLayout 因此我使用layoutAnimation 属性 如果没有这个属性 布局会完美地显示 但是设置了这个属性后 我会得到一个令人讨厌的强制关闭 我不明白
  • 您的 BDD 规范是否应该与 UI 测试分开?

    昨天我参加了一场精彩的演讲戈伊科 阿季奇关于 BDD 我可能错过了他说的一两件事 所以这里有一个问题希望能为我澄清一些事情 通常 当您在网上看到 BDD 示例时 它们会在 UI 中包含步骤 在小黄瓜语言中 您经常可以看到类似以下内容 Sce
  • Android Web 视图中的所见即所得

    我一直在尝试从我的应用程序内部向我的用户提供所见即所得的 HTML 编辑器 它不必是花哨的所见即所得 我只需要基本功能 如粗体 斜体 下划线 图像 链接和一些基本格式 字体大小 颜色 对齐方式 那应该足够了 完美的解决方案是一个开源库 但我
  • Angular 4:API调用后更新模板变量[重复]

    这个问题在这里已经有答案了 我有一个组件指令 用于显示带有一些信息的 div 该组件称为站点组件并包含在页面中 该人的主要行为站点组件很好 除了这个 我有一个对后端的 API 调用 我在其中返回一些数据 后端调用执行良好 我收到了信息 但变
  • 在内联汇编中使用双精度数字(GCC、IA-32)

    我刚刚开始在计算机科学课上学习汇编 并且我有一项作业是使用指定的舍入模式对浮点值进行舍入 我尝试使用它来实现fstcw fldcw and frndint 我修改舍入控制位 对数字进行舍入 然后恢复以前的控制位 分配的要求 目前突出的问题是
  • 为什么协程停止工作/执行

    我有一个 3 秒倒计时器 当游戏取消暂停时会激活该计时器 几天前我还可以正常工作 但现在它不再工作了 它在号码 3 上被阻止 这是代码 IEnumerator Timer Time timeScale 0 objectWithGSScrip
  • 如何有效地使用绑定框架

    我已经使用绑定框架有一段时间了 我想知道您如何处理这种情况 你有一份报纸 它有一些属性 比如 字符串 标题 布尔值 已发布 日期 出版日期 在您看来 您有一份报纸列表 可以同时编辑所有报纸 这意味着您可以在单个请求中更改所有报纸的标题或所有
  • 实体框架在哪里存储属性名称与其在 SQL 中选择的列之间的映射?

    我正在尝试使用 ObjectQuery 的 ToTraceString 在 EF 4 3 上构建一些自定义扩展 以从 LINQ 代码生成原始 SQL 我注意到 虽然在某些情况下 SQL 中的列名称与查询元素类型的属性名称相匹配 但在其他情况
  • 为什么代码 this 指向 window 对象?

    我的代码是 var length 20 function fn console log this length var o length 10 e function fn fn arguments 0 o e fn 输出是20 1 谁能告诉
  • 所有浏览器都会忽略无名输入字段吗?

    如果没有指定 name 属性 是否可以保证浏览器不会发送输入元素 例如 我们可以假设 POST 下面的表单不会发送信用卡号吗
  • NullPointerException:重写派生类中基类的构造函数调用方法

    我有这个代码片段 class Base public Base method void method System out println In Base class Derived extends Base private String
  • 用于处理多个未知回调的 JavaScript 函数

    我有一个场景 我想将 2 个或更多函数 作为参数 发送到处理函数中 并让该处理函数执行每个传递的函数作为前面函数的回调函数 这是我试图编写的函数的一般概念 function functionChain MAKE SURE WE HAVE A
  • 为什么此 DataAdapter 不将行插入数据库?

    因此 我遇到了一种情况 我使用 SqlDataAdapter 将行插入 SQL Server 2014 数据库中的表中 数据来源是 Excel 电子表格 当使用几个 For 循环以及 Columns Add 和 Rows Add 填充 Da
  • PHP Amazon S3通过URL访问私有文件

    我在用着AWS PHPsdk 将图像保存在 S3 上 文件以私密方式保存 然后 我在 Web 应用程序中使用 S3 文件 url 显示图像缩略图 但由于文件是私有的 因此图像显示为损坏 当用户单击文件名时 会打开一个模式以显示较大尺寸的文件
  • kivy自定义小部件绑定错误

    我正在尝试制作一个小俄罗斯方块游戏 用于用 kivy 学习 python 我正在尝试创建一个大小为 20 20 的自定义小部件 当我将其添加到浮动布局并运行以下代码时 我收到以下错误 Error File D OS Files worksp
  • 是否可以动态定义 _Generic 的关联列表?

    我有一个这样的模板 template h Declare a function func type void JOIN func T T t return undef T 我这样使用它来为不同类型生成相同的函数 example c defi
  • 将 powershell 控制台窗口移动到屏幕左侧的最佳方法是什么?

    尝试使用 PowerShell 脚本将当前活动的 powershell 窗口移动到屏幕左侧 我找到了这个功能 但它并没有真正提供任何示例 有趣又有趣的问题 如果你想移动窗口 你需要知道窗口句柄hWnd它的 对于控制台 您可以使用GetCon
  • 当工作表受到保护时,宏不起作用。运行宏返回运行时错误 1004

    我的工作簿中有三个工作正常的宏 但是 当我保护任何工作表时 它们会停止工作 并且我会得到一个run time error 1004 我尝试按照网上找到的两个建议进行操作 在宏代码开始处取消保护 在宏代码结束处保护 仅用户界面 但运行时错误仍