distinct用法(VB与ACCess)去除重复项

distinct用法(VB与ACCess)去除重复项,第1张

先找出姓名,再找出电话,分2句sql语句就行了

distinct是不能同时修饰2个属性的,“select

distinct

姓名,电话”这样是错误的,

象下面的数据:

张三

123

张三

222

李四

123

如果你用"select

distinct

姓名,电话"的话,那么是去掉第二条还是第三条数据呢?所以电脑是无法处理的,所以distinct只能修饰一个属性

错的一塌糊涂

后面一大段全都是VBA的代码,VB根本不识别

arr是二维的,ubound后面还要加上维度

字典赋值写得什么乱七八糟的

你set的xlbook和xlsheet用了么

最后来一句visible=true也没用,你前面也没写false,人家本来就是true

别用手机拍屏幕,截图键是print screen

既然习惯用VBA的代码,你就直接用VBA做好了,没必要硬去用VB

'说实话,这个对于新手是很难得!

'举个例子arr()数组为1-10的10个值,brr()数组为1-3的3个值

'去重之后的数组赋值到crr(),然后打印验证。

'有问题可以问我,运行效果如上图,代码如下:

Private Sub Command1_Click()

Dim arr(10), brr(3) As Integer

Dim crr(10)

Dim i, j, x, n, s As Integer

Dim a, b As Integer

m = 1

For i = 1 To 10

arr(i) = i

Next i '将1-10赋值给数组arr

brr(1) = 1

brr(2) = 2

brr(3) = 3 '将1-3赋值给数组brr

For j = 1 To UBound(brr())

 x = 1

 For x = 1 To UBound(arr())

  If arr(x) = brr(j) Then

    For n = x To UBound(arr) - 1 

    arr(n) = arr(n + 1)

    Next n

    s = s + 1

  End If

 Next x

Next j

Print "去重复后数组元素为:"

For a = 1 To UBound(arr()) - s

crr(a) = arr(a)

Print crr(a);'最终去重后的数据存入crr数组并打印验证

Next a

End Sub

Function array_unique(ByRef srcArray)

If Ubound(srcArray) <= 0 Then '小于2个不用去重

array_unique = srcArray

Exit Function

End If

'这里用字典,带key=>value映射,比较方便

Dim dict1: Set dict1 = ServerCreateObject("ScriptingDictionary")

Dim dictWillDel: Set dictWillDel = ServerCreateObject("ScriptingDictionary")

Dim i

For i = 0 To Ubound(srcArray) '循环要去重的数组

If dict1Exists(srcArray(i)) Then 'dict1里面已经有这个值了,说明这个值有重

dictWillDelAdd i '把要去掉的元素的下标记录到dictWillDel里

Else '至目前为止没有重复

dict1Add srcArray(i) '那就记下来,再碰到这个值就说明有重复了

End If

Next

Dim newArray: Redim newArray(0) '建立一个新数组,把srcArray里面不需要去掉的值存进来,因为要在srcArray里面去掉一个元素不太方便

Dim n: n = 0

For i = 0 To Ubound(srcArray)

If Not dictWillDelExists(i) Then '这个下标在dictWillDel里没有,说明不用删除这项

'那就存下来

Redim Preserve newArray(n)

newArray(n) = srcArray(i)

n = n + 1

End If

Next

array_unique = newArray

srcArray = newArray

End Function

关键是这个“几万”。在vb中,数组的大小是有限的,也刚好是“几万”。简单点的办法是利用数据库。

取每一行的内容,hash值保存到一个表中,hash字段为主键,它就不允许重复,添加数据时就可以完成去重。

然后用随机数从里面取记录就好,取一条记录就删除一条,伪代码如下:

for i=行数 to 1 step -1

行号=int(rnd()i+1)

行内容 = 读记录(行号

删记录(行号)

输出(行内容+CRLF)

next

如果不想使用数据库,也可以使用链表或二叉树/B树。在vb中实现链表比较费空间,而且链表在去重方面效率不高。使用树则在去重方面会很高,随机取出则低,你也可以结合二者来使用。完全在vb中实现的话,建议只保存每行的hash和行的开始偏移及行长度,这样会节约一点内存,但文件IO就会高一些。

这个方法很多的:都需要循环来完成

1,可以采用循环搜索比较,从上到下进行,一一排除。

2,也可以采用,读取到数组里,排除重复。

下面是方法一的代码。

Dim i As Integer

Dim j As Integer

i = 0

Do While i < List1ListCount - 1

j = i + 1

Do While j <= List1ListCount - 1

If List1List(i) = List1List(j) Then

List1RemoveItem j

Else

j = j + 1

End If

Loop

i = i + 1

Loop

以上就是关于distinct用法(VB与ACCess)去除重复项全部的内容,包括:distinct用法(VB与ACCess)去除重复项、vb6字典的使用。去重,合并数据,试了试,提示402错误。哪里不对、VB一个数组去除另一个数组中的元素等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9718806.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存