如何将公式插入并拖动到Excel VBA中的最后一行

时间:2017-11-24 08:19:05

标签: excel vba excel-vba excel-2010

enter image description here 我想在E行的末尾插入仅计算每月的第1天(1.Nov.2017,1.Dec.2017等)的公式,并将其拖动到等于D行的值的末尾。我使用下面的代码但没有工作。

我需要" E12:E21"仅在A:D有数据的情况下为01.Nov.2017。但是A:D会自动计算出来。下个月A22:D24将包含数据。所以我需要" E22:E24"截至2017年12月1日。帮帮我

Private Sub CommandButton1_Click()

Range("E" & Rows.Count).End(xlUp).Offset(1, 0).Select
Run FirstDayInMonth()
Selection.AutoFill Destination:=Range("D" & Column.count).End(xlUp).Offset(0, 1), Type:=xlFillCopy

End Sub

Function FirstDayInMonth(Optional dtmDate As Date = 0) As Date
Range("E" & Rows.Count).End(xlUp).Offset(1, 0).Select
    If dtmDate = 0 Then
       dtmDate = Date
    End If
FirstDayInMonth = DateSerial(Year(dtmDate), _
Month(dtmDate), 1)
End Function

2 个答案:

答案 0 :(得分:1)

首先,你过度使用Select。它应仅在一个案例中的代码中使用 - 如果您希望宏指向某个单元格的末尾。 See this article, for example
其次,避免使用Smart UI反模式。什么是智能UI,you can read here

第三,我认为你应该使用sub,而不是这里的功能。

Sub FillFirstDay(Optional dtmDate As Double = 1)

Dim ws As Worksheet
Dim rng As Range
Dim lastRow As Long, firstRow As Long

Set ws = ActiveSheet 'You should assign your sheet here, for example by name

'Then we find our range in E column
With ws
    lastRow = .Range("D" & .Rows.Count).End(xlUp).Row
    firstRow = .Range("E" & .Rows.Count).End(xlUp).Row + 1
    Set rng = Range(.Range("E" & firstRow), .Range("E" & lastRow))
End With

If firstRow >= lastRow Then Exit Sub

'And finally add first date of month
With rng
    .Value = DateSerial(Year(dtmDate), Month(dtmDate), 1)
    .NumberFormat = "yyyy-mm-dd" 'or whatever date format do you like
End With

End Sub

行如果firstRow> = lastRow则当E列中的日期已经填充时,Exit Sub终止该过程。

答案 1 :(得分:0)

也许我错过了一个必须以复杂的方式完成的原因,但是你不能只使用工作表函数吗?

您希望E列在有数据的行中显示日期(当月的第1天)吗?

直接或以编程方式(使用WorksheetFunction)将其放入单元格E2(或所有E列中):

=IF(D2="","",DATE(YEAR(NOW()),MONTH(NOW()),1)) 

修改后的公式:

example formula