找到具有匹配值的第一个空白单元格匹配特定标准

时间:2016-10-26 20:06:52

标签: excel-vba indexing find match vba

是的......那是满口的。

我正在设置日志来跟踪办公室的库存。对于某些项目,我们拥有同一工具的多个副本。我已经让VBA用userforms和vba跟踪所有者,但多个相同的名字,首次出现,空白单元技巧对我来说太过分了。

所以你拥有的是:

Item      Serial Number     Owner
Item A     999999999
Item A     999999991
Item A     999999992
Item B     22221
Item B     22222
Item B     22223
Item C     hhhg77
Item C     hhhg78
Item C     hhhg79

我需要代码来搜索从Userform上的ComboBox1收集的ITEM名称,并找到没有所有者的ITEM的第一次出现,(因此相应的“OWNER”单元格应为空白,并放置OWNER,从用户表单上的ComboBox2收集到的那个地方。

我一直在和Index&匹配和VLookup和无数次搜索“寻找第一行”,但我已经空了。

范围可能会有所改变,所以我犹豫是否要特别指出在A2:A4之间进行搜索,所以我认为搜索最好。

到目前为止我所拥有的是......而且它很弱,我道歉。

Public Sub FindBlankOwner()
    Dim MultiItem As Range
    Dim MultiOwner As Range
    Dim ITEM As String
    Dim OWNER As String
    Dim MultiSerial As Range
    Dim NO As Range

    ITEM = ComboBox1.Value
    STATUS = Application.WorksheetFunction.VLookup(ITEM, LUP, 6, False)
    OWNER = ComboBox2.Value

    Set ws = Worksheets("Owners")
    Set MultiItem = Worksheets("Owners").Range("A1:A28")
    Set MultiOwner = Worksheets("Owners").Range("C1:C28")
    Set MultiSerial = Worksheets("Owners").Range("B1:B28")

Fillin = Evaluate("INDEX(MultiOwner, MATCH(ITEM, &

'    Set FILLIN = Application.WorksheetFunction.Match(ITEM, (MultiItem), 0) And (Application.WorksheetFunction.Match(" ", (MultiOwner), 0))
 '   NO.Value = OWNER

    'Set FILLIN = MultiItem.Find(What:=ITEM) And MultiOwner.Find(What:="")

End Sub

1 个答案:

答案 0 :(得分:0)

根据空所有者

搜索可用项目

我已经为您的评论写了一些原始代码。你是在正确的轨道上,但使用下面的方法我们避免使用工作表函数,而是使用VBA方法。

我们要做的第一件事是找到第一次出现的用户定义ITEM

之后我们会检查它是否有OWNER。如果是,请找到下一个ITEM。如果没有,请将用户定义的OWNER分配给用户定义的ITEM

为了清晰和方便最终用户,我添加了一些消息框。

守则

Sub FindBlankOwner()
    Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Owners")
    Dim ITEM As String: ITEM = ComboBox1.Value
    Dim OWNER As String: OWNER = ComboBox2.Value
    Dim BlankOwnerFound As Boolean: BlankOwnerFound = False
    Dim firstResult As String
    Dim ItemRange As Range: Set ItemRange = ws.Range("A:A").Find(What:=ITEM, LookIn:=xlValues, LookAt:=xlWhole)

    If Not ItemRange Is Nothing Then
        firstResult = ItemRange.Address
        Do
            If Trim(ItemRange.Offset(0, 2).Value) = "" Then
                ItemRange.Offset(0, 2).Value = OWNER
                BlankOwnerFound = True
            Else
                Set ItemRange = ws.Range("A:A").FindNext(ItemRange)
            End If
        Loop While Not ItemRange Is Nothing And ItemRange.Address <> firstResult And BlankOwnerFound = False
    Else: MsgBox "No results for " & ITEM & " found.", vbCritical, "Cannot Find " & ITEM
    End If

    If BlankOwnerFound = True Then
        MsgBox OWNER & " has checked out " & ITEM & " with Serial Number " & ItemRange.Offset(0, 1).Value & ".", _
               vbOKOnly, ITEM & " Check-Out Successful"
    Else: MsgBox "No available " & ITEM & " in inventory.", vbCritical, "All " & ITEM & " are checked out."
    End If
End Sub

注意: 我没有测试过这段代码,除了自己阅读以确保它有意义。可能会有一些错误(希望不会),如果您无法解决,请不要犹豫,让我知道,以便我们可以共同努力。如果这对您有用,请告诉我:)