Excel精英培训网

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

[已解决]EXCELVBA用数组提取符合条件的行数据组成新数组

[复制链接]
发表于 2015-6-12 10:57 | 显示全部楼层 |阅读模式
新手学数组希望高手指导.问题为:
1.如下代码不知道错在哪,请指正?
2.能否改善代码提高效率?
谢谢!
Sub aa()
Dim arr, arr1
Dim i%, j%,s%
arr = Range("a1:e" & [A65536].End(3).Row) '第一行为标题行'
ReDim arr1(1 To UBound(arr), 1 To 5)  '列宽度固定'
For i = 2 To UBound(arr)  '数据区域从第二行开始'
s = 0
For j = 1 To 5
If arr(i, 2) = "X" Then
s = s + 1
arr1(s, j) = arr(i, j)   '错误提示:下标越界,这时的S=0
End If
Next
Next
[g1].Resize(s, 5) = arr1  '错误提示:应用程序定义错误或对象定义错误,这时S=0'
End Sub

最佳答案
2015-6-12 11:40
你循环循环错了吧
这样试试
  1. Sub aa()
  2. Dim arr, arr1
  3. Dim i%, j%, s%

  4. arr = Range("a1:e" & [A65536].End(3).Row) '第一行为标题行'
  5. ReDim arr1(1 To UBound(arr), 1 To 5)
  6. s = 0
  7. For i = 2 To UBound(arr)  '数据区域从第二行开始'
  8. If arr(i, 2) = "X" Then
  9. s = s + 1
  10. For j = 1 To 5
  11. arr1(s, j) = arr(i, j)   '错误提示:下标越界,这时的S=0
  12. Next
  13. End If
  14. Next
  15. [g1].Resize(s, 5) = arr1
  16. End Sub
复制代码
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2015-6-12 11:18 | 显示全部楼层
回复

使用道具 举报

发表于 2015-6-12 11:19 | 显示全部楼层
你自己都指出错误了,你还不知道错在哪里?
回复

使用道具 举报

发表于 2015-6-12 11:19 | 显示全部楼层
Sub aa()
Dim arr, arr1
Dim i%, j%,s%
arr = Range("a1:e" & [A65536].End(3).Row) '第一行为标题行'
ReDim arr1(1 To UBound(arr), 1 To 5)  '列宽度固定'
s = 0
For i = 2 To UBound(arr)  '数据区域从第二行开始'
For j = 1 To 5
If arr(i, 2) = "X" Then
s = s + 1
arr1(s, j) = arr(i, j)   '错误提示:下标越界,这时的S=0
End If
Next
Next
[g1].Resize(s, 5) = arr1  '错误提示:应用程序定义错误或对象定义错误,这时S=0'
End Sub
S=0放到循环外面试试。看看是不是因为这个出错。
回复

使用道具 举报

 楼主| 发表于 2015-6-12 11:30 | 显示全部楼层
hello_cgj 发表于 2015-6-12 11:19
Sub aa()
Dim arr, arr1
Dim i%, j%,s%

这个早已试过,不行.
回复

使用道具 举报

 楼主| 发表于 2015-6-12 11:33 | 显示全部楼层
这是问题的表附件:

条件取行.rar

8.66 KB, 下载次数: 228

回复

使用道具 举报

发表于 2015-6-12 11:34 | 显示全部楼层
if s=0 then exit sub
[g1].Resize(s, 5) = arr1  '错误提示:应用程序定义错误或对象定义错误,这时S=0'
End Sub
回复

使用道具 举报

发表于 2015-6-12 11:35 | 显示全部楼层
E-H-P 发表于 2015-6-12 11:34
if s=0 then exit sub
[g1].Resize(s, 5) = arr1  '错误提示:应用程序定义错误或对象定义错误,这时S=0'
E ...

估计s=0就是没有合适的数据,没有数据就白忙一场 ,直接退出就可以了。
回复

使用道具 举报

发表于 2015-6-12 11:40 | 显示全部楼层    本楼为最佳答案   
你循环循环错了吧
这样试试
  1. Sub aa()
  2. Dim arr, arr1
  3. Dim i%, j%, s%

  4. arr = Range("a1:e" & [A65536].End(3).Row) '第一行为标题行'
  5. ReDim arr1(1 To UBound(arr), 1 To 5)
  6. s = 0
  7. For i = 2 To UBound(arr)  '数据区域从第二行开始'
  8. If arr(i, 2) = "X" Then
  9. s = s + 1
  10. For j = 1 To 5
  11. arr1(s, j) = arr(i, j)   '错误提示:下标越界,这时的S=0
  12. Next
  13. End If
  14. Next
  15. [g1].Resize(s, 5) = arr1
  16. End Sub
复制代码
回复

使用道具 举报

发表于 2015-6-12 11:52 | 显示全部楼层
changrs 发表于 2015-6-12 11:33
这是问题的表附件:

Sub aa()
Dim arr, arr1
Dim i%, j%, s%
arr = Range("a1:e" & [A65536].End(3).Row) '第一行为标题行'
ReDim arr1(1 To UBound(arr), 1 To 5)
s = 1
For i = 2 To UBound(arr)  '数据区域从第二行开始'
   If arr(i, 2) = "X" Then
      For j = 1 To 5
        arr1(s, j) = arr(i, j)   '错误提示:下标越界,这时的S=0
      Next
      s = s + 1
   End If
Next
[g1].Resize(s, 5) = arr1
End Sub

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-31 14:03 , Processed in 0.139068 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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