在多个Excel工作表上运行宏

时间:2015-08-17 16:19:05

标签: excel vba excel-vba

我正在寻求帮助在多个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

3 个答案:

答案 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"))