Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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 基于条件逻辑的单元引用锁定/解锁_Excel_Vba - Fatal编程技术网

Excel 基于条件逻辑的单元引用锁定/解锁

Excel 基于条件逻辑的单元引用锁定/解锁,excel,vba,Excel,Vba,我正在用Excel创建一个报告请求表单,它基本上迫使请求者在文档中一步一步地进行,以确保我们已经填写了所有内容。作为一个控件,我希望在后续步骤中锁定输入,直到当前步骤完成(即,只需将文本放入单元格)。我已经在Excel中的名称管理器中输入了每个输入步骤的名称 为了我的生命,我不能让我的代码工作。我甚至刚刚尝试实现一个MsgBox,以确保IF正常工作,但什么也没有出现 名称管理器引用: 单元格参考IsRequestDetails填充=单元格O2。这个单元格有一个公式,它的逻辑将简单地表示“是”或

我正在用Excel创建一个报告请求表单,它基本上迫使请求者在文档中一步一步地进行,以确保我们已经填写了所有内容。作为一个控件,我希望在后续步骤中锁定输入,直到当前步骤完成(即,只需将文本放入单元格)。我已经在Excel中的名称管理器中输入了每个输入步骤的名称

为了我的生命,我不能让我的代码工作。我甚至刚刚尝试实现一个MsgBox,以确保IF正常工作,但什么也没有出现

名称管理器引用:

  • 单元格参考IsRequestDetails填充=单元格O2。这个单元格有一个公式,它的逻辑将简单地表示“是”或“否”
  • 单元格引用业务需求=合并单元格B13:F16
宏的目标是引用ISRequestDetails已填充。如果为“否”,则锁定BusinessNeed。如果为“是”,则解锁BusinessNeed

我的代码:

Private Sub Is_RequiredRequesterDetails_Filled()

    'Dim CurrentWorksheet As Worksheet
    Dim IsRequestDetailsFilled As Range
    Dim BusinessNeed As Range

    'Set CurrentWorksheet = Worksheets("New Report Request")
    Set IsRequestDetailsFilled = Range("IsRequestDetailsFilled").Value
    Set BusinessNeed = Range("BusinessNeed").Value
    
    If IsRequestDetailsFilled = "No" Then
        MsgBox Prompt:="Locked"
        'CurrentWorksheet.BusinessNeed.Locked = True
    Else
        MsgBox Prompt:="Unlocked"
        'CurrentWorksheet.BusinessNeed.Locked = False
    End If
End Sub
也许我疯了,因为我从早上6点开始就没有停止工作,现在是晚上10:30。。。但我似乎无法从谷歌上找到这个答案。我试过几种选择。我希望代码可读,因此理想情况下,我希望使用我指定的引用名称

如果有更好的方法来实现我所说的,请随意提出建议


谢谢

考虑这段代码摘录的逻辑

Dim IsRequestDetailsFilled As Range
Set IsRequestDetailsFilled = Range("IsRequestDetailsFilled").Value
Range的value属性(“IsRequestDetailsFilled”)是一个变量-可能是数字或字符串-但
IsRequestDetailsFilled
是一个范围。其外观是将范围本身与其值混为一谈。value属性只是每个范围中的许多属性之一,如行、列、字体、填充等。碰巧value属性是默认属性,因此可以忽略,这使得它成为无数误解的来源

下面是将范围对象分配给声明为范围的变量的正确语法

Dim IsRequestDetailsFilled As Range
Set IsRequestDetailsFilled = Range("IsRequestDetailsFilled")
实际上,你可能不需要这样做。下面的代码也同样适用,并且可能更容易阅读

Private Sub Is_RequiredRequesterDetails_Filled()
    
    If Range("IsRequestDetailsFilled").Value = "No" Then
        MsgBox Prompt:="Locked"
        'CurrentWorksheet.BusinessNeed.Locked = True
    Else
        MsgBox Prompt:="Unlocked"
        'CurrentWorksheet.BusinessNeed.Locked = False
    End If
End Sub

如果使用工作表的作用域声明范围(“IsRequestDetailsFilled”),则只需指定工作表。默认情况下,Excel将创建具有工作簿范围的命名范围。您可以在名称管理器中检查和设置范围。如果名称是使用工作簿创建的,则VBA将在工作簿中的任何位置找到该名称,您无需在代码中提及该选项卡。

删除
.Value
Set IsRequestDetailsFilled=Range(“IsRequestDetailsFilled”)
Set BusinessNeed=Range(“BusinessNeed”)
。最好在
范围之前指定工作簿/工作表。