查找唯一ID并将日期插入下一列

时间:2013-06-08 19:40:09

标签: excel excel-vba vba

我有一个用这些标题列出的表格:

Task ID | Description | Date completed | Time completed

假设该表已设置为任务ID在单元格A3,描述B3,日期完成C3和时间完成D3中。在单元格A1中,我将输入要查找的任务ID。

我想要发生的是,当运行宏时,在表格中找到输入到单元格A1的任务ID,然后将日期和时间(运行宏时)输入到相应的单元格中在C和D列中。

谢谢!

3 个答案:

答案 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代码编辑器的主菜单上选择InsertModule,可以插入标准代码模块。

请注意,该过程假定任务表位于工作簿的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_ChangeVlookup的组合来实现。请将此代码放在表单代码部分。

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

enter image description here

相关问题