第一次发帖,我不是一个VBA专家,但我已经设法在我想要的结果大部分的道路上,因为有这样一个董事会。我希望能自动完成最后一步,并寻求一些帮助。
背景:我每周一早上为我们的项目经理做项目报告。报表模板查询数据库中的几个表,并填充所有适当的字段。然后,它自己创建一个副本,将公式保存为值,并使用从报表中的各个字段捕获数据的命名机制保存报表。所有这些都很好!
问题:在任何时候,我都有80到100个活动项目.现在,我将项目列表复制到“参数”选项卡上的一个表中。然后,使用数据验证,我在"Report“选项卡上创建了一个下拉列表。然后,我在列表中手动1乘1地生成报告。每次在单元格B1中更改项目编号时,数据都会刷新并运行项目的报表。我使用这段代码来完成这个任务:
Private Sub Worksheet_Change(ByVal Target As Range)
'MsgBox Target.Address
If Not Application.Intersect(Range("b1"), Range(Target.Address)) Is Nothing Then
Call AA_RunAll
End If
End Sub我想要做的是创建一个宏,它将遍历列表中的每个项目并运行报告。我假设它是一个循环函数,但我似乎不能让它按我的意愿工作。
另一个需要注意的问题是:每个报表需要3-5分钟才能刷新所有数据,生成报告并保存它。我想在我晚上离开之前把这件事安排在早上完成。
提前谢谢。
Aaron
发布于 2020-09-26 02:57:37
我想这可能就是你要找的。
Dim DataValidationRange As Range
Dim Str As String
Str = Replace(Range("B1").Validation.Formula1, "=", "")
Set DataValidationRange = Range(Str)
Dim i
For Each i In DataValidationRange
Range("B1").Value = i
Call AA_RunAll
Next另外,如果您需要在调用AA_RunAll之前等待更新数据,可以使用以下方法:
Public Function MyTimer(MyDelay As Double)
Dim MyTimerTimer As Double
MyTimerTimer = Timer
MyDelay = MyDelay + Timer
Do While MyTimerTimer <= MyDelay
MyTimerTimer = Timer
DoEvents
Loop
End Function
Private Sub GoThrough_Dropdown()
Dim DataValidationRange As Range
Dim Str As String
Str = Replace(Range("B1").Validation.Formula1, "=", "")
Set DataValidationRange = Range(Str)
Dim i
For Each i In DataValidationRange
Range("B1").Value = i
WaitForDataToUpdate
Call AA_RunAll
Next
End Sub
Private Sub WaitForDataToUpdate()
Dim RangeToWaitFor As Range
Set RangeToWaitFor = Range("H5")
Dim Str As String
Str = RangeToWaitFor.Value
Do While Str = RangeToWaitFor.Value
MyTimer 1
Loop
End Subhttps://stackoverflow.com/questions/64072664
复制相似问题