Error handling 作为整数 Dim TgtRngPartList()作为字符串 Dim TgtRngList()作为变量 将TgtRngPart设置为字符串 Dim TgtRowBottom作为整数 Dim TgtRowTop作为整数 Dim值更改为字符串 Dim Valu
作为整数 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 如果结束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
如果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