Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 918|回复: 5

[已解决]VBA怎么指定删除部分数据

[复制链接]
发表于 2022-11-22 13:40 | 显示全部楼层 |阅读模式
各位大神,求帮忙看下这种VBA怎么写。每天数据量有点大,不能直接删除重复项,直接删的有部分订单编号为空白的数据会出现错误。每天耗费的时间有点多,求大神帮忙看看
最佳答案
2022-11-22 15:43
  1. Sub TEST()
  2.     Dim d, k As Integer, str As String, arr, brr(), i As Integer
  3.     Set d = CreateObject("scripting.dictionary")
  4.     arr = Sheet1.Range("a1:b" & Sheet1.Range("b1000").End(3).Row)
  5.     For k = 2 To UBound(arr)
  6.         If arr(k, 1) = "" Then arr(k, 1) = arr(k - 1, 1)
  7.         str = arr(k, 1) & "," & arr(k, 2)
  8.         If d.exists(str) = False Then
  9.             d(str) = ""
  10.             i = i + 1
  11.             ReDim Preserve brr(1 To 2, 1 To i)
  12.             brr(1, i) = arr(k, 1)
  13.             brr(2, i) = arr(k, 2)
  14.         End If
  15.     Next k
  16.     Sheet2.Range("a1:b1") = Array("订单号", "商品标题")
  17.     Sheet2.Columns(1).NumberFormatLocal = "@"
  18.     Sheet2.Range("a2").Resize(i, 2) = Application.Transpose(brr)
  19.    
  20. End Sub
复制代码

订单整理.zip

11.4 KB, 下载次数: 7

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2022-11-22 14:17 | 显示全部楼层
  1. Sub TEST()
  2.     Dim d, k As Integer, str As String, arr, brr(), i As Integer
  3.     Set d = CreateObject("scripting.dictionary")
  4.     arr = Sheet1.Range("a1:b" & Sheet1.Range("b1000").End(3).Row)
  5.     For k = 2 To UBound(arr)
  6.         If arr(k, 1) = "" Then arr(k, 1) = arr(k - 1, 1)
  7.         str = arr(k, 1) & "," & arr(k, 2)
  8.         If d.exists(str) = False Then
  9.             d(str) = ""
  10.             i = i + 1
  11.             ReDim Preserve brr(1 To 2, 1 To i)
  12.             brr(1, i) = arr(k, 1)
  13.             brr(2, i) = arr(k, 2)
  14.         End If
  15.     Next k
  16.     Sheet2.Range("e1:f1") = Array("订单号", "商品标题")
  17.     Sheet2.Columns(5).NumberFormatLocal = "@"
  18.     Sheet2.Range("e2").Resize(i, 2) = Application.Transpose(brr)
  19.    
  20. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2022-11-22 15:33 | 显示全部楼层

谢谢大神。这个办法可以,但是能让数据直接显示在原数据的位置吗?我刚试着想改动到表1位置,但是之前的多数据多些,更新后的数据粘贴在原位置会混在一起。
回复

使用道具 举报

发表于 2022-11-22 15:43 | 显示全部楼层    本楼为最佳答案   
  1. Sub TEST()
  2.     Dim d, k As Integer, str As String, arr, brr(), i As Integer
  3.     Set d = CreateObject("scripting.dictionary")
  4.     arr = Sheet1.Range("a1:b" & Sheet1.Range("b1000").End(3).Row)
  5.     For k = 2 To UBound(arr)
  6.         If arr(k, 1) = "" Then arr(k, 1) = arr(k - 1, 1)
  7.         str = arr(k, 1) & "," & arr(k, 2)
  8.         If d.exists(str) = False Then
  9.             d(str) = ""
  10.             i = i + 1
  11.             ReDim Preserve brr(1 To 2, 1 To i)
  12.             brr(1, i) = arr(k, 1)
  13.             brr(2, i) = arr(k, 2)
  14.         End If
  15.     Next k
  16.     Sheet2.Range("a1:b1") = Array("订单号", "商品标题")
  17.     Sheet2.Columns(1).NumberFormatLocal = "@"
  18.     Sheet2.Range("a2").Resize(i, 2) = Application.Transpose(brr)
  19.    
  20. End Sub
复制代码
回复

使用道具 举报

发表于 2022-11-22 21:05 | 显示全部楼层
  1. Sub test()
  2.     Dim vArr, brr, dic As Object
  3.     Dim i%, j%, n%, k, s, m
  4.     Set dic = CreateObject("scripting.dictionary")
  5.     vArr = Sheet1.Range("A1").CurrentRegion
  6.     For i = 2 To UBound(vArr)
  7.         If Len(vArr(i, 1)) Then
  8.             n = i
  9.             If Not dic.exists(vArr(i, 1)) Then Set dic(vArr(i, 1)) = CreateObject("scripting.dictionary")
  10.             dic(vArr(i, 1))(vArr(i, 2)) = ""
  11.         Else
  12.             dic(vArr(n, 1))(vArr(i, 2)) = ""
  13.         End If
  14.     Next i
  15.     ReDim brr(1 To UBound(vArr), 1 To 2)
  16.     For Each k In dic.keys
  17.         For Each s In dic(k).keys
  18.             j = j + 1
  19.             m = m + 1
  20.             If j = 1 Then brr(m, 1) = k
  21.             brr(m, 2) = s
  22.         Next s
  23.         j = 0
  24.     Next
  25.     Sheet1.Range("A1").CurrentRegion.Offset(1).ClearContents
  26.     Sheet1.Range("A2").Resize(UBound(brr), 2).NumberFormatLocal = "@"
  27.     Sheet1.Range("A2").Resize(UBound(brr), 2) = brr
  28. End Sub
复制代码
回复

使用道具 举报

发表于 2022-11-22 21:38 | 显示全部楼层
  1. Sub test()
  2.     Dim vArr, brr, i%, j%, n%
  3.     vArr = Sheet1.Range("A1").CurrentRegion
  4.     ReDim brr(1 To UBound(vArr), 1 To 2)
  5.     For i = 1 To UBound(vArr)
  6.         If Len(vArr(i, 1)) = 0 Then vArr(i, 1) = vArr(i - 1, 1)
  7.     Next i
  8.     For i = 1 To UBound(vArr)
  9.         For j = i + 1 To UBound(vArr)
  10.             If vArr(i, 1) = vArr(j, 1) And vArr(i, 2) = vArr(j, 2) Then vArr(j, 2) = "": vArr(j, 1) = ""
  11.         Next j
  12.         If Len(vArr(i, 1)) Then n = n + 1: brr(n, 1) = vArr(i, 1): brr(n, 2) = vArr(i, 2)
  13.     Next
  14.     Sheet1.Columns("A:B").Clear
  15.     Sheet1.Columns(1).NumberFormatLocal = "@"
  16.     Sheet1.Range("A1").Resize(UBound(brr), 2) = brr
  17. End Sub
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-2 11:33 , Processed in 1.756012 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表