如何在下载的 .csv 文件打开之前暂停 VBA 脚本执行以允许在 2 个工作簿之间复制工作表?

如何解决如何在下载的 .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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?