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
Error handling 作为整数 Dim TgtRngPartList()作为字符串 Dim TgtRngList()作为变量 将TgtRngPart设置为字符串 Dim TgtRowBottom作为整数 Dim TgtRowTop作为整数 Dim值更改为字符串 Dim Valu_Error Handling_Excel_Excel Formula_Vba - Fatal编程技术网

Error handling 作为整数 Dim TgtRngPartList()作为字符串 Dim TgtRngList()作为变量 将TgtRngPart设置为字符串 Dim TgtRowBottom作为整数 Dim TgtRowTop作为整数 Dim值更改为字符串 Dim Valu

Error handling 作为整数 Dim TgtRngPartList()作为字符串 Dim TgtRngList()作为变量 将TgtRngPart设置为字符串 Dim TgtRowBottom作为整数 Dim TgtRowTop作为整数 Dim值更改为字符串 Dim Valu,error-handling,excel,excel-formula,vba,Error Handling,Excel,Excel Formula,Vba,作为整数 Dim TgtRngPartList()作为字符串 Dim TgtRngList()作为变量 将TgtRngPart设置为字符串 Dim TgtRowBottom作为整数 Dim TgtRowTop作为整数 Dim值更改为字符串 Dim ValueOK作为布尔值 '在TgtRngList中填入此例行程序要巡逻的E范围 TgtRngList=数组(“C1:C1000”、“F1:F1000”、“A1”) '用这些单元格的允许值填充OKValueList。 OKValueList=数组(“V

作为整数 Dim TgtRngPartList()作为字符串 Dim TgtRngList()作为变量 将TgtRngPart设置为字符串 Dim TgtRowBottom作为整数 Dim TgtRowTop作为整数 Dim值更改为字符串 Dim ValueOK作为布尔值 '在TgtRngList中填入此例行程序要巡逻的E范围 TgtRngList=数组(“C1:C1000”、“F1:F1000”、“A1”) '用这些单元格的允许值填充OKValueList。 OKValueList=数组(“V1”、“V2”、“V3”、“V4”、“V5”_ “V6”、“V7”、“V8”、“V9”、“V10”) ColChanged=ChangedCell.Column RowChanged=ChangedCell.Row 巡逻=错误 对于InxTR=LBound(TgtRngList)到UBound(TgtRngList) TgtRngPartList=Split(TgtRngList(InxTR),“:”) '解码范围左上角 TgtRngPart=TgtRngPartList(LBound(TgtRngPartList)) TgtRowTop=范围(TgtRngPart).Row TgtColLeft=范围(TgtRngPart).Column 如果LBound(TgtRngPartList)=UBound(TgtRngPartList),则 “没有冒号,所以是单细胞范围 TgtRowBottom=TgtRowTop TgtColRight=TgtColLeft 其他的 TgtRngPart=TgtRngPartList(UBound(TgtRngPartList)) TgtRowBottom=范围(TgtRngPart).Row TgtColRight=范围(TgtRngPart).Column 如果结束
如果RowChanged>=TgtRowTop和RowChanged=TgtColLeft和ColChanged,则显示的函数不会返回任何内容。。。您是否考虑过只使用类似VLOOKUP()的工作表公式?函数(从工作表调用时)不能更改工作表:它们只能将值返回给调用单元格。如果你需要添加颜色,那么你可以使用条件格式。我已经更正了公式。我不知道函数不能改变表单。作为条件格式,我不确定作为子项添加功能是否更方便。我希望普通用户不能更改内容,但不想使用pw保护工作区。啊,这太尴尬了。代码中缺少括号。它应该读取
工作表(“Sheet2”).Range(“A1:A10”).Find(valor,LookAt:=xlother).Offset(0,1)
。我现在已经改正了。关键是检索匹配右边单元格的信息和匹配右边两个单元格的信息。@Manuel你说“如果没有找到匹配,输出单元格会改变颜色”。什么是输出单元?恐怕你还不清楚。你的意思是说,如果右边的单元格匹配,找到什么,好的,如果不匹配,请将单元格的颜色更改到右边。很抱歉,不够清晰。输出单元格将是输入函数的单元格。正如我在@TonyDallimore的回答中所做的评论,假设我在单元格
F10:F11
中输入函数,如果没有找到匹配项,我希望
F10
改变颜色。@Manuel你对按钮有什么不满吗?确实,我在代码中缺少了一个括号。见上述评论。目标是将一个输入(在本例中为
valor
)与一个范围进行比较,比如说
A1:A10
。如果在例如
A3
中找到匹配项,该函数将返回
B3:C3
的值。如果没有找到匹配项,我希望输出单元格更改颜色。这才是真正的问题,更改颜色部分,而不是查找部分(尽管编码可能很糟糕)。很抱歉没有包括
如果
那么
部分。关于函数的信息非常有用。下拉列表不是一个好的解决方案,但条件格式可能会。如果返回了
#VALUE
,我可以执行错误处理来指定一些wierd值,比如10000000,然后使用您所说的条件格式。我仍然更喜欢VBA解决方案,这意味着创建一个由我的函数触发的宏,正如你在回答中所说的。我有一个灵感。请看我答案中的第三种选择。我一直很忙,没有时间检查你的灵感,但我会尽快检查。非常感谢您抽出时间。很抱歉耽搁了。在假期和其他项目之间,我无法查看您的代码。你建议巡逻牢房的方式似乎很有趣。我接受这个答案。谢谢。
Function Busca(valor As String)
    Dim bus(0 To 1)
    bus(0) = Worksheets("Sheet2").Range("A1:A10").Find(valor, LookAt:=xlWhole). _
        Offset(0, 1)
    bus(1) = Worksheets("Sheet2").Range("A1:A10").Find(valor, LookAt:=xlWhole). _
        Offset(0, 2)
    Busca = bus
End Function
Function Busca(valor As String)
''http://msdn.microsoft.com/en-us/library/aa195730(v=office.11).aspx
Dim bus(0 To 1)
With Worksheets("Sheet2").Range("A1:A10")
    Set c = .Find(valor, LookAt:=xlWhole)
    If Not c Is Nothing Then
        bus(0) = c.Address

        Set c = .FindNext(c)
        If Not c Is Nothing Then
            bus(1) = c.Address
        Else
            bus(1) = "None"
        End If
    Else
        bus(0) = "None"
    End If
End With
Debug.Print bus(0), bus(1)
Busca = bus
End Function
Option Explicit
Sub Worksheet_Change(ByVal ChangedCell As Range)

  ' This routine is called whenever the user changes a cell.
  ' It is not called if a cell is changed by Calculate

  Dim ColChanged As Integer
  Dim InxOV As Integer
  Dim InxTR As Integer
  Dim OKValueList() As Variant
  Dim Patrolled As Boolean
  Dim RowChanged As Integer
  Dim TgtColLeft As Integer
  Dim TgtColRight As Integer
  Dim TgtRngPartList() As String
  Dim TgtRngList() As Variant
  Dim TgtRngPart As String
  Dim TgtRowBottom As Integer
  Dim TgtRowTop As Integer
  Dim ValueChanged As String
  Dim ValueOK As Boolean

  ' Fill TgtRngList withe ranges that are to be patrolled by this routine
  TgtRngList = Array("C1:C1000", "F1:F1000", "A1")

  ' Fill OKValueList with the permitted values for these cells.
  OKValueList = Array("V1", "V2", "V3", "V4", "V5", _
                      "V6", "V7", "V8", "V9", "V10")

  ColChanged = ChangedCell.Column
  RowChanged = ChangedCell.Row

  Patrolled = False
  For InxTR = LBound(TgtRngList) To UBound(TgtRngList)
    TgtRngPartList = Split(TgtRngList(InxTR), ":")
    ' Decode top left of range
    TgtRngPart = TgtRngPartList(LBound(TgtRngPartList))
    TgtRowTop = Range(TgtRngPart).Row
    TgtColLeft = Range(TgtRngPart).Column
    If LBound(TgtRngPartList) = UBound(TgtRngPartList) Then
      ' There is no colon so single cell range
      TgtRowBottom = TgtRowTop
      TgtColRight = TgtColLeft
    Else
      TgtRngPart = TgtRngPartList(UBound(TgtRngPartList))
      TgtRowBottom = Range(TgtRngPart).Row
      TgtColRight = Range(TgtRngPart).Column
    End If
    If RowChanged >= TgtRowTop And RowChanged <= TgtRowBottom And _
       ColChanged >= TgtColLeft And ColChanged <= TgtColRight Then
      ' This is a patrolled cell
      Patrolled = True
      Exit For
    End If
  Next
  If Patrolled Then
    With ActiveSheet
      ValueChanged = .Cells(RowChanged, ColChanged).Value
      ' Check value against permitted list
      ValueOK = False
      For InxOV = LBound(OKValueList) To UBound(OKValueList)
        If ValueChanged = OKValueList(InxOV) Then
          ValueOK = True
          Exit For
        End If
      Next
      If ValueOK Then
        ' Set cell black
        .Cells(RowChanged, ColChanged).Font.Color = RGB(0, 0, 0)
      Else
        ' Set cell red
        .Cells(RowChanged, ColChanged).Font.Color = RGB(255, 0, 0)
      End If
    End With
  End If

End Sub