Excel精英培训网

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

[已解决]关于VBA中数组的编写

[复制链接]
发表于 2010-2-27 20:40 | 显示全部楼层 |阅读模式
工作中的数据量较大,想把以下程序改为数组编写,请各位高手帮忙了,谢谢!对数组我实在是搞不懂,请各位帮我编写了,谢谢!




Sub 数据源数据生成()
  Dim I     As Long
  Dim n, jydl
  
  
  n = ActiveWorkbook.Sheets("数据源").UsedRange.Rows.Count
  jydl = ActiveWorkbook.Sheets("交易大类").UsedRange.Rows.Count
  
  
  Sheets("数据源").Range("a5:c" & n).Clear
  
  Sheets("数据源").Range("q5:y" & n).Clear

   
  
  
  '''取交易大类
For I = 5 To n
            Cells(I, 1) = Application.VLookup(Cells(I, 8), Sheets("交易大类").Range("A2:B" & jydl), 2, 0)
            Next

   
   
   
   

            
            
'''生成关联交易标记
For I = 5 To n
  If Sheets("数据源").Cells(I, 4) = 18 Then
  Cells(I, 2) = "关联销售"
  Else
  If Sheets("数据源").Cells(I, 6) = 50 Then
  Cells(I, 2) = "宠物销售"

  Else
  Cells(I, 2) = "非关联销售"
  End If
  End If
  Next
最佳答案
2010-2-28 20:02

arrt数组只有两列,何来arrt(k, 3)

感觉除了用字典,用FIND也是可以的,不过不知道哪一个速度更快

发表于 2010-2-27 20:55 | 显示全部楼层

MS这个问题问了N遍了,还没解决呢?没有附件吗
回复

使用道具 举报

发表于 2010-2-27 22:30 | 显示全部楼层

我是不知道的,怎么解决呢?来学

回复

使用道具 举报

 楼主| 发表于 2010-2-27 23:23 | 显示全部楼层

QUOTE:
以下是引用枯禅在2010-2-27 20:55:00的发言:
MS这个问题问了N遍了,还没解决呢?没有附件吗

专家,我只有靠你了,谢谢了!附件上传了,这对我真的蛮重要的,谢谢!

WSOUaVbD.rar (12.36 KB, 下载次数: 1)
回复

使用道具 举报

发表于 2010-2-28 09:00 | 显示全部楼层

偶不是专家是砖家,请大家别要拍砖

M1KMsMt8.rar (14.26 KB, 下载次数: 2)

回复

使用道具 举报

 楼主| 发表于 2010-2-28 14:32 | 显示全部楼层

QUOTE:
以下是引用枯禅在2010-2-28 9:00:00的发言:

偶不是专家是砖家,请大家别要拍砖


非常感谢,我再自我消化一下哦,谢谢了!

回复

使用道具 举报

 楼主| 发表于 2010-2-28 14:37 | 显示全部楼层

枯禅大哥,你太强了,速度比之前真的快多了,之前要半个小时,现在只要一秒钟。

小弟还有个不请之请,能否请大哥帮忙给个注释啊,这个数组看的不是很明白。谢谢了!

回复

使用道具 举报

 楼主| 发表于 2010-2-28 19:56 | 显示全部楼层

枯禅老师,照着您帮忙编写的数组公式,我也学着向下写,但无法运行了,总是在arrt(k, 3) = "",这个地方报错,麻烦您帮忙看看了,谢谢!

Sub 数据源数据生成4444()
Dim I&, k&, n&
Dim arr, arr0, arrt()
Dim d As New Dictionary
With Sheets("交易大类")
    arr = .Range("a2:b" & .[a65536].End(3).Row)
End With
For I = 1 To UBound(arr)
    d(arr(I, 1)) = arr(I, 2)
Next
With Sheets("数据源")
    arr0 = .Range("a5:Y" & .[H65536].End(3).Row)
    ReDim arrt(1 To UBound(arr0), 1 To 2)
    For k = 1 To UBound(arrt)
        arrt(k, 1) = d(arr0(k, 8))
        If arr0(k, 4) = 18 Then
            arrt(k, 2) = "关联销售"
        ElseIf arr0(k, 4) = 50 Then
            arrt(k, 2) = "宠物销售"
        Else
            arrt(k, 2) = "非关联销售"
        End If
    Next
    .[a5].Resize(UBound(arrt), 2) = arrt
End With

With Sheets("交易大类")
    arr = .Range("a2:b" & .[a65536].End(3).Row)
End With
For I = 1 To UBound(arr)
    d(arr(I, 1)) = arr(I, 2)
Next
With Sheets("数据源")
    arr0 = .Range("a5:Y" & .[H65536].End(3).Row)
    ReDim arrt(1 To UBound(arr0), 1 To 2)
    For k = 1 To UBound(arrt)
        arrt(k, 1) = d(arr0(k, 8))
        If arr0(k, 4) = 18 And arr0(k, 1) = "15GP" Or arr0(k, 1) = "16BR" Then
            arrt(k, 3) = "关联禽料交易"
        ElseIf arr0(k, 4) = 18 And arr0(k, 1) = "11HG" Then
            arrt(k, 3) = "关联猪料交易"
        Else
            arrt(k, 3) = ""
        End If
    Next
    .[a5].Resize(UBound(arrt), 2) = arrt
End With

 


Set d = Nothing
End Sub 

回复

使用道具 举报

发表于 2010-2-28 20:00 | 显示全部楼层

先把最佳评了,他便给你注释了.^_^
回复

使用道具 举报

发表于 2010-2-28 20:02 | 显示全部楼层    本楼为最佳答案   

arrt数组只有两列,何来arrt(k, 3)

感觉除了用字典,用FIND也是可以的,不过不知道哪一个速度更快

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 04:59 , Processed in 0.359990 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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