我正在寻求帮助在多个excel工作表上运行一个宏(之前有几个相关的问题,但我没有想到/知道它们是否适用于我的问题)。每张纸都有不同的自动收报机。我试图在每个excel工作表上提取不同股票的历史股票价格。正如您将从VBA代码中注意到的,每个工作表的代码都位于K1中。
现在,我可以使用下面的代码在多个工作表上运行相同的宏。但是,宏使用相同的自动收报机运行所有工作表。例如,第一个工作表中的自动收报机是" WMT"并且宏使用" WMT"在所有工作表上提取历史股票价格。而不是每个工作表的唯一自动收报机。有谁知道如何在每个工作表上运行宏,以便宏使用位于每个工作表上的唯一自动收报机?
Sub Data_Get()
'
' Data_Get Macro
'
Dim ticker As String, sday, smonth, syear, eday, emonth, eyear As Long, ws As Worksheet
ticker = Range("k1")
sday = Day(Range("k2"))
smonth = Month(Range("k2")) - 1
syear = Year(Range("k2"))
eday = Day(Range("k3"))
emonth = Month(Range("k3")) - 1
eyear = Year(Range("k3"))
'
For Each ws In Sheets
ws.Activate
Columns("A:G").ClearContents
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;http://real-chart.finance.yahoo.com/table.csv?s=" & ticker & "&d=" & emonth & "&e=" & eday & "&f=" & eyear & " &g=w&a=" & smonth & "&b=" & sday & "&c=" & syear & "&ignore=.csv" _
, Destination:=Range("$A$1"))
.Name = "Datatable"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 437
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = True
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(5, 1, 1, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
Next ws
End Sub
答案 0 :(得分:1)
以下是如何循环工作簿中的所有工作表并调用子文档。
Dim iIndex as integer
Dim ws As Excel.Worksheet
For iIndex = 1 To ActiveWorkbook.Worksheets.count
Set ws = Worksheets(iIndex)
ws.Activate
Data_Get
Next iIndex
答案 1 :(得分:0)
您有作业
ticker = Range("k1")
进入主循环。如果K1
在每个工作表上有不同的值,并且您希望代码引用该代码 - 您需要将该行移动到主循环内(例如在ws.Activate
之后)。类似的评论适用于引用特定单元格的其他分配。如果在循环之前运行赋值,则循环不会更改其值。
答案 2 :(得分:0)
通常,您需要在所有工作表上运行宏,但只需一个。例如,您将所有工作表中的数据收集到工作表中"报告":
Dim Sh As Excel.Worksheet
For Each Sh in ActiveWorkbook.Worksheets
If Sh.Name <> "Report" Then Data_Get Sh
Next Sh
这将需要更改原始宏并使其独立于活动工作表:
Sub Data_Get(Sh As Worksheet)
[...]
ticker = Sh.Range("k1")
sday = Day(Sh.Range("k2"))