网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
12月14日漏签0天
excel吧 关注:281,910贴子:1,556,109
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 9回复贴,共1页
<<返回excel吧
>0< 加载中...

请利用VBA字典查找某一区域仅仅出现1次,并且大于0的数值

  • 只看楼主
  • 收藏

  • 回复
  • 孟军长666
  • 日新月E
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
利用VBA字典查A1:P1048000区域仅仅出现1次,并且大于0的数值,最后把这些数值按升序放入R列中。(求运行速度最快的代码,注意本表已超过65536行了)


  • 孟军长666
  • 日新月E
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
VBA我是菜鸟,一直在向各位学习


2025-12-14 05:34:58
广告
不感兴趣
开通SVIP免广告
  • 菠萝蜜
  • E览无余
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
数的范围


  • 菠萝蜜
  • E览无余
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
'估计需要5-10s,毕竟这个矩阵有点大:279936*253
Option Explicit
Const MaxNum As Long = 10480000
Sub abc()
 Dim a, i As Long, j As Long, m As Long, t As Single
 t = Timer
 ReDim flag(1 To MaxNum, 1 To 1) As Long
 For j = 1 To 253
  a = Cells(1, j).Resize(279936).Value
  For i = 1 To UBound(a)
   If a(i, 1) > 0 Then
    If a(i, 1) > MaxNum Then MsgBox a(i, 1): Exit Sub
    flag(a(i, 1), 1) = flag(a(i, 1), 1) + 1
   End If
  Next
 Next
 For i = 1 To MaxNum
  If flag(i, 1) = 1 Then m = m + 1: flag(m, 1) = i
 Next
 Debug.Print Timer - t
 [iu:iu].ClearContents
 If m > 0 Then
  If m > 2 ^ 20 Then MsgBox Format(m, "无法放入单列 0"): Exit Sub
  [iu1].Resize(m) = flag
 End If
 Debug.Print Timer - t, m
End Sub


  • 精神肥宅
  • E见钟情
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
今天刚学字典来献丑了,我认为if判断会拖慢速度,干脆先放后删,反正-200到0没几个数据。
Sub test()
On Error Resume Next
Dim arr, i As Integer, dic As Object, rng As Range
Set dic = CreateObject("Scripting.Dictionary")
For Each rng In Range("A1:IS279936")
dic.Item(rng.Value) = ""
Next rng
For i = 0 To -200 Step -1
dic.Remove (i)
Next i
arr = dic.keys
Range("IU1:IU" & dic.Count) = Application.Transpose(arr)
Range("IU:IU").Sort Range("IU1")
Set dic = Nothing
End Sub


  • 菠萝蜜
  • E览无余
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
'这么多输出数据估计用时要10s以上
Option Explicit
Const MaxNum As Long = 10480000
Sub abc()
 Dim a, i As Long, j As Long, m As Long, t As Single
 t = Timer
 ReDim flag(1 To MaxNum, 1 To 1) As Long
 For j = 1 To 253
  a = Cells(1, j).Resize(279936).Value
  For i = 1 To UBound(a)
   If a(i, 1) > 0 Then
    If a(i, 1) > MaxNum Then MsgBox a(i, 1): Exit Sub
    flag(a(i, 1), 1) = flag(a(i, 1), 1) + 1
   End If
  Next
 Next
 For i = 1 To MaxNum
  If flag(i, 1) = 1 Then m = m + 1: flag(m, 1) = i
 Next
 Debug.Print Timer - t
 If m > 0 Then
  Dim x As Long, y As Long
  ReDim a(1 To 2 ^ 20, 1 To m \ 2 ^ 20 + 1) As Long
  y = 1
  For i = 1 To m
   x = x + 1
   a(x, y) = flag(i, 1)
   If x = 2 ^ 20 Then x = 0: y = y + 1
  Next
  [iu1].Resize(UBound(a), UBound(a, 2)) = a
 Else
  MsgBox "无解"
 End If
 Debug.Print Timer - t, m
End Sub


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 9回复贴,共1页
<<返回excel吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示