Excel 根据某些条件将值复制到VBA上的空单元格的函数

Excel 根据某些条件将值复制到VBA上的空单元格的函数,excel,vba,excel-formula,Excel,Vba,Excel Formula,我是编程界的新手,目前正面临VBA的挑战 我已经建立了一个月历电子表格,根据某些情况,在每天的数字下面有一个空白区域需要填充 我想用姓名列表填充这些空格,这取决于此人是否具有Active值。另一个强加的条件是,如果日历的日期是holliday,那么单元格将保持空白,因此我制作了一个holliday列表来测试这个条件 到目前为止,我编写的代码如下: Sub teste() line_fill = 5 line_names = 3 column_names = 17 column_active =

我是编程界的新手,目前正面临VBA的挑战

我已经建立了一个月历电子表格,根据某些情况,在每天的数字下面有一个空白区域需要填充

我想用姓名列表填充这些空格,这取决于此人是否具有Active值。另一个强加的条件是,如果日历的日期是holliday,那么单元格将保持空白,因此我制作了一个holliday列表来测试这个条件

到目前为止,我编写的代码如下:

Sub teste()
line_fill = 5
line_names = 3
column_names = 17
column_active = 18

For i = 6 To 10
    Dim values As Worksheets("Planilha1").Cells(5, i))
    Dim test As Worksheets("Planilha1").Cells(line_fill - 1, i)
    Dim names As Worksheets("Planilha1").Cells(line_names, column_active)
    Dim active As Worksheets("Planilha1").Cells(line_names, column_names)

    If IsEmpty(test) And test.value <> WorksheetFunction.VLookup(test.value, Sheet1.Range("M4:M100"), 1, False) Then
        If names.value = "Ativo" Then
            values = active
    line_names = line_names + 1
    i = i + 1
Next i
End Sub
子测试()
线_填充=5
行名称=3
列名称=17
列_活动=18
对于i=6到10
将值设置为工作表(“Planilha1”)。单元格(5,i))
作为工作表(“Planilha1”)单元格进行尺寸测试(第1行,i)
将名称标注为工作表(“Planilha1”)。单元格(行名称,列活动)
以工作表(“Planilha1”)的形式调暗活动单元格(行名称、列名称)
如果IsEmpty(test)和test.value工作表function.VLookup(test.value,Sheet1.Range(“M4:M100”)、1,False),则
如果name.value=“Ativo”,则
值=活动
行名称=行名称+1
i=i+1
接下来我
端接头


请尝试使用
F8逐步完成代码,以便您理解我所做的,并尝试调整它以满足您的需要

这是我用来编码它的设置:

Option Explicit

Public Sub CopyValuesInCalendar()

    Dim targetSheet As Worksheet
    Dim calendarRange As Range
    Dim holidaysRange As Range
    Dim teamRange As Range
    Dim evalDayCell As Range

    Dim teamFilteredList As Variant

    Dim holidayLastRow As Long
    Dim teamLastRow As Long

    Dim counter As Long

    Set targetSheet = ThisWorkbook.Worksheets("Planilha1")

    targetSheet.AutoFilterMode = False

    Set calendarRange = targetSheet.Range("D4:J13")

    holidayLastRow = targetSheet.Cells(targetSheet.Rows.Count, 12).End(xlUp).Row

    teamLastRow = targetSheet.Cells(targetSheet.Rows.Count, 16).End(xlUp).Row

    Set holidaysRange = targetSheet.Range("L4:N" & holidayLastRow)

    Set teamRange = targetSheet.Range("P3:Q" & teamLastRow)

    teamFilteredList = GetActiveTeamMembers(teamRange)

     For Each evalDayCell In calendarRange.Cells

        If IsNumeric(evalDayCell.Value) And evalDayCell.Value <> vbNullString Then

            If Not IsHoliday(evalDayCell.Value, holidaysRange) Then

                If counter > UBound(teamFilteredList) Then
                    counter = 1
                Else
                    counter = counter + 1
                End If

                evalDayCell.Offset(1, 0).Value = GetTeamMemberName(counter, teamFilteredList)

            End If

        End If

    Next evalDayCell



End Sub

Private Function IsHoliday(ByVal dayNum As Long, ByVal holidayRange As Range) As Boolean

    Dim evalCell As Range

    For Each evalCell In holidayRange.Columns(1).Cells

        If evalCell.Value = dayNum Then

            IsHoliday = True

        End If

    Next evalCell

End Function

Private Function GetActiveTeamMembers(ByVal teamRange As Range) As Variant

    Dim evalCell As Range

    Dim counter As Long
    Dim tempList() As Variant

    For Each evalCell In teamRange.Columns(1).Cells

        If evalCell.Offset(0, 1).Value = "Ativo" Then

            ReDim Preserve tempList(counter)

            tempList(counter) = evalCell.Value

            counter = counter + 1

        End If

    Next evalCell

    GetActiveTeamMembers = tempList

End Function

Private Function GetTeamMemberName(ByVal counter As Long, ByVal teamFilteredList As Variant) As String

    GetTeamMemberName = teamFilteredList(counter - 1)

End Function

代码如下:

Option Explicit

Public Sub CopyValuesInCalendar()

    Dim targetSheet As Worksheet
    Dim calendarRange As Range
    Dim holidaysRange As Range
    Dim teamRange As Range
    Dim evalDayCell As Range

    Dim teamFilteredList As Variant

    Dim holidayLastRow As Long
    Dim teamLastRow As Long

    Dim counter As Long

    Set targetSheet = ThisWorkbook.Worksheets("Planilha1")

    targetSheet.AutoFilterMode = False

    Set calendarRange = targetSheet.Range("D4:J13")

    holidayLastRow = targetSheet.Cells(targetSheet.Rows.Count, 12).End(xlUp).Row

    teamLastRow = targetSheet.Cells(targetSheet.Rows.Count, 16).End(xlUp).Row

    Set holidaysRange = targetSheet.Range("L4:N" & holidayLastRow)

    Set teamRange = targetSheet.Range("P3:Q" & teamLastRow)

    teamFilteredList = GetActiveTeamMembers(teamRange)

     For Each evalDayCell In calendarRange.Cells

        If IsNumeric(evalDayCell.Value) And evalDayCell.Value <> vbNullString Then

            If Not IsHoliday(evalDayCell.Value, holidaysRange) Then

                If counter > UBound(teamFilteredList) Then
                    counter = 1
                Else
                    counter = counter + 1
                End If

                evalDayCell.Offset(1, 0).Value = GetTeamMemberName(counter, teamFilteredList)

            End If

        End If

    Next evalDayCell



End Sub

Private Function IsHoliday(ByVal dayNum As Long, ByVal holidayRange As Range) As Boolean

    Dim evalCell As Range

    For Each evalCell In holidayRange.Columns(1).Cells

        If evalCell.Value = dayNum Then

            IsHoliday = True

        End If

    Next evalCell

End Function

Private Function GetActiveTeamMembers(ByVal teamRange As Range) As Variant

    Dim evalCell As Range

    Dim counter As Long
    Dim tempList() As Variant

    For Each evalCell In teamRange.Columns(1).Cells

        If evalCell.Offset(0, 1).Value = "Ativo" Then

            ReDim Preserve tempList(counter)

            tempList(counter) = evalCell.Value

            counter = counter + 1

        End If

    Next evalCell

    GetActiveTeamMembers = tempList

End Function

Private Function GetTeamMemberName(ByVal counter As Long, ByVal teamFilteredList As Variant) As String

    GetTeamMemberName = teamFilteredList(counter - 1)

End Function
选项显式
公共子副本价值日历()
将目标工作表变暗为工作表
将日历范围设置为范围
昏暗的假期范围
变暗组范围作为范围
Dim evalDayCell As范围
Dim teamFilteredList作为变体
昏暗的假期最后一排一样长
最后一行一样长
昏暗的柜台一样长
Set targetSheet=ThisWorkbook.Worksheets(“Planilha1”)
targetSheet.AutoFilterMode=False
设置日历范围=targetSheet.Range(“D4:J13”)
holidayLastRow=targetSheet.Cells(targetSheet.Rows.Count,12).End(xlUp).Row
teamLastRow=targetSheet.Cells(targetSheet.Rows.Count,16).End(xlUp).Row
设置holidaysRange=targetSheet.Range(“L4:N”和HolidaySLastRow)
设置teamRange=targetSheet.Range(“P3:Q”和teamLastRow)
teamFilteredList=GetActiveTeamMembers(teamRange)
对于calendarRange.Cells中的每个evalDayCell
如果是数值型(evalDayCell.Value)和evalDayCell.Value vbNullString,则
如果不是iSoliday(evalDayCell.Value,holidaysRange),则
如果计数器>UBound(teamFilteredList),则
计数器=1
其他的
计数器=计数器+1
如果结束
evalDayCell.Offset(1,0).Value=GetTeamMemberName(计数器,teamFilteredList)
如果结束
如果结束
下一个evalDayCell
端接头
私有函数IsHoliday(长度为ByVal dayNum,范围为ByVal holidayRange)为布尔值
变暗evalCell As范围
对于holidayRange.Columns(1)中的每个evalCell
如果evalCell.Value=dayNum,则
IsHoliday=True
如果结束
下一个评估单元
端函数
私有函数GetActiveTeamMembers(ByVal teamRange作为范围)作为变量
变暗evalCell As范围
昏暗的柜台一样长
Dim templast()作为变体
对于teamRange.Columns(1)单元格中的每个evalCell
如果evalCell.Offset(0,1).Value=“Ativo”,则
雷迪姆保留圣堂武士(计数器)
圣堂武士(计数器)=evalCell.Value
计数器=计数器+1
如果结束
下一个评估单元
GetActiveTeamMembers=templast
端函数
私有函数GetTeamMemberName(ByVal计数器为长,ByVal teamFilteredList为变量)为字符串
GetTeamMemberName=teamFilteredList(计数器-1)
端函数

如果有帮助,请告诉我。

始终使用
Optin Explicit
如果您愿意,您会看到所有
Dim
行显示为红色和错误,因为这不是声明变量的正确方式。对不起,我不明白您所说的。是的,昏暗的是红色的。然而,我不知道我的代码是否有意义,也不知道我应该做些什么来改进它。你必须一次将所有活动名称添加到所有非假日吗?请发布一个例子@alowflyingpig试图建议,在代码表的顶部添加两个单词选项Explicit。然后试着运行你的代码。当它因错误而中断时,请注意错误描述,按Debug按钮并查看突出显示的代码行。您的代码不会走那么远,因为它将无法编译。阅读互联网上的“暗淡声明”。确保您阅读了有关“VBA”的内容,而不是类似名称的相关语言。更正代码中的语法,使其能够编译。然后在尝试运行时处理每个错误。为了帮助您找到正确的方向,您需要声明
行填充
列填充
处于活动状态
提示:这些类型可能是
整数
(我个人仅使用
)。。同时声明
i
,最后,在顶部用
选项Explicit
更新代码后,正确地用红色声明您的4项。嗨@Ricardo Diaz!非常感谢您的支持。我已经在我的电子表格中尝试了您的代码,并对单元格值和名称进行了适当的更改以运行它。但不幸的是什么也没发生。我想这是因为在我的日历中,我使用的是日期格式,而不是数字格式,我会深入研究它并让您随时了解。如果是数字格式(evalDayCell.Value)和evalDayCell.Value vbNullString,您可以在
isdata
行中更改
IsDate
Hi@Ricardo Diaz!一月份一切都好了!但是,当我在电子表格中更改月份时,它就不起作用了。。我在我使用的电子表格中添加了一个dropbox链接,你认为我可以用另一种方式组织日历中的月份,这样代码就能更好地工作吗?嗨,爱德华多。两个t