用于根据表格标题将日期/时间戳自动输入到单元格中的代码

时间:2019-06-19 16:40:13

标签: excel vba excel-vba

我有一个Excel VBA工作流程,可将数据从数据输入表(inputwks)输入到表中。如下所示:

  1. 按下按钮,将新行添加到表中。
  2. 在特定的列标题名称“日期/时间”列中输入时间戳。 (以下代码中的M列)
  3. 将inputwks中的输入数据输入到特定的表标题名称“数据记录”列中。 (在下面的代码中显示为第3列)

我不想使用列字母或数字,因为我可能会更改顺序(例如,日期/时间对A列中的用户而言可能比M看起来更好)。

如何更改下面的代码,以便宏将搜索“日期/时间”列,而不是转到M列,而对“数据记录”也是如此?

感谢您提供的任何帮助。

Sub UpdateLogWorksheet()

    'Dim historyWks As Worksheet
    Dim ccarWks As Worksheet
    Dim inputWks As Worksheet

    Dim nextRow As Long
    Dim oCol As Long
    '======================Named range setup=========================
    Dim myCopy As Range
    Dim myTest As Range
    Dim lRsp As Long
    '=====================worksheet name setup=======================
    Set inputWks = Worksheets("Input (Modded)")     
    Set ccarWks = Worksheets("CCAR - VB Template Ver2.0")     
    oCol = 3 
      '===================Copy/paste data commands==================

    Set myCopy = inputWks.Range("inputvalue") 
    With ccarWks 
        nextRow = .Cells(.Rows.Count, "A").End(xlUp).Offset(1, 0).Row
    End With

    With ccarWks 
       With .Cells(nextRow, "M") 'was "A"
           .Value = Now
           .NumberFormat = "dd/mm/yyyy hh:mm:ss" 'enter date and time stamp in record
       End With

       myCopy.Copy
       .Cells(nextRow, 3).PasteSpecial Paste:=xlPasteValues, Transpose:=True 
       Application.CutCopyMode = False

   End With

End Sub

2 个答案:

答案 0 :(得分:0)

我过去也不得不处理此问题,因为源表已更改,因此您不能确定该字段位于同一列中。 如果您始终具有相同的字段标题(列标题),则可以使用我之前使用的代码。

Public Function FindColumn(ws As Worksheet, name As String, Optional headerRow As Integer = 1) As Integer

    On Error GoTo FUNC_ERR

    Dim sRng As Range: Set sRng = ws.Rows(headerRow).Find(what:=name, _
                                                          LookIn:=xlValues, _
                                                          lookat:=xlWhole)
    If sRng Is Nothing Then
        'Handle if not found
    Else
        FindColumn = sRng.Column
    End If

FUNC_EXIT:
    Exit Function

FUNC_ERR:
    'Handle error

End Function

HeaderRow是可选的,并假定为第1行,但是如果需要,您也可以调出其他行。

然后,您可以使用返回的列号来代替在.cell()标注中使用列字母。

dim columnNumber as Integer: columnNumber = FindColumn(ccarWks, "Header Name")
With ccarWks    
    With .Cells(nextRow, columnNumber) 
        .Value = Now
        .NumberFormat = "dd/mm/yyyy hh:mm:ss" 
    End With

    '...more code...
End With

希望这对您有所帮助。

答案 1 :(得分:0)

我添加了以下代码,以确保它能够动态更改要查找的列号:

   Datetimecol = Application.WorksheetFunction.Match("date/time", CCARWKS.Range("A4:AZ4"), 0)

   With .Cells(nextRow, datetimecol)

这现在会自动更改列值,并防止破坏代码。