创建宏来从政府网站索引数据

时间:2015-09-03 13:44:07

标签: database vba excel-vba excel

enter image description here

我在这里提供了链接: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

这似乎不起作用。这是一张图片,略微改变了列的宽度,是我想要处理的。

enter image description here

3 个答案:

答案 0 :(得分:5)

在我看来,一个宏过于复杂化了一个简单的问题。

  1. 只需在与您的评分对应的值上添加一个VLOOKUP的新列。要实现此目的,您需要一个可以提供此类值的参考范围。 (见截图1)。

  2. 在新工作表中,列出您的周数,然后使用SUMIF计算每个相应周的vlookup列中的值总数。 (见截图2)。

  3. 如果您需要进行更复杂的计算,请提供其他详细信息,我将修改此答案以提供帮助。

    enter image description here

    enter image description here

答案 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)
相关问题