我正在设置日志来跟踪办公室的库存。对于某些项目,我们拥有同一工具的多个副本。我已经让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
答案 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
注意: 我没有测试过这段代码,除了自己阅读以确保它有意义。可能会有一些错误(希望不会),如果您无法解决,请不要犹豫,让我知道,以便我们可以共同努力。如果这对您有用,请告诉我:)