excel - 遍历 5 个名称并在 MS EXCEL 中的单独工作表中获取结果
问题描述
现在写,我每次都通过单击我的宏创建按钮并在输入框中输入股票代码来更改股票代码。假设我有 10 个股票代码,我想遍历每个股票代码并在单独的表格中生成结果。10 个不同的工作表,用于 10 个不同的符号。我该如何克服这个问题。我正在做的这个过程非常重复,所以有什么想法吗?实际上,我有 1000 个股票代码。
这是我从中获取数据的代码,现在看起来像这样。
Option Explicit
Sub Changestockproperties()
'
' Changestockproperties Macro
'
'
With ActiveWorkbook.Connections("NAME"). _
OLEDBConnection
.BackgroundQuery = True
.CommandText = Array( _
"Select Quotedate, StockSymbol, COnvert(Float,ClosePrice) As ClosePrice, COnvert(Float,TRInverse) AS TRInverse, " & Chr(13) & "" & Chr(10) & "CO" _
, _
"nvert(Float,Osc_1VI) As Osc_1VI, Convert(Float,HeatmapTrans) as HeatmapTrans" & Chr(13) & "" & Chr(10) & "from FormulaHeatmapOscilator where St" _
, "ockSymbol='" & InputBox("Enter Stock Symbol"), "' order by quotedate")
.CommandType = xlCmdSql
.Connection = Array( _
"OLEDB;Provider=NAME;Password=NAME;Persist Security Info=True;Extended Properties=""DRIVER=SQL Server;SERVER=NAME" _
, _
"3;UID=sa;APP=Microsoft Office 2013;WSID=NAME;DATABASE=NAME"";Use Procedure for Prepare=1;Auto Transla" _
, _
"te=True;Packet Size=4096;Workstation ID=NAME;Use Encryption for Data=False;Tag with column collation when possible=Fa" _
, "lse")
.RefreshOnFileOpen = False
.SavePassword = True
.SourceConnectionFile = ""
.SourceDataFile = ""
.ServerCredentialsMethod = xlCredentialsMethodIntegrated
.AlwaysUseConnectionFile = False
End With
With ActiveWorkbook.Connections("NAME")
.Name = "NAME"
.Description = ""
End With
ActiveWorkbook.Connections("NAME").Refresh
End Sub
将我的工作表范围添加到字典中。
Option Explicit
Public Sub ChangeStockSymbol()
Dim d As Scripting.Dictionary
Dim r As Excel.Range
Dim c As Excel.Range
Set d = New Scripting.Dictionary
Set r = Range("A1:B1311")
For Each c In r.Cells
d.Add CStr(c.Address), c.Value
Next c
End Sub
解决方案
您可以检查您的StockSymbol
范围并创建一个包含所有 StockSymbol 值的字典。
一个Dictionary
对象存储一个键,它允许您检查大量数据,并且只有在不返回重复项时才捕获每个值。
然后,您可以循环使用字典中的每个键来更新您的 StockSymbol。
Public Sub ChangeStockSymbol()
Dim MyDictionary As Variant
Dim TargetCell As Range
Dim TargetRange As Range
Dim DictionaryItem As Variant
Set MyDictionary = CreateObject("Scripting.Dictionary")
Set TargetRange = Sheet1.Range("A1:A10") 'Change this to target your correct range for the stocksymbols.
For Each TargetCell In TargetRange
If Not MyDictionary.exists(TargetCell.Value) Then
MyDictionary.Add TargetCell.Value, TargetCell.Value
End If
Next TargetCell
For Each DictionaryItem In MyDictionary
Debug.Print MyDictionary(DictionaryItem) 'Enter your code here to perform your update.
Next DictionaryItem
End Sub
为了使其更具动态性,您可以查看如何查找最后使用的行并将其与您的TargetRange
.
要Worksheet
为每次迭代使用新的,您需要使用Sheets.Add方法创建一个新工作表,然后将该工作表定位为您的输出而不是ActiveSheet
.
例如
Sub Foo()
ActiveWorkbook.Sheets.Add
End Sub
笔记:
如果 Before 和 After 都被省略,则新工作表将插入到活动工作表之前。
推荐阅读
- c++ - 关于 C++ 的 cin 和 >> 的问题
- python - Altair 中带有标签值的分层或 Facet 条形图
- python - 目标 WSGI 脚本无法作为 Python 模块 Flask 加载
- java - java FXML窗口在启动时没有响应
- javascript - fs.write 在两个 txt 文件中使用 nodejs
- sapui5 - 如何使用 SAPUI5 SDK?
- multithreading - 多线程套接字打开的文件太多
- javascript - v-如果不在模板上工作
- amazon-web-services - AWS Codebuild 未更新 S3 中的工件
- sql - 如何使用 CTE 按两个表分组