1.VBA实现EXCEL中Sheet1的 "甲列" 相同数值的行对应的"乙列"的数的和作为Sheet2中"丙列"中与Sheet1中"甲列" 相同的行对应的"丁列"的值...

本文介绍了一种使用VBA解决Excel数据处理难题的方法。主要包括:查找重复项、对特定列求和及将结果更新到另一工作表相应位置。适合对Excel公式不熟悉的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天有一同学,喊我帮忙处理EXCEL中数据的问题,题目表述太含糊,简单说,分3步工作:
1)找出SHEET1的"甲列"中相同的行,
2)把相同的行对应的"乙列"中的行求和SUM,
3)找出SHEET2的"丙列"中与"甲列"中相同的行,并把此行对应的"丁列"的值置为SUM.
  个人对EXCEL中的公式与函数不熟悉,又没有找到合适的人询问,只好自己在VBA里写代码.
因太久没有碰过VB,而且又不知道同学是否会再次喊我做同样的事情,所以把代码贴在这里,以备后用.

Sub SelectData()

    Dim i As Long, Max As Long, j As Long, Max2 As Long
    Dim count As Long
   
    Dim val As Double

    Dim sh1 As Worksheet, sh2 As Worksheet
    Dim col11 As String, col12 As String, col13 As String, col21 As String, col22 As String
    col11 = "A"             '合并的列
    col12 = "C"             '累加数据列
    col13 = "A"             '与另一个SH2比较的列
   
    col21 = "B"             '与SH1比较的列
    col22 = "C"             '和数据存放的列

    Set sh1 = Sheet2
    Set sh2 = Sheet3  
    
    j = 1
    i = 1
    count = 1
    Max2 = 302
    Max = 252
    val = sh1.Range(col12 & 1).Value
   
    Do

        If sh1.Range(col11 & count).Value = sh1.Range(col11 & (i + 1)).Value Then

            val = val + sh1.Range(col12 & (i + 1)).Value
            i = i + 1

        Else
           
            For j = 1 To Max2
                If sh2.Range(col21 & j).Value = sh1.Range(col13 & (count)).Value Then
                    sh2.Range(col22 & j).Value = val
                    Exit For
                End If
               
            Next       
            
            i = i + 1
            count = i
            val = sh1.Range(col12 & i).Value                  
            
        End If

    Loop While i < Max              

End Sub

转载于:https://www.cnblogs.com/zerobug/archive/2008/02/21/1076655.html

<think>我们使用VBAExcel实现:如果第一相同,则对后面指定的某几。 思路: 1. 我们可以使用字典(Dictionary)来存储第一作为键,而可以是一个组,用于存储需要求2. 遍历每一,检查第一。如果该在字典中已经存在,则将需要求累加到字典中对应组的相应位置;如果不存在,则将该作为新键,并将需要求作为初始存入组。 3. 最后,我们可以将结果输出到新的工作表或原工作表的指定位置。 假设要求是第2、第3第4(即B、C、D),第一是A。 步骤: 1. 创建一个字典,用于存储第一对应需要求2. 遍历工作表的每一(从第2开始,假设第1是标题)。 3. 对于每一,读取A作为键,然后读取B、C、D,将它们加到字典中对应组里。 4. 遍历完成后,将字典中的结果输出。 注意:需要求的具体可以根据实际调整,这里我们假设为B、C、D。 代码示例: ```vba Sub SumByFirstColumn() Dim dict As Object Set dict = CreateObject("Scripting.Dictionary") ' 假设据在Sheet1中,从第2开始(第1是标题) Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("Sheet1") Dim lastRow As Long lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row ' 定义需要求(B、C、D,即索引2,3,4) Dim sumCols() As Variant sumCols = Array(2, 3, 4) ' 索引组 Dim i As Long, j As Long Dim key As String Dim sumValues() As Double ' 用于存储每个键对应的求组 ' 遍历每一 For i = 2 To lastRow key = CStr(ws.Cells(i, 1).Value) ' 第一作为键 ' 如果字典中不存在该键,则初始化一个组(大小sumCols相同)并全部置0 If Not dict.Exists(key) Then ReDim sumValues(UBound(sumCols)) For j = 0 To UBound(sumCols) sumValues(j) = 0 Next j dict.Add key, sumValues End If ' 获取当前键对应组 sumValues = dict(key) ' 对需要求的每一累加 For j = 0 To UBound(sumCols) ' 注意:sumCols(j)是索引,所以Cells(i, sumCols(j))就是当前对应 sumValues(j) = sumValues(j) + CDbl(ws.Cells(i, sumCols(j)).Value) Next j ' 将更新后的组存回字典 dict(key) = sumValues Next i ' 输出结果,假设输出到Sheet2 Dim outputWs As Worksheet On Error Resume Next Set outputWs = ThisWorkbook.Sheets("Sheet2") If outputWs Is Nothing Then Set outputWs = ThisWorkbook.Sheets.Add outputWs.Name = "Sheet2" End If On Error GoTo 0 ' 清除输出工作表的内容 outputWs.Cells.Clear ' 输出标题 outputWs.Cells(1, 1).Value = "第一" ' 输出求的标题(这里使用原工作表对应的标题) For j = 0 To UBound(sumCols) outputWs.Cells(1, j + 2).Value = ws.Cells(1, sumCols(j)).Value Next j ' 输出字典中的结果 Dim keys As Variant keys = dict.keys Dim item As Variant Dim k As Long k = 2 ' 从第2开始输出 For i = 0 To dict.Count - 1 key = keys(i) outputWs.Cells(k, 1).Value = key sumValues = dict(key) For j = 0 To UBound(sumValues) outputWs.Cells(k, j + 2).Value = sumValues(j) Next j k = k + 1 Next i MsgBox "处理完成!" End Sub ``` 说明: 1. 此代码假设据在“Sheet1”中,输出到“Sheet2”。如果“Sheet2”不存在,则创建它。 2. 需要求组`sumCols`中定义,这里设置为第2、3、4(即B、C、D)。你可以根据实际需求修改这个组。 3. 代码中使用了字典来存储中间结果,每个键对应一个组,组的长度需要求相同。 4. 在输出结果时,我们复制了原工作表对应的标题(假设第一是标题)。 注意:如果据量很大,此代码可能运较慢,可以考虑使用组操作来优化(例如将整个据区域读入组,然后在内存中处理),但这里为了清晰展示,直接使用单元格操作。 请根据实际需求调整工作表名称、索引等参。 §§相关问题§§ 1. 如果我想对求后的结果进排序,应该如何在VBA实现2. 如果第一字,但有些是文本格式的字,如何避免在字典中作为不同的键处理? 3. 除了使用字典,还有哪些方法可以在Excel VBA实现相同第一据的求? 4. 如何修改代码,使得需要求可以通过用户输入来动态指定? 5. 如果据量很大,如何优化上述代码以提高运速度?</think>在Excel VBA中,若需根据第一相同对后续,可使用字典对象实现高效汇总。以下是完整解决方案: ```vba Sub SumByFirstColumn() Dim dict As Object Set dict = CreateObject("Scripting.Dictionary") Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("Sheet1") ' 修改为实际工作表名 Dim lastRow As Long lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 设置求范围(示例为B到D) Dim startCol As Integer: startCol = 2 ' B Dim endCol As Integer: endCol = 4 ' D ' 遍历 Dim i As Long, j As Long Dim key As String Dim sumVals() As Variant For i = 2 To lastRow ' 假设第1是标题 key = CStr(ws.Cells(i, 1).Value) ' 初始化求组 If Not dict.Exists(key) Then ReDim sumVals(startCol To endCol) For j = startCol To endCol sumVals(j) = 0 Next j dict.Add key, sumVals End If ' 累加数值 sumVals = dict(key) For j = startCol To endCol If IsNumeric(ws.Cells(i, j).Value) Then sumVals(j) = sumVals(j) + ws.Cells(i, j).Value End If Next j dict(key) = sumVals Next i ' 输出结果到新工作表 Dim outputWs As Worksheet Set outputWs = ThisWorkbook.Sheets.Add outputWs.Name = "汇总结果" ' 写标题 outputWs.Cells(1, 1) = "第一" For j = startCol To endCol outputWs.Cells(1, j) = ws.Cells(1, j).Value & "总" Next j ' 写据 Dim k As Long: k = 2 Dim keys As Variant keys = dict.Keys For i = 0 To dict.Count - 1 outputWs.Cells(k, 1) = keys(i) sumVals = dict(keys(i)) For j = startCol To endCol outputWs.Cells(k, j) = sumVals(j) Next j k = k + 1 Next i MsgBox "据汇总完成!结果见[" & outputWs.Name & "]工作表" End Sub ``` ### 功能说明: 1. **动态处理**:自动识别A 2. **灵活设置**:通过修改`startCol``endCol`变量指定求 3. **错误防护**: - 自动跳过非数值单元格 - 文本键统一处理(避免字/文本格式差异) 4. **结果输出**:自动创建新工作表存储汇总结果 ### 使用步骤: 1. 按`Alt+F11`打开VBA编辑器 2. 插入新模块并粘贴代码 3. 修改工作表名称(默认"Sheet1") 4. 按`F5`运宏 5. 结果将输出到新建的"汇总结果"工作表 ### 示例效果: | 原始据 | | | | |----------|-------|-------|--------| | 产品 | 销量 | 库存 | 订单 | | A | 10 | 5 | 3 | | B | 7 | 2 | 1 | | A | 3 | 1 | 2 | | 汇总结果 | | | | |----------|----------|----------|---------| | 第一 | 销量总 | 库存总 | 订单总| | A | 13 | 6 | 5 | | B | 7 | 2 | 1 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值