用最新date查找名称的列表和列

我有一个三列,ID,名称和date的表

在这里输入图像说明

然后我创build一个带有文本框ID和名称的用户窗体。

当我input用户表单中的ID时,如何显示最近date表中的类似ID的名称? (类似的ID会有不同的名字,但是我想在表格中显示最新的date)

在此先感谢所有的帮助

为textbox1编码

Private Sub TextBox1_Change() getdata End Sub 

编码getdata模块

 Sub getdata() If IsNumeric(UserForm1.TextBox1.Value) Then flag = False i = 0 id = UserForm1.TextBox1.Value Do While Cells(i + 1, 1).Value <> "" If Cells(i + 1, 1).Value = id Then flag = True For j = 2 To 3 UserForm1.Controls("textbox" & j).Value = Cells(i + 1, j).Value Next j End If i = i + 1 Loop If flag = False Then For j = 2 To 3 UserForm1.Controls("TextBox" & j).Value = "" Next j End If Else ClearForm End If End Sub 

这应该为你做。 这个例程进入你的用户表单代码模块:

 Private Sub TextBox1_AfterUpdate() TextBox2 = Evaluate("=INDEX(B2:B999,MATCH(MAX((IF(A2:A999=" & TextBox1 & _ ",1)*(C2:C999)),1),IF(A2:A999=" & TextBox1 & _ ",1)*(C2:C999),))") End Sub 

它假定你的数据在A,B和C列。它也假设你的数据不会延伸到999行; 如果他们这样做,那么将公式中的999增加到适当的值。

TextBox1是为ID。 TextBox2是名称。

请注意,此代码被放置在AfterUpdate事件过程中。 这与您的示例代码不同。 您使用了更改事件过程。 不同之处在于,每次按键更改都会触发,而AfterUpdate只有在确认文本框的全文后才会触发。

请注意,您仍然应该为ID不是数字的情况以及数字ID不匹配的情况添加错误检查。 上面的代码只是为了演示显示查找值的技巧。 如果你希望我补充更多,请让我知道。

UPDATE

我继续前进,并用错误检查进行了充实:

 Private Sub TextBox1_AfterUpdate() GetData End Sub Public Sub GetData() Dim v, w On Error Resume Next v = Evaluate("=INDEX(B2:B999,MATCH(MAX((IF(A2:A999=" & TextBox1 & _ ",1)*(C2:C999)),1),IF(A2:A999=" & TextBox1 & _ ",1)*(C2:C999),))") w = Evaluate("MAX((IF(A2:A999=" & TextBox1 & ",1)*(C2:C999)))") If IsArray(v) Or IsError(v) Then v = "ID not found.": w = "" TextBox2 = v TextBox3 = "": TextBox3 = CDate(w) End Sub 

更新2在直接上面的充实版本中,我添加了对TextBox3中关联date的支持。

您可以在用户窗体打开时读取整个范围,对其进行sorting,然后查找第一个ID。

 Private mvaData As Variant Private Sub TextBox1_AfterUpdate() Me.TextBox2.Text = vbNullString Me.TextBox3.Text = vbNullString GetData End Sub Public Sub GetData() Dim i As Long For i = LBound(mvaData, 1) To UBound(mvaData, 1) If mvaData(i, 1) = Val(Me.TextBox1.Text) Then Me.TextBox2.Text = mvaData(i, 2) Me.TextBox3.Text = mvaData(i, 3) Exit For 'stop after the first one - largest date End If Next i End Sub Private Sub UserForm_Initialize() Dim i As Long, j As Long Dim lId As Long, sDesc As String, dtDate As Date 'store the data in a variable when the forms opens mvaData = Sheet1.Range("A1:C5") 'sort with larger dates on top For i = LBound(mvaData, 1) To UBound(mvaData, 1) - 1 For j = i To UBound(mvaData, 1) If mvaData(i, 3) < mvaData(j, 3) Then lId = mvaData(j, 1) sDesc = mvaData(j, 2) dtDate = mvaData(j, 3) mvaData(j, 1) = mvaData(i, 1) mvaData(j, 2) = mvaData(i, 2) mvaData(j, 3) = mvaData(i, 3) mvaData(i, 1) = lId mvaData(i, 2) = sDesc mvaData(i, 3) = dtDate End If Next j Next i End Sub