我有一个用这些标题列出的表格:
Task ID | Description | Date completed | Time completed
假设该表已设置为任务ID在单元格A3,描述B3,日期完成C3和时间完成D3中。在单元格A1中,我将输入要查找的任务ID。
我想要发生的是,当运行宏时,在表格中找到输入到单元格A1的任务ID,然后将日期和时间(运行宏时)输入到相应的单元格中在C和D列中。
谢谢!
答案 0 :(得分:0)
听起来你只需要一堆VLOOKUPS。在单元格A1中输入您的任务ID。在单元格A2中输入VLOOKUP以获取描述(假设您有100个ID)
=VLOOKUP($A$1,$A$4:$D$100,2,FALSE)
和A3中的日期等
=VLOOKUP($A$1,$A$4:$D$100,3,FALSE)
答案 1 :(得分:0)
以下两个过程代表了您感兴趣的一种方法。第一个使用FIND
函数在表中找到与单元格A1
的内容匹配的任务ID;第二个程序在A1
中输入时运行第一个程序。
您需要将此代码粘贴到工作簿中的标准VBA模块中。通过从功能区的Visual Basic
选项卡中选择Developer
,然后在VBA代码编辑器的主菜单上选择Insert
,Module
,可以插入标准代码模块。
请注意,该过程假定任务表位于工作簿的Sheet1
中。如果它在另一个工作表中,您需要将代码中的名称“Sheet1”更改为正确的名称。
Sub LogTaskCompletion()
Dim lastRow As Long
Dim foundCell As Range
With ThisWorkbook.Sheets("Sheet1") '<-- change sheet name here
If Not .Range("A1").Value = "" Then
lastRow = .Range("A" & Rows.Count).End(xlUp).Row
'do the search
Set foundCell = .Range("A2:A" & lastRow).Find(What:=.Range("A1").Value, _
LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)
If Not foundCell Is Nothing Then
'a match! post the date and time for the task
With foundCell
.Offset(0, 2).Value = Date
.Offset(0, 2).NumberFormat = "mm-dd-yyyy"
.Offset(0, 3).Value = TimeValue(Now())
.Offset(0, 3).NumberFormat = "hh:mm am/pm"
End With
Else
'no match!
MsgBox "Cannot find task " & .Range("A1").Value
End If
.Range("A1").ClearContents
End If
End With
End Sub
只要在A1
中输入了一个条目,此过程就会运行前面的宏。
它需要作为任务表所在工作表的私有代码安装。最简单的方法是右键单击工作表的选项卡,选择View Code
,然后将代码粘贴到弹出的编辑器窗格。
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A1")) Is Nothing Then
Exit Sub
End If
Application.EnableEvents = False
LogTaskCompletion
Application.EnableEvents = True
End Sub
安装代码后,将文件另存为启用宏(“xlsm”)的工作簿。
答案 2 :(得分:0)
可以通过Worksheet_Change
和Vlookup
的组合来实现。请将此代码放在表单代码部分。
在A1
中输入值后,将触发宏,如果在表中找到值,则使用Vlookup获取相应的值(描述)。它也进入当前日期&amp;时间。
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Application.EnableEvents = False
If Not Intersect(Target, Range("A1")) Is Nothing Then
Dim lastRow As Long, tblRng As Range
lastRow = Range("A" & Rows.Count).End(xlUp).Row
If lastRow <= 3 Then lastRow = 3
Set tblRng = Range("A3:D" & lastRow)
dt = Application.VLookup(Target, tblRng, 1, 0)
If Not IsError(dt) Then
With Target
.Offset(0, 1).Value = Application.VLookup(Target, tblRng, 2, 0)
.Offset(0, 2).Value = Date
.Offset(0, 2).NumberFormat = "mm/dd/yyyy"
' if you want date from tbl use Application.VLookup(Target, tblRng, 3, 0)
.Offset(0, 3).Value = TimeValue(Now())
.Offset(0, 3).NumberFormat = "hh:mm am/pm"
' if you want date from tbl use Application.VLookup(Target, tblRng, 4, 0)
End With
Else
With Target
.Offset(0, 1).Value = vbNullString
.Offset(0, 2).Value = vbNullString
.Offset(0, 3).Value = vbNullString
End With
End If
End If
Application.EnableEvents = True
End Sub