Excel精英培训网

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

[已解决]请老师解释数组?

[复制链接]
发表于 2013-10-1 10:51 | 显示全部楼层 |阅读模式
本帖最后由 sdfsdfs 于 2013-10-4 21:24 编辑

    arr1 = Range(Cells(6, "p"), Cells(Range("p65536").End(3).Row, "p"))
ReDim Preserve arr2(1 To 1)
arr2(1) = arr1(1, 1)
For i = 2 To UBound(arr1, 1)
   For j = 1 To UBound(arr2)
     If arr1(i, 1) = arr2(j) Then GoTo ppp
     If arr1(i, 1) <> arr2(j) Then GoTo lll
lll:
    Next j
    ReDim Preserve arr2(1 To j)
    arr2(j) = arr1(i, 1)
ppp:
Next i
For i = 1 To UBound(arr2)
   str = str & arr2(i) & "+"
Next i
   
   
最佳答案
2013-10-4 21:12
本帖最后由 yyyydddd8888 于 2013-10-4 21:14 编辑

arr1 = Range(Cells(6, "p"), Cells(Range("p65536").End(3).Row, "p"))    '把p6到p列最后一个单元格中的数据放入数组arr1中。
ReDim Preserve arr2(1 To 1)     '重新定义arr2为一维数组。保留其中的值不变,可以在后面追加值。
arr2(1) = arr1(1, 1)   '把arr1中的第一个值赋给arr2的第一个值。
For i = 2 To UBound(arr1, 1)   'i从2开始每次递增1循环直到arr1的总个数为止。
   For j = 1 To UBound(arr2)    'j从1开始第次递增1循环直到arr2的总个数为止。
     If arr1(i, 1) = arr2(j) Then GoTo ppp   '把arr2中的每一个值与arr1中的第二个值进行比较,如果相等,就运行到ppp:后的语句:next i  ,与arr1中的下一个值进行比较。
     If arr1(i, 1) <> arr2(j) Then GoTo lll    '如果arr1中的第二个值与arr2中的第一个值班不相等,那么运行到lll:后面的语句,即:next j,比较arr2中的下一个值。
lll:       'ppp:   加冒号为一个标记,引导GOTO语句运行到此处。
    Next j
    ReDim Preserve arr2(1 To j)   '如果比较完arr2中所有的值都与arr1中的第i个值不相等,那么就再扩充arr2的第一维的个数从1到下一个j。如果原来arr2中有2个值,现在扩充为3个值。
    arr2(j) = arr1(i, 1)     ’把arr1中这个与arr2中所有值都不相等的值赋值给arr2(j).
ppp:        'ppp:   加冒号为一个标记,引导GOTO语句运行到此处。
Next i      
For i = 1 To UBound(arr2)       ' i从1开始每次递增1循环到arr2的值的总个数为止。
   str = str & arr2(i) & "+"       '把arr2中的每一个值用“+”连接起来赋值给字符串变量 str .
Next i

这一段代码主要功能是去除p6到p列最后一个值中的重复值。并把这些去除重复值后的数据用“+”号连接成一个字符串。


excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-10-1 19:31 | 显示全部楼层
On Error Resume Next不是万能,而是万恶!偶尔用用(如某个名称的sheet是否存在等)还成。
goto同样!
回复

使用道具 举报

 楼主| 发表于 2013-10-2 10:00 | 显示全部楼层
本帖最后由 sdfsdfs 于 2013-10-3 13:40 编辑

什么意思?
回复

使用道具 举报

 楼主| 发表于 2013-10-3 15:56 | 显示全部楼层
解释一下?
回复

使用道具 举报

发表于 2013-10-3 16:19 | 显示全部楼层
设置两个数组,数组arr1为第P列的第6行到最后一行,定义数组arr2为数组arr1
'arr1=单元格区域(单元格集合(6,"p"),单元格集合(单元格区域("p65536").End(3).Row,"p"))
'重定义变量预留的arr2(1到1)
'arr2(1)=arr1(1,1)
'设定变量范围为i=2到UBound(arr1,1)'设定变量范围为j=1到UBound(arr2)'如果 arr1(i,1)=arr2(j) 则执行  跳至 ppp'如果 arr1(i,1)<>arr2(j) 则执行  跳至 lll
             '下一个j'重定义变量预留的arr2(1到j)'arr2(j)=arr1(i,1)
          'ppp:'下一个i'设定变量范围为i=1到UBound(arr2)'str=str & arr2(i) & "+"
       '下一个i
回复

使用道具 举报

发表于 2013-10-4 21:12 | 显示全部楼层    本楼为最佳答案   
本帖最后由 yyyydddd8888 于 2013-10-4 21:14 编辑

arr1 = Range(Cells(6, "p"), Cells(Range("p65536").End(3).Row, "p"))    '把p6到p列最后一个单元格中的数据放入数组arr1中。
ReDim Preserve arr2(1 To 1)     '重新定义arr2为一维数组。保留其中的值不变,可以在后面追加值。
arr2(1) = arr1(1, 1)   '把arr1中的第一个值赋给arr2的第一个值。
For i = 2 To UBound(arr1, 1)   'i从2开始每次递增1循环直到arr1的总个数为止。
   For j = 1 To UBound(arr2)    'j从1开始第次递增1循环直到arr2的总个数为止。
     If arr1(i, 1) = arr2(j) Then GoTo ppp   '把arr2中的每一个值与arr1中的第二个值进行比较,如果相等,就运行到ppp:后的语句:next i  ,与arr1中的下一个值进行比较。
     If arr1(i, 1) <> arr2(j) Then GoTo lll    '如果arr1中的第二个值与arr2中的第一个值班不相等,那么运行到lll:后面的语句,即:next j,比较arr2中的下一个值。
lll:       'ppp:   加冒号为一个标记,引导GOTO语句运行到此处。
    Next j
    ReDim Preserve arr2(1 To j)   '如果比较完arr2中所有的值都与arr1中的第i个值不相等,那么就再扩充arr2的第一维的个数从1到下一个j。如果原来arr2中有2个值,现在扩充为3个值。
    arr2(j) = arr1(i, 1)     ’把arr1中这个与arr2中所有值都不相等的值赋值给arr2(j).
ppp:        'ppp:   加冒号为一个标记,引导GOTO语句运行到此处。
Next i      
For i = 1 To UBound(arr2)       ' i从1开始每次递增1循环到arr2的值的总个数为止。
   str = str & arr2(i) & "+"       '把arr2中的每一个值用“+”连接起来赋值给字符串变量 str .
Next i

这一段代码主要功能是去除p6到p列最后一个值中的重复值。并把这些去除重复值后的数据用“+”号连接成一个字符串。


回复

使用道具 举报

 楼主| 发表于 2013-10-4 21:27 | 显示全部楼层
yyyydddd8888 发表于 2013-10-4 21:12
arr1 = Range(Cells(6, "p"), Cells(Range("p65536").End(3).Row, "p"))    '把p6到p列最后一个单元格中的数 ...

2楼说的是什么意思,On Error Resume和goto是不是尽量不要用,那该用什么?
回复

使用道具 举报

发表于 2013-10-4 21:31 | 显示全部楼层
sdfsdfs 发表于 2013-10-4 21:27
2楼说的是什么意思,On Error Resume和goto是不是尽量不要用,那该用什么?

on error resume next 可以忽略错误继续执行后面的代码,我用起来还没有出现过错误。
GOTO 可以引导程序运行的顺序,只要用得恰当,标志符便于理解,一般也不会出现错误的。
回复

使用道具 举报

发表于 2013-10-4 22:35 | 显示全部楼层
楼主的双重循环部份至少可以改为:
For i = 2 To UBound(arr1, 1)
   For j = 1 To UBound(arr2)
       If arr1(i, 1) = arr2(j) Then GoTo ppp
   Next j
   ReDim Preserve arr2(1 To j)
    arr2(j) = arr1(i, 1)
ppp:
Next i

稍微规范点可改为:
For i = 2 To UBound(arr1)
    For j = 1 To UBound(arr2)
       If arr1(i, 1) = arr2(j) Then Exit For
    Next
    If j > UBound(arr2) Then
       ReDim Preserve arr2(1 To j)
       arr2(j) = arr1(i, 1)
    End If
Next
然而,编程序是将人们处理事务的方法写成命令让电脑来完成。为此,只需要我们将人工处理的方法准确告诉电脑就成了。
楼主的代码,希望的就是将数据用+连接起来赋给变量s,重复的只用一次。试想一下人工是不是可以这样做:看逐一查数据,看在s中存在不,如果没在里面,就加上去,如果在,就不管他。如果对,那么就可以写出这样的代码:
arr1 = Range(Cells(6, "p"), Cells(Range("p65536").End(3).Row, "p"))  '原代码,把数据源写入数组
For i = 1 To UBound(arr1)  '逐一查数组中的每一个数据
   If InStr(S, arr1(i, 1)) < 1 Then S = S & arr1(i, 1) & "+"   '如果没在s中,就加上去
Next i


如果想先写到数组中去,也是可以的,写成:
arr1 = Range(Cells(6, "p"), Cells(Range("p65536").End(3).Row, "p"))   '原代码,把数据源写入数组
ReDim arr2(1 To 1)
arr2(1) = arr1(1, 1)
For i = 1 To UBound(arr1) '逐一查数组中的每一个数据
    For j = 1 To UBound(arr2)  '看他在数组arr2存在不
       If arr1(i, 1) = arr2(j) Then Exit For  '如果存在,就提前结束循环
    Next
    If j > UBound(arr2) Then  ' 如果不是提前结束的循环,说明不存在,则加入到数组arr2中
       ReDim Preserve arr2(1 To j)
       arr2(j) = arr1(i, 1)
    End If
Next
S = Join(arr2, "+")  '无需循环,直接联结在一起

评分

参与人数 2 +4 收起 理由
yyyydddd8888 + 3 很给力!
sdfsdfs + 1

查看全部评分

回复

使用道具 举报

发表于 2013-10-4 22:42 | 显示全部楼层
等等其它形式。只要合理就可以。


goto不是不能用,而是不能乱用。不考虑程序应有的结构随意goto,可能使程序结构混乱、晦涩难懂,这是非常不可取的,需要在基本功上多练习
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 11:12 , Processed in 0.323993 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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