数据到特定的Cell Excel VBA休假计划

时间:2016-01-10 16:11:23

标签: excel excel-vba excel-formula vba

我正在使用一个表格制作休假计划,用户选择他的名字而不是开始日期和结束日期,并使用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个首字母在一个按日期范围划分的单元格,例如

  • ABC(1月1日至1月5日)DEF(1月3日至1月6日)和XYZ(1月2日至1月7日)
  • 所以在1月1日ABC的细胞中
  • 1月2日的细胞ABC / XYZ
  • 1月3日的细胞ABC / DEF / XYZ至5月5日
  • 1月6日的细胞DEF / XYZ
  • 1月7日的小区XYZ

列宽和高度无关紧要(大或小自动调整)只希望数据在各个日期范围内显示在日历上

cal

1 个答案:

答案 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"并将其设置为红色或其他颜色以使其更加明显。