Vba 如何在工作簿中的某些工作表(而不是所有工作表)上运行宏?
我有一个工作簿,其中包含标准普尔500指数中每个行业组的工作表,并在下面编写了宏,以便在我按下第一个工作表上的命令按钮时更新这些工作表上的所有股票信息。宏可以完美地工作,但当我添加不想用此宏更新的其他图纸时,它将停止工作。我尝试使用下面的“如果不”语句,但似乎不起作用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
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很高兴它工作了-请检查为“已回答”,并删除您的答案,以便问题和解决方案保持清晰:)