我在这里提供了链接:http://quickstats.nass.usda.gov/results/320F1D82-1064-30F1-809E-F77E509EC508。我想学习如何使用Excel VBA中的宏/脚本执行此任务。我自己无法克服的问题是:
1)数据中没有表示一年中的所有星期。我不确定如何按特定周对数据进行排序,不确定我需要什么命令。
2)在我的vba脚本中可以使用Excel函数VLOOKUP,以便在执行每周计算之前选择所有不同的值,比如Week14或Week15吗?如果是这样,它是如何合并的?我的想法是在宏中执行VLOOKUP以搜索五种不同的作物条件。
关于此主题的第一个问题是关于如何从网站上下载信息,请参阅Building a Macro to Download Data off a Website into Excel。我建议这是第一个按钮,"下载",然后应该有第二个按钮来对数据进行排序,称为"排序"。
CommandButton_1用于下载数据,请参阅链接问题。
Private Sub CommandButton1_Click()
Dim thisWb, downloadWb As Workbook
Set thisWb = ActiveWorkbook
Set downloadWb = Workbooks.Open("http://quickstats.nass.usda.gov/data/spreadsheet/4C43034A-0EAA-3171-B4FC-84CC95FC6E0C.csv")
downloadWb.Worksheets(1).Range("A1:U2613").Copy Destination:=thisWb.Worksheets(3).Range("A8")
downloadWb.Close
End Sub
这非常有效。现在第二个按钮(排序数据)建议在下面
Private Sub CommandButton2_Click()
Public Function WeekTotal(Condition As String, Table As Range) As Integer
Dim rRow As Range
Dim xVal As Integer
xVal = 0
For Each rRow In Table.Rows
If InStr(LCase(rRow.Cells(1, 10).Value), "very") > 0 And LCase(Condition) = "poor" Then
'skip if row includes 'very', but the condition is 'poor' and not 'very poor'
ElseIf InStr(LCase(rRow.Cells(1, 10).Value), LCase(Condition)) > 0 Then
xVal = xVal + rRow.Cells(1, 13).Value
End If
Next rRow
WeekTotal = xVal
End Function
End Sub
这似乎不起作用。这是一张图片,略微改变了列的宽度,是我想要处理的。
答案 0 :(得分:5)
在我看来,一个宏过于复杂化了一个简单的问题。
答案 1 :(得分:3)
I45
=“优秀”J2:J36
是数据项列M2:M36
是值列 =SUM(IF(ISERROR(SEARCH(I45,$J$2:$J$36)),0,$M$2:$M$36))
返回:14
这是一个数组公式,因此您必须按Ctrl + Shift + Enter,而不仅是Enter。 (你会知道你做得对,因为它在公式栏中看起来像这样:{=SUM(IF(ISERROR(SEARCH(I45,$J$2:$J$36)),0,$M$2:$M$36))}
当您按Ctrl + Shift + Enter时,它会自动添加{
和}
- 您不会输入它们。
这个公式的作用:
Search("Excellent", $J$2)
会在J2
中查找字符串“Excellent”并返回找到字符串的位置,如果找不到字符串则返回错误。我们不关心实际价值 - 我们只是想知道它是否会抛出错误。我们使用$J$2:$J$36
将其转换为数组。你看不到它,但它实际上做的是返回一个可能如下所示的值数组:
{44;#VALUE!;#VALUE!;#VALUE!;#VALUE!;44;#VALUE!;#VALUE!;#VALUE!;#VALUE!;44;#VALUE!;#VALUE!;#VALUE!;#VALUE!;44;#VALUE!;#VALUE!;#VALUE!;#VALUE!;44;#VALUE!;#VALUE!;#VALUE!;#VALUE!;44;#VALUE!;#VALUE!;#VALUE!;#VALUE!;44;#VALUE!;#VALUE!;#VALUE!;#VALUE!}
通过使用ISERROR(SEARCH("Excellent", $J$2:$J$36))
,我们将内部数组更改为:
{FALSE;TRUE;TRUE;TRUE;TRUE;FALSE;TRUE;TRUE;TRUE;TRUE;FALSE;TRUE;TRUE;TRUE;TRUE;FALSE;TRUE;TRUE;TRUE;TRUE;FALSE;TRUE;TRUE;TRUE;TRUE;FALSE;TRUE;TRUE;TRUE;TRUE;FALSE;TRUE;TRUE;TRUE;TRUE}
如果找不到“优秀”,ISERROR
将为TRUE
,因此我们希望找到此数组中所有FALSE
值的值。我们使用IF
执行此操作。如果SEARCH
是错误,0,否则给我们另一个数组 - $M$2:$M$36
(值列)。
=IF(ISERROR(SEARCH("Excellent", $J$2:$J$36)), 0,$M$2:$M$36)
这给了我们以下内容:
{2;0;0;0;0;2;0;0;0;0;2;0;0;0;0;2;0;0;0;0;2;0;0;0;0;2;0;0;0;0;2;0;0;0;0}
由于您的样本数据每周优秀2次。
最后,我们在其周围添加SUM()
来总结这些值。
=SUM(IF(ISERROR(SEARCH("Excellent", $J$2:$J$36)), 0,$M$2:$M$36))
同样,由于这是一个数组公式,如果您只使用此公式按Enter键,它将返回0
,但是如果您按Ctrl + Shift + Enter键,它将为您提供{{1的正确结果}}。
答案 2 :(得分:2)
如果你想使用VBA,只需要练习,就可以使用自定义公式。
要使用此功能,您可以在单元格中键入以下内容:
import requests
from sqlalchemy import create_engine
engine = create_engine("mssql://me:pass@server/db")
md = sqlalchemy.MetaData(engine)
table = sqlalchemy.Table('stations', md, autoload=True)
station = engine.execute("select * from stations")
for row in station:
upd = table.filter_by(id=5).update(values={'STATION_LOGO_URL': 'http://test.com/img.png'})
engine.execute(upd)
VBA代码:
=WeekTotal("Excellent",$A$2:$M$36)