我正在使用一个表格制作休假计划,用户选择他的名字而不是开始日期和结束日期,并使用VBA申请我将该数据存储到工作表A B和C栏
Dim irow As Long, _
wS As Worksheet, _
NextRow As Long, _
cF As Range
Set wS = Worksheets("Sheet1")
With wS
With .Range("A:A")
Set cF = .Find(What:=Me.Combo.Value, _
After:=.Cells(1, 1), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False, _
SearchFormat:=False)
End With
If Not cF Is Nothing Then
If cF.Offset(0, 1) <> vbNullString Then
Set cF = cF.End(xlToRight).Offset(0, 1)
cF.Value = Me.startdate.Value
cF.Offset(0, 1).Value = Me.enddate.Value
Else
.Cells(cF.Row, "B").Value = Me.startdate.Value
.Cells(cF.Row, "C").Value = Me.enddate.Value
End If
Else
NextRow = .Cells(.Rows.Count, "A").End(xlUp).Offset(1, 0).Row
.Cells(NextRow, "A").Value = Me.Combo.Value
.Cells(NextRow, "B").Value = Me.startdate.Value
.Cells(NextRow, "C").Value = Me.enddate.Value
End If
End With
存储数据后,我使用公式在日历中显示这些名称
= IFERROR(INDEX($ A $ 20:$ A $ 151 MATCH(1,IF(DATE($ d $ 1,ROWS($ A $ 3:$ A3),B 2 $)&GT; = $ B $ 20:$ B $ 151 IF(DATE($ d $ 1,ROWS($ A $ 3:$ A3),B 2 $)&LT; = $ C $ 20:$ C $ 151,1)),0)), “”)
在VBA中是否可以进行一些更改(以避免使用公式)因此它将直接存储在打算按图像显示的位置MAX 3人可以在同一日期离开,因此最多3个首字母在一个按日期范围划分的单元格,例如
列宽和高度无关紧要(大或小自动调整)只希望数据在各个日期范围内显示在日历上
答案 0 :(得分:0)
这是一个UDF,您可以直接在工作表上用作公式:
Function vac(dt As Date, rngnme As Range, rngstrt As Range, rngend As Range) As String
Application.Volatile
Dim i&
Dim temp As String
temp = ""
For i = 1 To rngnme.Rows.Count
If rngnme.Cells(i, 1) <> "" Then
If rngstrt.Cells(i, 1) <= dt And rngend.Cells(i, 1) >= dt Then
temp = temp & rngnme.Cells(i, 1) & ","
End If
End If
Next i
If temp = "" Then
vac = CVErr(xlErrNA)
ElseIf Len(temp) - Len(Replace(temp, ",", "")) > 3 Then
vac = "> 3"
Else
vac = Left(temp, Len(temp) - 1)
End If
End Function
在模块中发布此信息,而不是工作表代码或本工作簿代码。然后你可以通过在B3中放置以下公式来调用它:
=IFERROR(vac(DATE($D$1,ROWS($A$3:$A3),B$2),$A$20:$A$30,$B$20:$B$30,$C$20:$C$30),"")
然后上下复制。
它将返回&#34;&#34;如果那天没有人分配,或者它将返回用逗号分隔的名称,或者如果有超过三个,则返回&#34;&gt; 3&#34;
然后,您可以应用条件格式规则&#34; =B3="> 3"
并将其设置为红色或其他颜色以使其更加明显。