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