Database 创建宏以索引政府网站中的数据

Database 创建宏以索引政府网站中的数据,database,vba,excel,Database,Vba,Excel,我在这里提供链接:。我想学习如何使用Excel VBA中的宏/脚本执行此任务。我自己无法克服的问题有: 1数据中并非表示一年中的所有周。我不确定如何按特定的星期对数据进行排序,也不确定我需要什么命令 2在每周执行计算之前,是否可以在我的vba脚本中使用Excel函数VLOOKUP来选择所有不同的值,例如14周或15周?如果是,它是如何合并的?我的想法是在宏中执行VLOOKUP来搜索五种不同的作物条件 关于这个话题,我的第一个问题是关于如何从网站下载信息,请参阅。我建议这是第一个按钮“下载”,然后

我在这里提供链接:。我想学习如何使用Excel VBA中的宏/脚本执行此任务。我自己无法克服的问题有:

1数据中并非表示一年中的所有周。我不确定如何按特定的星期对数据进行排序,也不确定我需要什么命令

2在每周执行计算之前,是否可以在我的vba脚本中使用Excel函数VLOOKUP来选择所有不同的值,例如14周或15周?如果是,它是如何合并的?我的想法是在宏中执行VLOOKUP来搜索五种不同的作物条件

关于这个话题,我的第一个问题是关于如何从网站下载信息,请参阅。我建议这是第一个按钮“下载”,然后应该有第二个按钮对数据进行排序,称为“排序”

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
这似乎不起作用。这是一张图片,稍微改变了列宽,我正试图处理的内容


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

只需在与您的评级相对应的值上添加一个带有VLOOKUP的新列。要实现这一点,您需要一个能够提供这样一个值的参考范围。见截图1

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

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

I45=优秀 J2:J36是数据项列 M2:M36是值列 =SUMIFISERRORSEARCHI45,$J$2:$J$36,0,$M$2:$M$36

报税表:14

这是一个数组公式,因此必须按Ctrl+Shift+Enter键,而不仅仅是Enter键。您将知道您做得很正确,因为它在公式栏中看起来是这样的:{=SUMIFISERRORSEARCHI45,$J$2:$J$36,0,$M$2:$M$36}

当您按Ctrl+Shift+Enter时,它会自动添加{和}-您不需要输入它们

这个公式的作用是:

SearchExcellent,$J$2将在J2中查找出色的字符串,并返回找到该字符串的位置,如果没有找到该字符串,则返回错误。我们不关心实际值——我们只想知道它是否抛出错误。我们使用$J$2:$J$36将其转换为一个数组。您看不到它,但它实际上返回的值数组可能如下所示:

{44;VALUE!;VALUE!;VALUE!;VALUE!;44;VALUE!;VALUE!;VALUE!;44;VALUE!;VALUE!;VALUE!;VALUE!;44;VALUE!;VALUE!;VALUE!;44;VALUE!;VALUE!;VALUE!;VALUE!;44;VALUE!;VALUE!;VALUE!;VALUE!;VALUE!;VALUE!;VALUE!;VALUE!;VALUE!;VALUE!}

通过使用ISERRORSEARCHExcellent,$J$2:$J$36,我们将该内部阵列更改为:

{假;真;真;真;假;真;真;真;真;假;真;真;真;真;真;真;真;真;假;真;真;真;真;真;真;真;假;真;真;真;真;真}

如果找不到优秀的,ISERROR将为TRUE,因此我们希望找到该数组中所有FALSE值的值。我们使用IF来实现这一点。如果搜索是一个错误,0,否则给我们另一个数组的值-$M$2:$M$36作为值列

=IFISERRORSEARCHExcellent,$J$2:$J$36,0,$M$2:$M$36

这给了我们以下信息: {2;0;0;0;0;0;0;0;0;2;0;0;0;0;0;0;0;0;0;2;0;0;0;0;0;0;2;0;0;0;0;0;0;2;0;0}

因为你的样本数据每周有2个优秀

最后,我们在其周围加上SUM来求和这些值

=SUMIFISERRORSEARCHExcellent,$J$2:$J$36,0,$M$2:$M$36


同样,由于这是一个数组公式,如果使用此公式单击enter,它将返回0,但如果单击Ctrl+Shift+enter,它将给出正确的结果14

如果您想使用VBA,作为练习,下面是如何使用自定义公式

要使用此函数,请在单元格中键入以下内容:

=WeekTotalExcellent,$A$2:$M$36

VBA代码:

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

Vlookup是一个从不同的表中重新获取值的函数。我不认为那是你的愿望。告诉我们你的计算。从数据项中提取分数,然后乘以值?如果这么简单,为什么不添加一个额外的列,例如,对与优秀相对应的值进行VLOOKUP,然后在新的工作表中使用SUMIF?我没有投反对票,但我想我可以理解为什么有人会这样做。需要考虑的事项:1:“创建公式的宏”是指每次运行时实际创建全新公式的宏。我想你想要一个用VBA编写的自定义公式?2:您的2询问如何使用VLOOKUP选择所有不同的值。公式不能选择单元格,我想你实际上想做。。。有点…和他们有关。总结一下?数一数?不是100%肯定。
他说:我也不确定你指的是什么不同的价值观。投票结果通常意味着研究工作很少或没有,或者问题不清楚。