Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA设计用于防止保存时编辑具有值的单元格时出现问题_Excel_Vba - Fatal编程技术网

Excel VBA设计用于防止保存时编辑具有值的单元格时出现问题

Excel VBA设计用于防止保存时编辑具有值的单元格时出现问题,excel,vba,Excel,Vba,我正在处理电子表格中的一个表格,多个用户将编辑该表格。我们遇到过这样的问题:人们不小心粘贴到了其他条目上,或者将半行移到了几列上。我想保护每个有值的单元格,或者允许编辑每个没有值的单元格 我尝试过使整个表格可编辑,然后用其中的值锁定单元格。这似乎没什么作用,因为我无论如何都可以编辑值 Private子工作簿\u保存前(ByVal SaveAsUI为布尔值,Cancel为布尔值) 将NewEditRange设置为范围 将此工作表设置为工作表 作为范围的Dim数据表 将CurrentEditRang

我正在处理电子表格中的一个表格,多个用户将编辑该表格。我们遇到过这样的问题:人们不小心粘贴到了其他条目上,或者将半行移到了几列上。我想保护每个有值的单元格,或者允许编辑每个没有值的单元格

我尝试过使整个表格可编辑,然后用其中的值锁定单元格。这似乎没什么作用,因为我无论如何都可以编辑值

Private子工作簿\u保存前(ByVal SaveAsUI为布尔值,Cancel为布尔值)
将NewEditRange设置为范围
将此工作表设置为工作表
作为范围的Dim数据表
将CurrentEditRange设置为允许的范围
小电流单元作为量程
设置ThisSheet=ActiveWorkbook.Worksheets(“数据”)
Set DataTable=thisheet.Range(“表1”)
Set NewEditRange=thisheet.Range($A$1)
此工作表。取消保护
对于此Sheet.Protection.AllowEditRanges中的每个CurrentEditRange
CurrentEditRange.Delete
下一个
对于DataTable中的每个CurrentCell
如果CurrentCell.Value=”“,则
Set NewEditRange=Application.Union(NewEditRange,CurrentCell)
如果结束
如果CurrentCell.Value=“0”,则
Set NewEditRange=Application.Union(NewEditRange,CurrentCell)
如果结束
下一个
ThisSheet.Protection.AllowEditRanges.Add标题:=“新建编辑范围”,范围:=新建编辑范围
这张纸。保护
端接头
我希望这样可以解锁工作表,删除所有AllowEditRange对象,然后将表中的每个空白单元格添加到NewEditRange,然后创建一个包含NewEditRange的新AllowEditRange,然后保护工作表。
相反,它通过第14行左右对单元格进行AllowEditRange,我仍然可以编辑不在该范围内的单元格。

您应该始终使用'Option Explicit' 我对Application.Union在NewEditRange上运行有一些怀疑,如果它仍然是空的话。您应该初始化它,并且可能必须拆分NewEditRange为nothing或nothing的情况


(由于rep的原因,无法进行评论)

好的,所以问题是您无法保护表中的单元格。时期如果您对添加此功能感兴趣,请转到并投票。

您在哪里定义了CurrentEditRange和CurrentCell?我在For循环中隐式定义了它们。@JolnarIndustries很挑剔,但它是否应该为DataTable.Cells中的每个CurrentCell读取
?(我认为
.Cells
是默认值,但您也可以有
.Rows
Columns
区域
,等等)更重要的是,您是否应该使用
此工作簿
而不是
活动工作簿
?您只需要1
If
语句:
If CurrentCell.Value=”“或CurrentCell.Value=“0”,那么如果运行此代码,工作表是否实际受到保护?如果你用F8一行一行地走,它会做任何意想不到的事情吗?表外的一切都得到了很好的保护。我还没有尝试过一步一步地去做,所以可能只是在昏暗之后添加Set-NewEditRange=Range($A$1)或类似的东西?Set-NewEditRange=Nothings,太匆忙了:当然,然后你需要区分“如果NewEditRange什么都不是,那么。。。其他的结束如果。