【问题标题】:VBA Find value in range and change cell valueVBA在范围内查找值并更改单元格值
【发布时间】:2018-12-13 17:02:00
【问题描述】:

不确定如何使用下面列出的步骤完成此代码。任何帮助表示赞赏

Sub Test()
Dim Value As Double

    For Each Value In ThisWorkbook.Sheets("Sheet").Range("V17:V57")
        If Value.ThisWorkbook.Sheets("Sheet").Range("V17:V57") = 0 Then...
        ...
        End If
End Sub

检查范围内是否存在0

如果是真的……

  • 重置我的“数据验证”单元格源范围在同一工作表上,该工作表有一个取决于新范围的下拉列表(即从单元格 Q17 到 0 值所在的同一行)。 请注意,此 Source 范围位于 0 值所在列左侧的 5 列,并且此范围的第一行与包含 0 值的范围开始的行 (17) 相同

否则...

  • 使用Application.WorksheetFunction.FormulaArray ("MAX(IF(V17:V37<=0,V17:V37),MIN(V17:V37))")之类的方法查找并选择负值最小的单元格

  • 一旦找到/选择了单元格,执行目标搜索,将选定单元格设置为 0,方法是更改​​选定单元格左侧 4 个单元格中的值

  • 如上自动更新“数据验证”源范围

当 0 存在时,我正在尝试此代码,但如何根据数据表另一列中相应的单元格范围设置验证范围?单元格 H24 是我的下拉列表所在的位置

Dim rng As Range
For Each rng In ThisWorkbook.Sheets("Sheet").Range("V17:V57")
    If rng.Value = 0 Then
    ThisWorkbook.Sheets("Sheet").Select
    Range ("H24").Select
       With Selection.Validation
      .Delete
      .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="=Sheet!$V$17:$V" & ??
    Else...

以下代码在评估行给出调试错误。 整体代码块需要简化...太多 If, For, Next??为了清楚起见,我已经注释了。在目标搜索线方面也需要帮助。

Dim rng As Range
For Each rng In ThisWorkbook.Sheets("Sheet").Range("V17:V57")
    If rng.Value <> 0 Then
    rng = Application.WorksheetFunction.FormulaArray("MAX(IF(V17:V57<=0,V17:V57),MIN(V17:V57))") 'this formula searches for the least min number in the range
    rng.Select
    Range("selected cell").GoalSeek Goal:=0, ChangingCell:=Range("cell 5 columns left of selected cell")...this line makes selected cell = 0 
    Exit For
    End If
Next rng

【问题讨论】:

  • Dim rng as Range: For Each rng In ThisWorkbook.Worksheets("Sheet").Range("V17:V57") : If rng.Value = 0 Then.....:Else. ...:结束如果........
  • 不确定如何处理验证。根据对原始问题的编辑

标签: vba excel


【解决方案1】:
'To check if an element is within a specific Array, Object, Range, String, etc.
Public Function isInArray(ByVal itemSearched As Variant, ByVal aArray As Variant) As Boolean
Dim item As Variant

If VarType(aArray) >= vbArray Or VarType(aArray) = vbObject Or VarType(aArray) = vbDataObject Or TypeName(aArray) = "Range" Then
    For Each item In aArray
        If itemSearched = item Then
            isInArray = True
            Exit Function
        End If
    Next item
    isInArray = False
ElseIf VarType(aArray) = vbString Then
    isInArray = InStr(1, aArray, itemSearched, vbBinaryCompare) > 0 'Comparing character by character
Else
    On Error Resume Next
    isInArray = Not IsError(Application.Match(itemSearched, aArray, False)) 'Slow on large arrays
    Err.Clear: On Error GoTo 0
End If

End Function

【讨论】:

  • 在处理这段代码之前,我需要退后一步。感谢您发送。我刚刚用一个新的代码块编辑了我的原始问题,我需要一些支持。
【解决方案2】:

假设您想在 A1:B10 范围内找到值“3”:

Set given_range = ThisWorkbook.Worksheets("Sheet1").Range("A1:B10")
given_range.Select
Set found_value = Selection.Find("3")

如果您正在寻找它的地址:

value_address = found_value.Address(0,0)

使用末尾的 (0,0) 将返回不带任何 $ 的地址(B3 而不是 $B$3)

另外:如果你想知道行或列,请执行以下操作

value_column = Split(found_value.Address, "$")(1)
value_row = Split(found_value.Address, "$")(2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多