Vba 如何在工作簿中的某些工作表(而不是所有工作表)上运行宏?

Vba 如何在工作簿中的某些工作表(而不是所有工作表)上运行宏?,vba,excel,Vba,Excel,我有一个工作簿,其中包含标准普尔500指数中每个行业组的工作表,并在下面编写了宏,以便在我按下第一个工作表上的命令按钮时更新这些工作表上的所有股票信息。宏可以完美地工作,但当我添加不想用此宏更新的其他图纸时,它将停止工作。我尝试使用下面的“如果不”语句,但似乎不起作用 Sub Get_Stock_Quotes_from_Yahoo_Finance_API() 'Run the API for every sheet in the workbook Dim Sht As Worksheet Fo

我有一个工作簿,其中包含标准普尔500指数中每个行业组的工作表,并在下面编写了宏,以便在我按下第一个工作表上的命令按钮时更新这些工作表上的所有股票信息。宏可以完美地工作,但当我添加不想用此宏更新的其他图纸时,它将停止工作。我尝试使用下面的“如果不”语句,但似乎不起作用

Sub Get_Stock_Quotes_from_Yahoo_Finance_API()

'Run the API for every sheet in the workbook
Dim Sht As Worksheet
For Each Sht In ThisWorkbook.Worksheets

    'Look to see what the sheet is named and run the macro if it is not what is below
    If Not Sht.Name = "Cover" _
    And Not Sht.Name = "Select Industry" Then

    Sht.Activate

        ' Dim varibales and set range
        Dim head As Range
        Set head = Worksheet.Range("A2")

        'dim variables
        Dim I As Integer
        Dim Symbols As String: Symbols = ""
        Dim SpecialTags As String: SpecialTags = ""
        Dim Yahoo_Finance_URL As String: Yahoo_Finance_URL = "http://finance.yahoo.com/d/quotes.csv?s="
        Dim rng As Range
        Dim cell As Range

        ' Get the Stock Symbols
        Set rng = Range(head.Offset(1, 0), head.Offset(1, 0).End(xlDown))
        For Each cell In rng ' Starting from a cell below the head cell till the last filled cell
            Symbols = Symbols & cell.Value & "+"
        Next cell
        Symbols = Left(Symbols, Len(Symbols) - 1) ' Remove the last '+'

        ' Get the Special Tags
        Set rng = Range(head.Offset(0, 1), head.Offset(0, 1).End(xlToRight))
        For Each cell In rng ' Starting from a cell to the right of the head cell till the last filled cell
            SpecialTags = SpecialTags & cell.Value
        Next

        ' Put the desciption/name of each tag in the cell above it
        Dim SpecialTagsArr() As String: Dim TagNamesArr() As String
        Call Get_Special_Tags(SpecialTagsArr, TagNamesArr)
        For Each cell In rng
            cell.Offset(-1, 0).Value = FindTagName(cell.Value, SpecialTagsArr, TagNamesArr)
        Next


        Yahoo_Finance_URL = Yahoo_Finance_URL & Symbols & "&f=" & SpecialTags

        Call Print_CSV(Yahoo_Finance_URL, head)

Next Sht
'At the end of the program say it has all been updated
MsgBox ("All Data Updated")
End Sub
改变

如果短名称为“封面”,短名称为“选择行业”,则
不要忘了在下一个Sht

更改之前,如果结束

 If Not Sht.Name = "Cover" _
    And Not Sht.Name = "Select Industry" Then

如果短名称为“封面”,短名称为“选择行业”,则

在参考Kevin的第二个代码之前,不要忘记您的
结束If
,现在排除逻辑有缺陷。我建议如下:

Function IsIn(element, arr) As Boolean
    IsIn = False
    For Each x In arr
        If element = x Then
            IsIn = True
            Exit Function
        End If
    Next x
End Function


Sub Get_Stock_Quotes_from_Yahoo_Finance_API()
    Dim skippedSheets()
    skippedSheets = Array("Cover,Select Industry,bla bla")

    For Each Sh In ActiveWorkbook.Worksheets
        If Not IsIn(Sh.Name, skippedSheets) Then
            ' ... process Sh

        End If
    Next Sh
End Sub
现在,所有要排除在一个位置(数组分配)的工作表名称都已存在,并且只有当当前工作表名称不是该数组的元素时,才会执行内部代码块

第二个错误来源:您已经开始限定范围(如在
Set head=Sht.Range(“A2”)
)。使用
Set rng=Sht.Range(head.Offset(1,0)、head.Offset(1,0)、End(xlDown))


Set rng=Sht.Range(head.Offset(0,1)、head.Offset(0,1)、End(xlToRight))

最后,您不必激活工作表。您可以使用
Sht
对象和限定范围。

Dim I as Integer
未使用。

参考Kevin的第二个代码-现在排除逻辑有缺陷。我建议如下:

Function IsIn(element, arr) As Boolean
    IsIn = False
    For Each x In arr
        If element = x Then
            IsIn = True
            Exit Function
        End If
    Next x
End Function


Sub Get_Stock_Quotes_from_Yahoo_Finance_API()
    Dim skippedSheets()
    skippedSheets = Array("Cover,Select Industry,bla bla")

    For Each Sh In ActiveWorkbook.Worksheets
        If Not IsIn(Sh.Name, skippedSheets) Then
            ' ... process Sh

        End If
    Next Sh
End Sub
现在,所有要排除在一个位置(数组分配)的工作表名称都已存在,并且只有当当前工作表名称不是该数组的元素时,才会执行内部代码块

第二个错误来源:您已经开始限定范围(如在
Set head=Sht.Range(“A2”)
)。使用
Set rng=Sht.Range(head.Offset(1,0)、head.Offset(1,0)、End(xlDown))


Set rng=Sht.Range(head.Offset(0,1)、head.Offset(0,1)、End(xlToRight))

最后,您不必激活工作表。您可以使用
Sht
对象和限定范围。

Dim I as Integer
未使用。

感谢您的帮助,我将其更改为该值,但它仍然不起作用。我想如果我的端点在哪里,可能会有问题。这就是代码现在的样子,我在下一个sht之前的代码末尾加上if。@KevinZell-当你说它仍然不工作时,什么是不工作的?另外,请确保您看到我为
编辑的
。“和”修复了它,现在它工作了。谢谢您的帮助。很高兴它工作了@KevinZell-请检查为“已回答”同时删除你的答案,使问题和解决方案保持清晰:)谢谢你的帮助,我把它改成了这样,但它仍然不起作用。我想我的目的地可能有问题。这就是代码现在的样子,我在下一个sht之前的代码末尾加上if。@KevinZell-当你说它仍然不工作时,什么是不工作的?另外,请确保您看到我编辑的
。“And”修复了它,现在它工作了。感谢您的帮助@KevinZell很高兴它工作了-请检查为“已回答”,并删除您的答案,以便问题和解决方案保持清晰:)