- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近写了一些 VBA 代码,但尽管有一些编码背景,但我认为我在其中的经验仍然是新的/新鲜的。在问我自己的问题之前,我已经广泛搜索以查看类似的主题并在那里实现解决方案,但是经过 2 天的搜索/工作后,要么我不擅长搜索,要么就是找不到与我自己的问题类似的解决方案来实现.
我使用的是 Excel 2019。
我有一种RAW DATA,我WEEKLY/MONTHLY 得到,这个RAW DATA 包含从几千到几万的任何地方行,我的 VBA 代码通过仅获取需要的内容来对这些 RAW DATA 进行排序。现在我还想自动化的是从 2 个日期中排除非工作时间。在追求这一点时,我想到了一个复杂的公式,当应用于带有变量的单元格时,它本身就可以工作,但我也想将它包含在我的 VBA 代码中。
我尝试了宏记录器(就像我对很多事情所做的那样,以获得关于如何实现这些东西的提示),但我有点卡在这个上面,因此需要你的专业知识和知识
有问题的公式是:
=(NETWORKDAYS.INTL([@[DC_CREATION_DATE]],[@[ACTUAL_END_DATE]],""0000000"")-1)*(upper-lower)+IF(NETWORKDAYS.INTL([@[ACTUAL_END_DATE]],[@[ACTUAL_END_DATE]],""0000000""),MEDIAN(MOD([@[ACTUAL_END_DATE]],1),upper,lower),upper)-MEDIAN(NETWORKDAYS.INTL([@[DC_CREATION_DATE]],[@[DC_CREATION_DATE]],""0000000"")*MOD([@[DC_CREATION_DATE]],1),upper,lower)"
我的目标是完全没有周末(因此使用 NetworkDays.Intl 使用“0000000”自定义设置所有工作日),并且只设置工作时间(从 0800 到 2300)(8:00AM 到 11 :00PM),并且晚上 11:01 到早上 7:59 之间的任何时间都将从总数中排除。
这是我实现上述公式的方法的 VBA 代码:
Sub RAWDATA_SORT()
Dim Main As Worksheet, Processed As Worksheet
Dim LastRow As Long, col As Long, k As Integer
Dim colName As String, maincolName As String
Dim i As Range
Dim Headers As Range, SearchHeaders As Range
Dim upper As Date, lower As Date, StartDate As Date, EndDate As Date
On Error Resume Next
Set Main = ActiveSheet
Main.Name = "RAW DATA"
Sheets.Add(After:=Sheets("RAW DATA")).Name = "Processed Data"
Set Processed = Sheets("Processed Data")
Main.Activate
Main.ShowAllData
Set Headers = Main.Range("1:1")
LastRow = 0
lower = Format(TimeValue("08:00 AM"), "hh:mm AMPM")
upper = Format(TimeValue("11:00 PM"), "hh:mm AMPM")
Debug.Print (lower)
Debug.Print (upper)
' More Code Here
With Processed
Processed.Activate
Processed.AutoFilterMode = False
Processed.ShowAllData
' More Code Here
LastRow = Main.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count
k = 2
For Each i In Range("N2:N" & LastRow)
StartDate = Range("N" & k).Value
EndDate = Range("R" & k).Value
Debug.Print (StartDate)
Debug.Print (EndDate)
Range("U" & k).Value = DateDiff("s", Range("N" & k).Value, Range("R" & k).Value)
Range("V" & k).Value = "=(NETWORKDAYS.INTL([" & StartDate & "],[" & EndDate & "],""0000000"")-1)*([" & upper & "]- [" & lower & "])" _
& "+IF(NETWORKDAYS.INTL([" & EndDate & "],[" & EndDate & "],""0000000""),MEDIAN(MOD([" & EndDate & "],1),[" & upper & "],[" & lower & "]),[" & upper & "])" _
& "-MEDIAN(NETWORKDAYS.INTL([" & StartDate & "],[" & StartDate & "],""0000000"")*MOD([" & StartDate & "],1),[" & upper & "],[" & lower & "])"
k = k + 1
Next i
Range("U:U").NumberFormat = "General"
End With
' Proceeding to End
这是宏记录器给出的:
ActiveCell.FormulaR1C1 = _
"=(NETWORKDAYS.INTL([@[DC_CREATION_DATE]],[@[ACTUAL_END_DATE]],""0000000"")-1)*(upper-lower)" & Chr(10) & "+IF(NETWORKDAYS.INTL([@[ACTUAL_END_DATE]],[@[ACTUAL_END_DATE]],""0000000""),MEDIAN(MOD([@[ACTUAL_END_DATE]],1),upper,lower),upper)" & Chr(10) & "-MEDIAN(NETWORKDAYS.INTL([@[DC_CREATION_DATE]],[@[DC_CREATION_DATE]],""0000000"")*MOD([@[DC_CREATION_DATE]],1),upper,lower)"
我尝试过的:
结果是……什么都没有,当代码运行时,它没有给出任何错误,但是“V”列完全是空的,没有任何值/结果。
我确信我遗漏了一些东西,例如使用带有变量的公式或将公式本身设置为单元格/范围的正确语法,但我已经绞尽脑汁寻求帮助并学习过程。
或者,如果有人有更好的解决方案来排除工作时间而不使用 NetworkDays.Intl(因为没有周末),我也会很感激。
如果这样的问题已经得到解答,我深表歉意,非常感谢您完整阅读我的帖子。
编辑:按照 Tim Williams 的建议注释掉“On Error Resume Next”后,我遇到了运行时错误:1004,应用程序定义或对象定义的错误,在我所在的行放置公式。
最佳答案
由于发布的公式准确地返回了 DC_CREATION_DATE
之间的工作时间和 ACTUAL_END_DATE
,问题似乎是关于如何使用 VBA 输入 Excel 公式。
Op 的公式:
= ( NETWORKDAYS.INTL( [@[DC_CREATION_DATE]], [@[ACTUAL_END_DATE]], "0000000" ) -1 ) * ( Upper - Lower )
+ IF( NETWORKDAYS.INTL( [@[ACTUAL_END_DATE]], [@[ACTUAL_END_DATE]], "0000000" ),
MEDIAN( MOD( [@[ACTUAL_END_DATE]], 1 ), Upper, Lower ), Upper )
- MEDIAN( NETWORKDAYS.INTL( [@[DC_CREATION_DATE]], [@[DC_CREATION_DATE]], "0000000" )
* MOD( [@[DC_CREATION_DATE]], 1 ), Upper, Lower )
上面的公式似乎是从 Excel 表(即 ListObject
)中获得的,如以下参数所示:[@[DC_CREATION_DATE]]
和 [@[ACTUAL_END_DATE]]
, 而 Upper
和 Lower
似乎对应于Defined Names
使用标准单元格作为参数的相同公式如下所示:
= ( NETWORKDAYS.INTL( B7, C7, "0000000" ) -1 ) * ( Upper - Lower )
+ IF( NETWORKDAYS.INTL( C7, C7, "0000000" ),
MEDIAN( MOD( C7, 1 ), Upper, Lower ), Upper )
- MEDIAN( NETWORKDAYS.INTL( B7, B7, "0000000" )
* MOD( B7, 1 ), Upper, Lower )
注意参数:[@[DC_CREATION_DATE]]
和 [@[ACTUAL_END_DATE]]
替换为单元格 B7
和 C7
分别
这就是 Op 代码的问题:
它不会替换整个参数
@[DC_CREATION_DATE]
而不是 [@[DC_CREATION_DATE]]
@[ACTUAL_END_DATE]
而不是 [@[ACTUAL_END_DATE]]
此外,它还用 [
包裹了 Upper 和 Lower和 ]
用 VBA 处理 Excel 公式:
我建议添加对 DC_CREATION_DATE
的验证和 ACTUAL_END_DATE
在公式的开头如下:
= IF( [@[ACTUAL_END_DATE]] < [@[DC_CREATION_DATE]], 0,
( NETWORKDAYS.INTL( [@[DC_CREATION_DATE]], [@[ACTUAL_END_DATE]], "0000000" ) -1 ) * ( Upper - Lower )
+ IF( NETWORKDAYS.INTL( [@[ACTUAL_END_DATE]], [@[ACTUAL_END_DATE]], "0000000" ),
MEDIAN( MOD( [@[ACTUAL_END_DATE]], 1 ), Upper, Lower ), Upper )
- MEDIAN( NETWORKDAYS.INTL( [@[DC_CREATION_DATE]], [@[DC_CREATION_DATE]], "0000000" )
* MOD( [@[DC_CREATION_DATE]], 1 ), Upper, Lower ) )
我建议使用以下方法使用 VBA 处理 excel 公式:
R1C1
替换的关键字运行程序时实际值的引用:…
= IF( #END < #INI, 0," & vbLf & _
( NETWORKDAYS.INTL( #INI, #END, "0000000" ) -1 ) * ( #UPR - #LWR )" & vbLf & _
+ IF( NETWORKDAYS.INTL( #END, #END, "0000000" )," & vbLf & _
MEDIAN( MOD( #END, 1 ), #UPR, #LWR ), #UPR )" & vbLf & _
- MEDIAN( NETWORKDAYS.INTL( #INI, #INI, "0000000" )" & vbLf & _
* MOD( #INI, 1 ), #UPR, #LWR ) )"
地点:
#INI
= [@[DC_CREATION_DATE]]
#END
= [@[ACTUAL_END_DATE]]
#LWR
= Lower
#UPR
= Upper
By using the R1C1 reference of the cells we can update the formulas for the entire range at once instead of looping over each cell.
…
Const kFmlHours As String = "= IF( #END < #INI, 0," & vbLf & _
" ( NETWORKDAYS.INTL( #INI, #END, ""0000000"" ) -1 ) * ( #UPR - #LWR )" & vbLf & _
" + IF( NETWORKDAYS.INTL( #END, #END, ""0000000"" )," & vbLf & _
" MEDIAN( MOD( #END, 1 ), #UPR, #LWR ), #UPR )" & vbLf & _
" - MEDIAN( NETWORKDAYS.INTL( #INI, #INI, ""0000000"" )" & vbLf & _
" * MOD( #INI, 1 ), #UPR, #LWR ) )"
…
Dim sFmlHours As String
Dim TimeLwr As Double, TimeUpr As Double
Dim sDateIni As String, sDateEnd As String
…
With .Range("V2")
sDateIni = Range("N2").Address(0, 1, xlR1C1, False, .Cells)
sDateEnd = Range("R2").Address(0, 1, xlR1C1, False, .Cells)
sFmlHours = kFmlHours
sFmlHours = Replace(sFmlHours, "#INI", sDateIni)
sFmlHours = Replace(sFmlHours, "#END", sDateEnd)
sFmlHours = Replace(sFmlHours, "#LWR", TimeLwr)
sFmlHours = Replace(sFmlHours, "#UPR", TimeUpr)
End With
…
With .Range("V2:V" & lRow)
.FormulaR1C1 = sFmlHours 'Enter formula
.Value = .Value 'Replace Formula with Value
End With
程序:
此程序仅包括工作时间的计算:
Sub Formula_Working_Hours()
Const kFmlHours As String = "= IF( #END < #INI, 0," & vbLf & _
" ( NETWORKDAYS.INTL( #INI, #END, ""0000000"" ) -1 ) * ( #UPR - #LWR )" & vbLf & _
" + IF( NETWORKDAYS.INTL( #END, #END, ""0000000"" )," & vbLf & _
" MEDIAN( MOD( #END, 1 ), #UPR, #LWR ), #UPR )" & vbLf & _
" - MEDIAN( NETWORKDAYS.INTL( #INI, #INI, ""0000000"" )" & vbLf & _
" * MOD( #INI, 1 ), #UPR, #LWR ) )"
Dim wsMain As Worksheet, wsPrcs As Worksheet
Dim sFmlHours As String
Dim TimeLwr As Double, TimeUpr As Double
Dim sDateIni As String, sDateEnd As String
Dim lRow As Long
Rem Set Lower & Upper Time
TimeLwr = TimeSerial(8, 0, 0)
TimeUpr = TimeSerial(23, 0, 0)
With ThisWorkbook
Set wsMain = .Sheets("RAW DATA")
Set wsPrcs = .Sheets("Processed Data")
End With
lRow = wsMain.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count
With wsPrcs
.Activate
If Not (.AutoFilter Is Nothing) Then .AutoFilter.Range.AutoFilter
Rem Set Formula
With .Range("V2")
sDateIni = Range("N2").Address(0, 1, xlR1C1, False, .Cells)
sDateEnd = Range("R2").Address(0, 1, xlR1C1, False, .Cells)
sFmlHours = kFmlHours
sFmlHours = Replace(sFmlHours, "#INI", sDateIni)
sFmlHours = Replace(sFmlHours, "#END", sDateEnd)
sFmlHours = Replace(sFmlHours, "#LWR", TimeLwr)
sFmlHours = Replace(sFmlHours, "#UPR", TimeUpr)
End With
Rem Enter Formula
With .Range("V2:V" & lRow)
.FormulaR1C1 = sFmlHours 'Enter formula
.Value = .Value 'Replace Formula with Value
End With
End With
End Sub
关于excel - 使用 NetworkDays.Intl 作为 Excel VBA 中的复杂公式排除非工作时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66452370/
我有一个名为“members”的数据库表。分配给成员的是一个职位。 职位 来自部门。我有 Departments,然后是那些中的 Sub-Departments 和 Sub-Departments 中
我正在尝试为 Solr 搜索应用过滤器标记 Tagging_and_excluding_Filters . 挑战在于同时应用多个标记(对于单个页面上的多个选择选项)。例如 q=mainquery&fq
我知道这个问题已经被问过很多次了,我已经尝试了所有建议,并阅读了有关不同选择器等的所有内容,但没有任何对我有用 给出以下 HTML 片段: link
是否有直接的 LINQ 语法来查找集合 B 中不存在的集合 A 的成员?在 SQL 我会写这个 SELECT A.* FROM A LEFT JOIN B ON A.ID = B.ID WHERE B
我试图排除并在现有xpath中包括以下xpath,但不太确定如何做到这一点 //exclude -> //*[@id="ires"]/ol/li[6]/div/a[1]/img //include
我有 30 个站点,我需要在其中 24 个站点上回显某些内容。我怎样才能排除其他人?该代码不起作用,因为我认为它的逻辑是假的:) $currentsite = get_bloginfo('wpurl'
我需要对目标文件夹进行检查,并检查文件是否来自今天,并且超过5kb 下面的命令根据使用今天的日期存在的文件来提供bool值,但是我还要添加-gt5kb之类的排除项 我尝试使用-Exlcude,但不确定
我编入索引的Elasticsearch文档包含许多字段。我一直在使用match_all查询来获取结果。我想从match_all中排除一些字段,这可能吗? 最佳答案 在Elasticsearch中,您可
我正在为我的 DAO 编写一些测试,因为很多测试使用保存到我的数据库中的测试对象,所以我使用注释 @Before 和 @Before 创建了 setup() 和teardown() 方法@After
我编写了一个程序来解决以下问题: Implement a diffusion limited aggregation simulation on a toroid plane where seeds
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
很多时候我必须运行这个查询: select * from users where name is not null and name != '' 有没有更好的方法来做到这一点。我需要更多的性能,任何建
如果检测到某个操作系统,是否有一种简单的方法可以排除某些代码? 我设计了一个运行良好的网站(它是一个 sidescroller),当使用滚轮(向上/向下)时,它会左右滚动。但是,如果您使用的是 Mac
我应该如何排除“IN”子句中的值? $Graduates = "45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,6
很明显,如果一个 Mysql 表的全文索引包含一个出现在 50% 的数据行中的关键字,该关键字将被匹配查询忽略 因此,如果我有一个包含 50 个条目的全文索引“content”的表其中 27 个条目在
我有下面的循环。 我需要提取所有不包含字母 p 的名称 (lskey),但我的尝试不起作用。 for(var i = 0; i "); } } 如果有人能回答,我将不胜感激。 最佳答案 如此接
我正在尝试查找 FTP 服务器上根目录的总大小。但是,我无权访问根目录中的其中一个目录。 我想用这个函数对根目录的大小求和: size = 0 for filename in ftp.nlst("."
我有以下正则表达式来匹配 html 链接: 有点效果。除了不是真的。因为它在 编辑: 这将使它只抓取引号而不是 之后的所有内容 最佳答案 我认为您的正则表达式没有按照您的意愿行事。 这会非贪婪地捕
我在提出异常方面遇到困难,例如: import csv o = open('/home/foo/dummy.csv', 'r') # Empty file! reader = csv.reader(o
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我是一名优秀的程序员,十分优秀!