Office中国论坛/Access中国论坛

标题: Access挑战Excel第二十七期:合并,又见合并 [打印本页]

作者: roych    时间: 2016-7-12 11:21
标题: Access挑战Excel第二十七期:合并,又见合并
关于合并数据,其实已经挑战过一次,不过,当时用的是联合查询。不过这次说的“合并”跟上一次是不一样的。先上图:原数据:
[attach]59546[/attach]
合并后:
[attach]59547[/attach]

这种合并在日常工作中还是很常见的,例如,一个用户购买了多个商品,配送时可能就需要根据已有现货的进行合并了。——当然,如果客户允许全部到货之后再一次性寄则不存在这个情况。

在access里大约只需4行代码就好了……好吧,代码,代码……

(Roy表示,已经感受到来自于某妖深深的鄙视了)


不过,Excel用户打算怎么解决这个问题呢?公式吗?别忘了,用户ID可是乱序的哦。
  1. Function MergeData(ByVal strFieldName As String, ByVal lngID As Long) As String
  2.     Dim rst As New ADODB.Recordset
  3.     rst.Open "select " & strFieldName & " from 数据 where 用户ID=" & lngID, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  4.     MergeData = rst.GetString(RowDelimeter:=";")
  5.     rst.Close
  6. End Function
复制代码

[attach]59548[/attach]
PS:估计这几天某妖都不在,我能不能嘚瑟那么几天先呢?

作者: purplerose    时间: 2016-7-12 11:26
ROYCH,您好!前几天在看合并数据的处理,现在终于可以看到A和E高手是怎样做的呀,真心地学习一下,谢了!
作者: tmtony    时间: 2016-7-12 13:03
小妖不在人间?
作者: purplerose    时间: 2016-7-12 14:01
ROYCH,您怎么知道小妖老师不在呀?可能去修练了,到时出关时,就不一样了,水平又上升一个档次了。
作者: ganlinlao    时间: 2016-7-16 11:45

recordset的getstring其实是有严重缺陷的,
在这里我就不多说了,先将就着用吧

作者: pureshadow    时间: 2016-7-17 17:03
Roy,下次这种要祭出代码的,就不要拿出来显摆了,Access有VBA,难道Excel没有VBA么?
  1. Sub Sample()
  2. Dim MyRow As Long, i As Long
  3. Dim MyFind As Range
  4. Range("d1:e1") = Range("a1:b1").Value
  5. i = 1
  6. For MyRow = 2 To 28
  7.     Set MyFind = Range("d:d").Find(Cells(MyRow, 1), , , xlWhole)
  8.     If MyFind Is Nothing Then
  9.         i = i + 1
  10.         Cells(i, 4) = Cells(MyRow, 1)
  11.         Cells(i, 5) = Cells(MyRow, 2)
  12.     Else
  13.         Cells(MyFind.Row, 5) = Cells(MyFind.Row, 5) & ";" & Cells(MyRow, 2)
  14.     End If
  15. Next
  16. Set MyFind = Nothing
  17. End Sub
复制代码

作者: pureshadow    时间: 2016-7-17 17:47
好吧,你会说代码太复杂,那PowerQuery怎么样?[attach]59570[/attach]

进入PQ神器以后到转换选项卡下分个组:
[attach]59571[/attach]

至于具体的分组依据……就这样吧,直接确定:
[attach]59572[/attach]

不过您可能会说,这确定以后的……与我们想要的效果半点不搭界啊?
不搭界不要紧,改一下公式就好了。
把原来的
  1. = Table.Group(更改的类型, {"用户ID"}, {{"计数", each Table.RowCount(_), type number}})
复制代码
改成
  1. = Table.Group(更改的类型, {"用户ID"}, {{"结果", each Text.Combine([套餐名称],";")}})
复制代码
就行了,看看是不是这样:
[attach]59573[/attach]

最后上传就好了。
[attach]59574[/attach]

效果都在下面的附件里的,有兴趣就自己打开来看吧。不过!非2016版O365请忽略。


作者: pureshadow    时间: 2016-7-17 17:52
好吧,我承认,这题确实让我损失不少脑细胞,后来脑细胞不够用了,就找了N个SQL大神请教,最后无果……
然后又想尝试公式=TEXTJOIN(",",1,IF(A$2:A$7=D2,B$2:B$7)),最后又无果……
Roy,你赢了!
作者: pureshadow    时间: 2016-8-2 12:13
后来LUXS(DiDi9)同学又给出函数解答方法,如附件。
作者: 李力军2    时间: 2016-9-1 15:23
好事,这种PK要经常搞啊
作者: 李力军2    时间: 2016-9-1 16:01
这个问题,在ACC里面,可以不用代码,全部用查询也是可以解决的。以前的有过这方面的例子。
作者: 李力军2    时间: 2016-9-1 16:04
李力军2 发表于 2016-9-1 16:01
这个问题,在ACC里面,可以不用代码,全部用查询也是可以解决的。以前的有过这方面的例子。

但楼主的这个思路最为便捷
作者: enllun    时间: 2016-11-25 11:21
厉害啊,




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3