如何解决如何在下载的 .csv 文件打开之前暂停 VBA 脚本执行以允许在 2 个工作簿之间复制工作表?
我有一个脚本,可以从雅虎财经下载并创建/打开一个新的 Excel .csv 历史股票数据工作簿。然后,我从该 .csv 工作簿中复制 worksheet(1) 的内容,并在 ThisWorkbook(包含我的宏/脚本的那个)中创建一个新工作表(最后)并将数据粘贴到其中。我已将浏览器 (Chrome) 配置为始终打开 .csv 文件下载。下面是一些示例代码:
Sub Macro1()
Dim urlLink As String
Dim csvWorkbook As Workbook
urlLink = "https://query1.finance.yahoo.com/v7/finance/download/AAPL?period1=1592179200&period2=1623715200&interval=1d&events=history&includeAdjustedClose=true"
ActiveWorkbook.FollowHyperlink Address:=urlLink,NewWindow:=True
Set csvWorkbook = ActiveWorkbook
csvWorkbook.Sheets(1).copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
End Sub
urlLink 是一个示例查询,用于从 Yahoo Finance 下载 .csv 格式的历史数据。将默认浏览器设置为始终打开 .csv 类型的文件。执行 ActiveWorkbook.FollowHyperlink 时,将打开另一个 Excel 实例,并打开 AAPL.csv。这个新的 AAPL.csv 将成为活动工作簿,然后下一行代码将在 ThisWorkbook(包含您的脚本的工作簿)中创建一个新工作表,并将 AAPL.csv Sheet(1) 的内容复制到其中。
我的问题是,当我单步执行代码时这工作正常,但在全速运行时失败(即不在调试模式下)。澄清一下,假设您从一个新的空白工作簿开始,如果您单步执行上述代码,您将获得一个名为 AAPL 的新工作表,其中包含 253 行数据(我想要的我们的数据),但如果您将其完整运行速度你会得到一个名为 Sheet1(2) 的新空白表。
我发现这是因为在全速运行时,新的 .csv 文件没有被创建/打开,所以当 Set csvWorkbook = ActiveWorkbook 运行时,仍然只有 1 个工作簿打开 (ThisWorkbook) 所以下一个代码行只需将 ThisWorkbook 的 Sheet(1) 复制到新工作表中,而不是将 Sheet(1) 从 AAPL.csv 复制到其中(因为运行该行代码时它不存在)。
请注意,新创建的工作簿的名称并不总是已知的,因为如果该下载文件夹中已经有一个 APPL.csv,它会将下一个命名为 APPL(1).csv 等等,所以我不能只使用新创建的 .csv 工作簿的名称来引用它,因为我不知道它会是什么。
所以我要求一种在执行 ActiveWorkbook.FollowHyperlink 时或之后在调试模式下模拟单步执行代码的方法。我试过简单地在它之后放置一个 MsgBox ,认为要求用户单击“确定”以继续执行会有所帮助,但事实并非如此,从我读到的内容来看,我认为 Wait 或类似的事情也不会有所帮助?这类似于来自 Pause execution of VBA script until another specific excel workbook opens? 的问题 但我不明白该线程中给出的答案,不确定它是否真的适用?感谢您对此的任何帮助!
解决方法
您可以将网址直接传递给 Workbooks.Open()
:
Dim wb,ws
Set wb = Workbooks.Open("https://query1.finance.yahoo.com/v7/finance/download/AAPL?period1=1592179200&period2=1623715200&interval=1d&events=history&includeAdjustedClose=true")
Set ws = wb.Sheets(1)
'run text to columns if only one column of data
If ws.UsedRange.Columns.Count = 1 Then
ws.Columns(1).TextToColumns Destination:=ws.Range("A1"),DataType:=xlDelimited,_
TextQualifier:=xlDoubleQuote,ConsecutiveDelimiter:=False,Comma:=True
End If
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。