VBA,怎么加和
谁能告诉我一下代码,帮我实现以下的加和目标:简单举例说明,假设excel中三列第一列是A或B,第二列是1或2或3,第三列是我需要加和的数据。前两列的组合可能分别是这样:A...
谁能告诉我一下代码,帮我实现以下的加和目标:简单举例说明,假设excel中三列 第一列是A或B,第二列是1或2或3,第三列是我需要加和的数据。前两列的组合可能分别是这样:
A 1
A 1
A 1
A 2
A 3
A 3
B 1
B 2
B 2
B 2
B 2
B 3
B 3
我想要的就是,只要前两列都一样的,就把第三列的值加到一起,所以最后我只需要得到六个数,也就是A1/A2/A3/B1/B2/B3 各自在第三列中的和。
因为我只会最基础的代码。。。本来写最简单的程序也可以,但就是效率比较低。数据少的时候还可以,但是因为真实的数据条目非常多,估计有几十万条,所以希望能够求助大家帮我写一个效率高点的程序实现一下。
不知道我说清楚了没有,谢谢大家的帮助啊! 展开
A 1
A 1
A 1
A 2
A 3
A 3
B 1
B 2
B 2
B 2
B 2
B 3
B 3
我想要的就是,只要前两列都一样的,就把第三列的值加到一起,所以最后我只需要得到六个数,也就是A1/A2/A3/B1/B2/B3 各自在第三列中的和。
因为我只会最基础的代码。。。本来写最简单的程序也可以,但就是效率比较低。数据少的时候还可以,但是因为真实的数据条目非常多,估计有几十万条,所以希望能够求助大家帮我写一个效率高点的程序实现一下。
不知道我说清楚了没有,谢谢大家的帮助啊! 展开
2个回答
展开全部
你这个是非常实际的问题,所以就直接给你解决好了
Option Explicit
Sub damnvba()
Dim sh As Worksheet
Set sh = ThisWorkbook.Worksheets("sheet1") '这里放你放数据的sheet的名称
Dim i As Integer
Dim j As Integer
sh.Columns("A:B").Sort Key1:=Range("A1"), Order1:=xlAscending, Key2:=Range("B1") _
, Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin, DataOption1:= _
xlSortNormal, DataOption2:=xlSortNormal
'sh.Range("D1").FormulaR1C1 = "=sheet1!A1 & sheet1!B1"
sh.Range("D1").FormulaR1C1 = "=RC[-3] & RC[-2]"
'根据数据多少自己改D30000
sh.Range("D1").AutoFill Destination:=Range("D1:D30000"), Type:=xlFillDefault
Dim strLast As String
i = 1
Dim iStart As Integer
Dim iEnd As Integer
Dim iCount As Integer
iCount = 1
iStart = 1
iEnd = 1
Dim iTRow As Integer
Dim iTCol As Integer
strLast = sh.Range("D1").Text
Do While sh.Range("A" & i).FormulaR1C1 <> ""
DoEvents
If sh.Range("D" & i).Text <> strLast Then
iEnd = i - 1
sh.Range("E" & iCount).FormulaR1C1 = "=sum(R[" & iStart - iCount & "]C[-2] : R[" & iEnd - iCount & "]C[-2])"
sh.Range("F" & iCount).FormulaR1C1 = strLast
iCount = iCount + 1
iStart = i
strLast = sh.Range("D" & i).Text
End If
i = i + 1
Loop
'还有最后一个需要判断
iEnd = i - 1
sh.Range("E" & iCount).FormulaR1C1 = "=sum(R[" & iStart - iCount & "]C[-2] : R[" & iEnd - iCount & "]C[-2])"
sh.Range("F" & iCount).FormulaR1C1 = strLast
iCount = iCount + 1
iStart = i
strLast = sh.Range("D" & i).Text
End Sub
Option Explicit
Sub damnvba()
Dim sh As Worksheet
Set sh = ThisWorkbook.Worksheets("sheet1") '这里放你放数据的sheet的名称
Dim i As Integer
Dim j As Integer
sh.Columns("A:B").Sort Key1:=Range("A1"), Order1:=xlAscending, Key2:=Range("B1") _
, Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin, DataOption1:= _
xlSortNormal, DataOption2:=xlSortNormal
'sh.Range("D1").FormulaR1C1 = "=sheet1!A1 & sheet1!B1"
sh.Range("D1").FormulaR1C1 = "=RC[-3] & RC[-2]"
'根据数据多少自己改D30000
sh.Range("D1").AutoFill Destination:=Range("D1:D30000"), Type:=xlFillDefault
Dim strLast As String
i = 1
Dim iStart As Integer
Dim iEnd As Integer
Dim iCount As Integer
iCount = 1
iStart = 1
iEnd = 1
Dim iTRow As Integer
Dim iTCol As Integer
strLast = sh.Range("D1").Text
Do While sh.Range("A" & i).FormulaR1C1 <> ""
DoEvents
If sh.Range("D" & i).Text <> strLast Then
iEnd = i - 1
sh.Range("E" & iCount).FormulaR1C1 = "=sum(R[" & iStart - iCount & "]C[-2] : R[" & iEnd - iCount & "]C[-2])"
sh.Range("F" & iCount).FormulaR1C1 = strLast
iCount = iCount + 1
iStart = i
strLast = sh.Range("D" & i).Text
End If
i = i + 1
Loop
'还有最后一个需要判断
iEnd = i - 1
sh.Range("E" & iCount).FormulaR1C1 = "=sum(R[" & iStart - iCount & "]C[-2] : R[" & iEnd - iCount & "]C[-2])"
sh.Range("F" & iCount).FormulaR1C1 = strLast
iCount = iCount + 1
iStart = i
strLast = sh.Range("D" & i).Text
End Sub
展开全部
用字典来完成很方便
代码如下
Sub aaa()
Dim d As Object, arr, arr1(), x&, i&, Zd As String
arr = Range("A1:B" & Range("A65536").End(xlUp).Row)
Set d = CreateObject("scripting.dictionary")
For x = 1 To UBound(arr)
Zd = arr(x, 1) & "|" & arr(x, 2)
d(Zd) = d(Zd) + 1
Next x
arr1 = d.keys
For x = 0 To d.Count - 1
arr1(x) = Replace(arr1(x), "|", "")
Next x
Range("C1").Resize(d.Count, 1) = Application.Transpose(arr1)
Range("D1").Resize(d.Count, 1) = Application.Transpose(d.items)
End Sub
结果为C列为A1,A2,A3,B1,B2,B3
D列为他们各自出现几次(计数)
代码如下
Sub aaa()
Dim d As Object, arr, arr1(), x&, i&, Zd As String
arr = Range("A1:B" & Range("A65536").End(xlUp).Row)
Set d = CreateObject("scripting.dictionary")
For x = 1 To UBound(arr)
Zd = arr(x, 1) & "|" & arr(x, 2)
d(Zd) = d(Zd) + 1
Next x
arr1 = d.keys
For x = 0 To d.Count - 1
arr1(x) = Replace(arr1(x), "|", "")
Next x
Range("C1").Resize(d.Count, 1) = Application.Transpose(arr1)
Range("D1").Resize(d.Count, 1) = Application.Transpose(d.items)
End Sub
结果为C列为A1,A2,A3,B1,B2,B3
D列为他们各自出现几次(计数)
追问
是我没说清楚哈,数据时是三列,前两列只是标签,第三列才是要加和的数据
A 1 3
A 1 5
A 2 8
A 2 2
A 2 4
A 3 4
B 1 2
B 2 4
B 2 2
B 3 5
B 3 6
我想得到的是,如果前两列都一样,就把第三列的数加起来。所以第四列应该得到8 14 4 2 6 11,因为
A1=3+5
A2=8+2+4
A3=4
B1=2
B2=4+2
B3=5+6
所以能不能麻烦再帮我修改一下呢?
不管怎样,非常感谢你的帮助。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询