我想在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
答案 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)