如何在VBA中不访问工作表转换为Stocks数据类型?
不依赖可见工作表转换股票数据类型的VBA方案
你当前的VBA函数通过操作Sheet1的单元格来转换Stocks链接数据类型并获取报价,但如果不想直接操作可见工作表,目前没有官方方法能完全脱离工作表完成Stocks数据类型的转换——因为ConvertToLinkedDataType方法只能作用于工作表的Range对象,无法在内存中直接处理。
不过可以通过以下变通方案,避免干扰用户可见的工作表:
方案1:使用隐藏的辅助工作表
创建一个专门的隐藏工作表来处理数据转换,全程不会影响用户操作界面:
Public Function StockQuote(ByRef ticker As String) As Double Const exchange As String = "XNAS:" Dim helperWs As Worksheet ' 检查是否已存在辅助工作表,不存在则新建并隐藏 On Error Resume Next Set helperWs = ThisWorkbook.Worksheets("StockHelper") On Error GoTo 0 If helperWs Is Nothing Then Set helperWs = ThisWorkbook.Worksheets.Add helperWs.Name = "StockHelper" helperWs.Visible = xlSheetHidden ' 设置为隐藏状态 End If ' 转换数据类型并获取报价 With helperWs.Range("A1") .ClearContents .Value = exchange & ticker .ConvertToLinkedDataType serviceid:=268435456, LanguageCulture:="en-US" End With StockQuote = helperWs.Evaluate("=A1.Price") End Function
方案2:使用临时工作表(用完即删)
每次调用函数时创建临时工作表,完成操作后立即删除,不会留下多余工作表:
Public Function StockQuote(ByRef ticker As String) As Double Const exchange As String = "XNAS:" Dim tempWs As Worksheet ' 创建深度隐藏的临时工作表 Set tempWs = ThisWorkbook.Worksheets.Add tempWs.Visible = xlSheetVeryHidden ' 转换数据类型并获取报价 With tempWs.Range("A1") .ClearContents .Value = exchange & ticker .ConvertToLinkedDataType serviceid:=268435456, LanguageCulture:="en-US" End With StockQuote = tempWs.Evaluate("=A1.Price") ' 删除临时工作表,关闭删除提示 Application.DisplayAlerts = False tempWs.Delete Application.DisplayAlerts = True End Function
注意:方案2频繁创建/删除工作表可能会有轻微性能损耗,适合调用频率不高的场景;方案1的辅助工作表会长期存在,但仅占用极小资源,适合高频调用。
内容的提问来源于stack exchange,提问作者rupsdbb
相关产品推荐
相关产品推荐

