首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >突出显示Excel中的更改

突出显示Excel中的更改
EN

Stack Overflow用户
提问于 2009-08-28 07:50:34
回答 3查看 6.4K关注 0票数 1

我发送一个电子表格来更新信息,然后再发回给我。

我设置了验证并锁定单元格,以强制用户输入准确的信息。我使用VBA禁用剪切、复制和粘贴功能的变通方法。此外,我还插入了一个VBA函数来强制用户在Macros中打开Excel文件。

我正在尝试跟踪更改,以便在收到工作表时知道更新了哪些内容。当有人保存文档时,我会得到一个错误,它会随机地将我完全锁在文档之外。

如何通过VBA而不是Excel的共享/跟踪更改选项突出显示更改?

ThisWorkbook:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Option Explicit

Const WelcomePage = "Macros"

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call ToggleCutCopyAndPaste(True)

     'Turn off events to prevent unwanted loops
    Application.EnableEvents = False

     'Evaluate if workbook is saved and emulate default propmts
    With ThisWorkbook
        If Not .Saved Then
            Select Case MsgBox("Do you want to save the changes you made to '" & .Name & "'?", _
                vbYesNoCancel + vbExclamation)
            Case Is = vbYes
                 'Call customized save routine
                Call CustomSave
            Case Is = vbNo
                 'Do not save
            Case Is = vbCancel
                 'Set up procedure to cancel close
                Cancel = True
            End Select
        End If

         'If Cancel was clicked, turn events back on and cancel close,
         'otherwise close the workbook without saving further changes
        If Not Cancel = True Then
            .Saved = True
            Application.EnableEvents = True
            .Close savechanges:=False
        Else
            Application.EnableEvents = True
        End If
    End With

End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
     'Turn off events to prevent unwanted loops
    Application.EnableEvents = False

     'Call customized save routine and set workbook's saved property to true
     '(To cancel regular saving)
    Call CustomSave(SaveAsUI)
    Cancel = True

     'Turn events back on an set saved property to true
    Application.EnableEvents = True
    ThisWorkbook.Saved = True
End Sub

Private Sub Workbook_Open()
    Call ToggleCutCopyAndPaste(False)

     'Unhide all worksheets
    Application.ScreenUpdating = False
    Call ShowAllSheets
    Application.ScreenUpdating = True
End Sub

Private Sub CustomSave(Optional SaveAs As Boolean)
    Dim ws As Worksheet, aWs As Worksheet, newFname As String
     'Turn off screen flashing
    Application.ScreenUpdating = False

     'Record active worksheet
    Set aWs = ActiveSheet

     'Hide all sheets
    Call HideAllSheets

     'Save workbook directly or prompt for saveas filename
    If SaveAs = True Then
        newFname = Application.GetSaveAsFilename( _
        fileFilter:="Excel Files (*.xls), *.xls")
        If Not newFname = "False" Then ThisWorkbook.SaveAs newFname
    Else
        ThisWorkbook.Save
    End If

     'Restore file to where user was
    Call ShowAllSheets
    aWs.Activate

     'Restore screen updates
    Application.ScreenUpdating = True
End Sub

Private Sub HideAllSheets()
     'Hide all worksheets except the macro welcome page
    Dim ws As Worksheet

    Worksheets(WelcomePage).Visible = xlSheetVisible

    For Each ws In ThisWorkbook.Worksheets
        If Not ws.Name = WelcomePage Then ws.Visible = xlSheetVeryHidden
    Next ws

    Worksheets(WelcomePage).Activate
End Sub

Private Sub ShowAllSheets()
     'Show all worksheets except the macro welcome page

    Dim ws As Worksheet

    For Each ws In ThisWorkbook.Worksheets
        If Not ws.Name = WelcomePage Then ws.Visible = xlSheetVisible
    Next ws

    Worksheets(WelcomePage).Visible = xlSheetVeryHidden

End Sub

Private Sub Workbook_Activate()
    Call ToggleCutCopyAndPaste(False)
End Sub

Private Sub Workbook_Deactivate()
    Call ToggleCutCopyAndPaste(True)
End Sub

在模块中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Option Explicit

Sub ToggleCutCopyAndPaste(Allow As Boolean)
     'Activate/deactivate cut, copy, paste and pastespecial menu items
    Call EnableMenuItem(21, Allow) ' cut
    Call EnableMenuItem(19, Allow) ' copy
    Call EnableMenuItem(22, Allow) ' paste
    Call EnableMenuItem(755, Allow) ' pastespecial

     'Activate/deactivate drag and drop ability
    Application.CellDragAndDrop = Allow

     'Activate/deactivate cut, copy, paste and pastespecial shortcut keys
    With Application
        Select Case Allow
        Case Is = False
            .OnKey "^c", "CutCopyPasteDisabled"
            .OnKey "^v", "CutCopyPasteDisabled"
            .OnKey "^x", "CutCopyPasteDisabled"
            .OnKey "+{DEL}", "CutCopyPasteDisabled"
            .OnKey "^{INSERT}", "CutCopyPasteDisabled"
        Case Is = True
            .OnKey "^c"
            .OnKey "^v"
            .OnKey "^x"
            .OnKey "+{DEL}"
            .OnKey "^{INSERT}"
        End Select
    End With
End Sub

Sub EnableMenuItem(ctlId As Integer, Enabled As Boolean)
     'Activate/Deactivate specific menu item
    Dim cBar As CommandBar
    Dim cBarCtrl As CommandBarControl
    For Each cBar In Application.CommandBars
        If cBar.Name <> "Clipboard" Then
            Set cBarCtrl = cBar.FindControl(ID:=ctlId, recursive:=True)
            If Not cBarCtrl Is Nothing Then cBarCtrl.Enabled = Enabled
        End If
    Next
End Sub

Sub CutCopyPasteDisabled()
     'Inform user that the functions have been disabled
    MsgBox " Cutting, copying and pasting have been disabled in this workbook.  Please hard key in data.  "
End Sub
EN

回答 3

Stack Overflow用户

发布于 2009-10-12 19:29:29

我稍微修改了您的模块,如下所示,并在“本工作簿”的“Workbook_Open”和“Workbook_Beforeclose”部分调用了函数。在前者中,函数参数为False,而在后者中,参数为True。它工作得很好。您最好参考Yogesh的代码,它更全面。它的网址是:http://ygblogs.blogspot.com/2009/04/macros-in-excel-disable-cut-copy-paste.html

将以下内容插入模块中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Option Explicit
Dim Allow As Boolean, ctlId As Integer, Enabled As Boolean

Function ToggleCutCopyAndPaste(Allow As Boolean)

    'Activate/deactivate cut, copy, paste and pastespecial shortcut keys
    With Application
        Select Case Allow
            Case False
                .OnKey "^c", "CutCopyPasteDisabled"
                .OnKey "^v", "CutCopyPasteDisabled"
                .OnKey "^x", "CutCopyPasteDisabled"
                .OnKey "+{DEL}", "CutCopyPasteDisabled"
                .OnKey "^{INSERT}", "CutCopyPasteDisabled"           
            Case True
                .OnKey "^c"
                .OnKey "^v"
                .OnKey "^x"
                .OnKey "+{DEL}"
                .OnKey "^{INSERT}"
        End Select
        .CutCopyMode = Allow
        .CellDragAndDrop = Allow
    End With

    'Activate/Deactivate specific menu item
    Dim cBar As CommandBar
    Dim cBarCtrl As CommandBarControl, i As Integer

    For i = 1 To 4
        If i = 1 Then ctlId = 21
        If i = 2 Then ctlId = 19
        If i = 3 Then ctlId = 22
        If i = 4 Then ctlId = 755        

        For Each cBar In Application.CommandBars
            If cBar.Name <> "Clipboard" Then
                Set cBarCtrl = cBar.FindControl(ID:=ctlId, recursive:=True)
                If Not cBarCtrl Is Nothing Then cBarCtrl.Enabled = Allow
            End If
        Next
    Next i    
End Function

在VBA编辑器的ThisWorkbook部分插入以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Private Sub Workbook_BeforeClose(Cancel As Boolean)    
    ToggleCutCopyAndPaste (True)   
End Sub

Private Sub Workbook_Open()    
    ToggleCutCopyAndPaste (False)    
End Sub
票数 1
EN

Stack Overflow用户

发布于 2009-10-11 19:24:02

你为什么不去查一下Ozgrid.com:

http://www.ozgrid.com/VBA/track-changes.htm

您可以轻松地直接实现代码,还可以添加几个功能,如用颜色突出显示更改的单元格等。

票数 0
EN

Stack Overflow用户

发布于 2016-04-12 16:23:41

当您需要跟踪和比较更改时,有一种根本不需要宏的简单方法:尝试Version Control add-in for Excel

您可以将原始电子表格与从其他用户收到的版本进行比较。理想情况下,他们还应该安装插件,但不是必须的。

如果你想跟踪宏模块的变化,那么这个Version Control for VBA macros是你的救命稻草。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1347876

复制
相关文章
B+树索引使用(7)匹配列前缀,匹配值范围(十九)
上篇文章索引的代价,b+树占的空间比较大,增删改对b+树每个节点的索引排序影响也很大,时间耗费长,所以没有必要不要乱建索引,还介绍了索引的最左原则和全值查询。
用户9919783
2022/07/26
9990
基因注释:区间范围匹配
今天,有老师问我一个问题,如果从一个区间匹配到另一个的区间范围,并找出来。我觉得比较有代表性,就写篇博客总结一下。
邓飞
2022/12/13
7020
基因注释:区间范围匹配
正则表达式范围匹配
近期小编在进行评测语料的制作时,涉及到一些复杂字符串的过滤和提取等内容,例如找出某一句话中在某个特定语句结构下出现的文字,虽然使用循环,if-else等语句可以搞定,但是比较麻烦,使用正则表达式处理就比较方便。
用户5521279
2020/03/19
3.2K0
时间范围内查找
特殊说明: 以上文章,均是我实际操作,写出来的笔记资料,不会盗用别人文章!烦请各位,请勿直接盗用!转载记得标注来源!
收心
2022/10/28
6200
mysql 根据时间范围查询
如果传入的格式是YYYY-MM-DD 的 没有带时分秒,按照上面两种写法会差不全。
全栈程序员站长
2022/09/13
4.8K0
Postgresql模糊匹配案例(包括中文前后模糊)
test 04 使用对应的pattern ops走索引在zh_CN也是列时也走索引
mingjie
2022/05/12
2.4K0
elui实现时间范围筛选
效果图 [2022-03-08_070538.png] 实现步骤 el-date-picker页面使用 <el-form-item label="报修时间"> <el-date-picker v-model="dateRange" size="small" style="width: 240px" value-format="timestamp" type="daterange"
用户6493868
2022/03/08
9010
时间范围占比工具类
/** * 时间范围占比 * * @param st 开始时间戳 * @param et 结束时间戳 * @param cst 对比开始时间戳 * @param cet 对比结束时间戳 * @return 占比 * @author liushouyun */ public static Tuple2<Integer, Double> proportionOfTimeRange(long st, lon
房上的猫
2020/02/20
6310
时间控件(选择时间范围的插件)「建议收藏」
后台开发,一般都是有筛选条件的查询,那么问题就来了,根据日期范围搜索的情况下,插件要怎么选????
全栈程序员站长
2022/08/25
5.4K0
时间控件(选择时间范围的插件)「建议收藏」
python 计算周的范围时间
week_len = ["", 2, 3, 4] week_time_list = ["2021-09-06", "2021-09-27"] ne = [] print(week_time_list) for j in range(0, len(week_len)): c = ne[-1] if len(ne) > 0 else week_time_list[0] end_date = datetime.strptime(c, '%Y-%m-%d') now_date_end =
Wyc
2021/09/23
1.6K0
python 计算周的范围时间
element-ui 日期时间选择框picker-options如何禁用时间范围( 多个时间范围判断 )
1. element-ui 算是我们在开发中用到最多的pc端 ui框架,今天公司正好有一个需要用到 date-picker 的日期插件
小蔚
2023/07/10
8520
element-ui  日期时间选择框picker-options如何禁用时间范围( 多个时间范围判断 )
GWAS分析后的基因注释:区间范围匹配
图1是SNP的上下游区间,图2是基因的上下游区间,想以图1为标准,将区间内有基因的行放到右边。
邓飞
2023/09/06
9580
GWAS分析后的基因注释:区间范围匹配
linux shell grep 匹配多个字符 和向下匹配多行范围 用法
cat 1.txt | grep -v -E "ok=2|changed|TASK" # grep -v 不匹配, # -E 匹配多个 用管道隔开 | cat 1.txt | grep -A 3 "date" # grep -A 3 在匹配字符date 往下3三行的所有数据 -A是显示匹配后和它后面的n行。 -B是显示匹配行和它前面的n行。 -C是匹配行和它前后各n行。
eisc
2021/06/21
5.4K0
bootstrap-datepicker限定可选时间范围
实际应用中可能会根据日期字段查询某个日期范围内的数据,则需要对日期选择器可选时间进行限制,
全栈程序员站长
2022/09/10
1.8K0
bootstrap-datepicker限定可选时间范围
最后更新修改时间提示【可配置时间范围】
原文:https://laolion.com/archives/2547.html 今天在老狮的博客里到一个类似的博文,于是在本站也弄了一个,但样式并不符合我的审美,所以参照了一下Joe6.1版的时间提示样式改了改。
用户7162790
2022/03/23
6170
判断当前时间是否在某个时间范围内
判断当前时间是否在某个时间范围内 各种活动在接口判单当时间是否在【活动】范围内——小时-分钟 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class CutTime { /** * 判断是否满足时间内 * @param CutTime限制时间 * @return */ public static boolean cutTime(String
红目香薰
2022/11/28
1.7K0
PHP 获取 特定时间范围 类
目录 前序   用途   功能及事项   使用方法   代码及注释 前序:   总体来说,我更应该是一个 android 移动开发者,而不是一个 phper,如果说只做移动端的 APP ,我也不会学
林冠宏-指尖下的幽灵
2018/01/03
2.2K0
sequlize 查询时间范围和多表查询
前端传参时间范围 如:createdAtFrom = '', createdAtTo = '' ,并且在后端接收参数后给的默认值 ''
用户4793865
2023/01/12
2.6K0
Mysql时间范围查询不走索引问题
此时,虽然在create_time字段上添加了索引,但是否会走索引还需要看数据量的情况。
程序新视界
2022/05/06
4.7K0
oracle对时间范围比较的语句
一般在数据库语句中直接写某个时间条件例如:c_datetime<= ‘2014-08-06’或者between time1 and time2是会出错
粲然忧生
2022/09/28
1.1K0

相似问题

Django中的syncdb和更新数据库模式

10

django syncdb和更新的模型

70

更新到1.4后Django syncdb异常

116

django fabric syncdb

10

django中syncdb的问题

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文