SUMIF作为Excel中的宏(VBA)

时间:2015-07-16 15:20:49

标签: excel vba excel-vba sumifs

所以这就是我正在使用的概念。

我的Sheet1上有许多键和值:

enter image description here

然后在sheet2上,我一直在使用SUMIF函数来计算sheet1的总值:

enter image description here

这只是一个例子,实际的数据集要大得多。我需要设计一个宏,它将自动生成并将SUMIF公式插入到sheet2中的正确单元格中。谁能想到办法做到这一点?

4 个答案:

答案 0 :(得分:2)

即使不知道任何其他要求或您正在做什么,或者有多少列或按键,您也可以:

  1. 录制一个宏
  2. 将其分配给按钮,
  3. 写一行代码     当用户点击按钮时,它将在列上运行宏     选中(或选择列的第一个单元格时)。
  4. 如果有100多列,那么它是单调乏味的,你需要一个宏来循环它,但我不知道你有什么/需要。

答案 1 :(得分:1)

这是一个解决方案。

With [sheet1!a1:index(sheet1!a:a,count(sheet1!a:a))]

    [b1:index(sheet2!b:b,count(sheet2!a:a))].Offset(1).Formula = _
        "=sumif(sheet1!" & .Offset(1).Address & ",a2,sheet1!" & .Offset(1, 1).Address & ")"

End With

这假设sheet2上的A列已经就位。同样,它假设sheet2上B列的Header已经就位,B列的其余部分为空白,将由上面的代码填充。

它也假设数字键。

如果任何假设错误,可以轻松调整此解决方案。请告诉我。

答案 2 :(得分:0)

我会从第一张纸上读取数据,然后构建第二张纸。您需要为adodb记录集添加引用。在工具下拉菜单的VBA IDE中选择引用。选择“Microsoft ActiveX Data Objects 2.8 Library”。

Private Sub CommandButton10_Click()
Dim rs As New ADODB.Recordset
Dim ws As Excel.Worksheet
Dim lRow As Long
Dim lLastRowSheet1 As Long

    Set ws = ActiveWorkbook.Sheets("Sheet1")

    'Add fields to your recordset for storing data.
    With rs
        .Fields.Append "Row", adInteger
        .Fields.Append "Key", adInteger
        .Fields.Append "Val", adInteger
        .Open
    End With

    lLastRowSheet1 = ws.UsedRange.Rows.count
    lRow = 1

    'Loop through and record what is in the columns
    Do While lRow <= ws.UsedRange.Rows.count

        rs.AddNew
        rs.Fields("Row").Value = lRow
        rs.Fields("Key").Value = ws.Range("A" & lRow).Value
        rs.Fields("Val").Value = ws.Range("B" & lRow).Value
        rs.Update

        lRow = lRow + 1
        ws.Range("A" & lRow).Activate
    Loop

    If rs.EOF = False Then
        rs.MoveFirst
    End If

    'Switch to the second worksheet
    Set ws = Nothing
    Set ws = ActiveWorkbook.Sheets("Sheet2")

    'Now go through the data from sheet one and build the list of keys
    Dim iLastKey As Integer
    lRow = 1
    Do While rs.EOF = False
        'For each unique key add a row to the second sheet.
        If rs.Fields("Key").Value <> iLastKey Then
            ws.Range("A" & lRow).Value = rs.Fields("Key").Value
            ws.Range("B" & lRow).Formula = "=sumif(sheet1!$A$2:$A$" & lLastRowSheet1 & ",A" & lRow & ",Sheet1!$B$2:$B$" & lLastRowSheet1 & ")"
           lRow = lRow + 1
        End If

        iLastKey = rs.Fields("Key").Value
    rs.MoveNext
    Loop

End Sub

答案 3 :(得分:0)

这是我最后使用的:

 UPDATE F
SET F.ExtractedId = E.Id
FROM Feature as F 
INNER JOIN ExtractedFeature as E 
    ON F.ExtractedId = E.Number

问题是它真的很慢,有没有人知道如何更快地运行?欢呼声