Excel VBA – 结束date

B列是我的数据 – 如果列B中有date值,请在C列中返回周结束date。需要VBA代码来完成此操作

Column B Column C 11/9/2016 11/11/2016 11/8/2016 11/11/2016 4/4/2017 4/7/2017 (blank) (blank) 3/28/2017 3/31/2017 

以下是我所能得到的,但不是什么好事。

 Dim FirstDayInWeek, LastDayInWeek As Variant Dim dtmDate As Date dtmDate = Range("B2:B") LastDayInWeek = dtmDate - Weekday(dtmDate, vbUseSystem) + 7 MsgBox LastDayInWeek 

我回答了您如何从给定date查找开始date的评论? ,但是这里是一个答案:

 Function ReturnDate(DateRange As Date, Optional DayInWeek = 1) As Date ReturnDate = DateRange - Weekday(DateRange, vbUseSystem) + DayInWeek End Function 

=ReturnDate(A1)给星期一
=ReturnDate(A1,2)给星期二

=ReturnDate(A1,5)给星期五<—这是你之后的那个。
=ReturnDate(A1,7)给星期天。

一个空白的单元格会给01/01/1900 ,但你可以添加一个检查,或格式单元格不显示0。

你可以采取类似于下面的方法

 Sub ReturnWeekEndDate() Dim InpRng As Range Dim i As Long Set InpRng = ActiveSheet.Range("A2:B5") For i = 1 To InpRng.Rows.Count If IsDate(InpRng.Cells(i, 1).Value) And IsDate(InpRng.Cells(i, 2).Value) Then InpRng.Cells(i, 1).Offset(0, 2) = InpRng.Cells(i, 1).Value - Weekday(InpRng.Cells(i, 1).Value, vbUseSystem) + 7 End If Next i End Sub 

试试这个:

 Sub INeedADate() Dim i As Long, N As Long, r As Range, Bigr As Range N = Cells(Rows.Count, "B").End(xlUp).Row For i = 1 To N Set r = Cells(i, "B") If IsDate(r.Value) Then addy = r.Address r.Offset(0, 1).Value = Evaluate(addy & "-WEEKDAY(" & addy & ",3)+IF(WEEKDAY(" & addy & ",3)>4,11,4)") End If Next i End Sub 

这与使用工作表公式相似:

 =B1-WEEKDAY(B1,3)+IF(WEEKDAY(B1,3)>4,11,4) 

或者试试这个…

 Sub GetFridayDate() Dim LastDayInWeek As Date Dim Rng As Range, Cell As Range Dim lr As Long lr = Cells(Rows.Count, 2).End(xlUp).Row Set Rng = Range("B2:B" & lr) For Each Cell In Rng If IsDate(Cell.Value) Then LastDayInWeek = Cell + 8 - Weekday(Cell, vbFriday) Cell.Offset(0, 1) = LastDayInWeek End If Next Cell End Sub 

你说这将是一个过程的一部分……所以,就像我所说的那样调用函数,而你是金的! 繁荣!

 Sub FindEndOfWeek_Test() Call FindEndOfWeek(ActiveSheet, 1, 2, 6, 1) End Sub Function FindEndOfWeek(Sht As Worksheet, KnownDate_Column As Integer, _ EndOfWeek_Column, EndOfWeek As Integer, _ StartingRow As Long) ' This function takes in a spreadsheet, and and determines the date at the end ' of the week, based on known parameters being passed into the function. ' Dim a As Long Dim LastRow As Long Dim EvalDate As Date Dim NewDate As Date ' Determine the last row of the column you are working with LastRow = Sht.Cells(Sht.Rows.Count, KnownDate_Column).End(xlUp).Row ' Loop through your entire spreadsheet to determine the end of the week for all rows For a = StartingRow To LastRow If IsDate(Sht.Cells(a, KnownDate_Column).Value) = True Then NewDate = Sht.Cells(a, KnownDate_Column).Value EvalDay = Weekday(NewDate) ' Determine the known date day of the week, and add accordingly. If EvalDay < EndOfWeek Then Sht.Cells(a, EndOfWeek_Column).Value = NewDate + (EndOfWeek - EvalDay) ElseIf EvalDay > EndOfWeek Then Sht.Cells(a, EndOfWeek_Column).Value = NewDate + (7 - EvalDay + EndOfWeek) Else Sht.Cells(a, EndOfWeek_Column).Value = NewDate End If End If Next a End Function 

我认为不需要vba,你使用下面的公式:

 =IF(B2<>"",B2+(7-WEEKDAY(B2,16)),"") 

在这里输入图像说明