VBA代码求解释,我是新手

下面是从EXCEL论坛上下载的一个模糊查询的代码,我是个完全的VBA新手,求前辈给耐心的解释一下,越详细越好,谢谢。

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$B$2" Then Exit Sub
Dim n&, Arr, i&, j&, y&
Dim Flag As Boolean
[b4:h16].ClearContents
aa = Split(Target.Value)
n = 3
Arr = [B18].CurrentRegion
For i = 2 To UBound(Arr)
Flag = True
x = Join(Application.Index(Arr, i), "")
For y = 0 To UBound(aa)
If InStr(UCase(x), UCase(Trim(aa(y)))) = 0 Then Flag = False: Exit For
Next
If Flag = True Then
n = n + 1
Cells(i + 17, 2).Resize(1, UBound(Arr, 2)).Copy Cells(n, 2)
End If
Next
End Sub

下面是求解释部分

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$B$2" Then Exit Sub
Dim n&, Arr, i&, j&, y&
Dim Flag As Boolean
[b4:h16].ClearContents
aa = Split(Target.Value)
'这里请解释一下:我理解的SPLIT()是一个根据分隔符分离字符串得到一维数组,比如split("我,是,中,国,人“,”,“)会得到一个{我,是,中,国,人}这个一个数组,可是他的这个代码没有分割符,我就想知道,如果我在B2输入 我是中国人 这5个字,运行这句代码会得到什么?

n = 3 ’这里的n=3是什么意思?为什么这个n要从3开始呢?n在这段代码中好像代表的是要复制的那个单元格的行号,或许是我后面代码没看懂,所以这里不知道n为什么要从3开始
Arr = [B18].CurrentRegion (这个我知道,arr是从B18单元格开始往后面的数据区域)
For i = 2 To UBound(Arr) ( 这个请解释一下,主要是 ubond(arr), 如果b18到G30这个区域都有数据,那么ubond(arr)是多少呢?是13*6=78吗?
Flag = True (这句代码明白,但是这个Flag在这里代表什么,有什么用,真心不知道)

x = Join(Application.Index(Arr, i), "") (这句代码的意思是将B18:G30数据区域的第2个数据开始加个空格?比如如果B19单元格是香水A型,那么这个代码运行后就得到 X ={香水A型&”“},可是这个有什么用呢?为什么要加个空格呢?
For y = 0 To UBound(aa) ( 如果我在B2输入我是中国人 5个字,那么这个UBOND(aa) 是多少呢?
If InStr(UCase(x), UCase(Trim(aa(y)))) = 0 Then Flag = False: Exit For
这句应该是关键代码了,但是我很糊涂,trim(aa(y)) 是什么意思呢?如果trim(aa(y))这个字符串没有在X中出现,则flag=fasle,退出代码,请详细的解释下trim(aa(y))。
Next
If Flag = True Then
n = n + 1
Cells(i + 17, 2).Resize(1, UBound(Arr, 2)).Copy Cells(n, 2)
这句也是关键代码,看不懂,求前辈耐心解释。
End If
Next
End Sub
老师们啊,前辈们啊,你们不能老是喝酒泡妞打屁啊,快来传道授业解惑啊。。。。。

1、'这里请解释一下:我理解的SPLIT()是一个根据分隔符分离字符串得到一维数组,比如split("我,是,中,国,人“,”,“)会得到一个{我,是,中,国,人}这个一个数组,可是他的这个代码没有分割符,我就想知道,如果我在B2输入 我是中国人 这5个字,运行这句代码会得到什么?
省略的时候默认是空格“ ”,你举的例子是“,“,因此你输入我是中国人,得到的结果就是AA=我是中国人

2、 n = 3 ’这里的n=3是什么意思?为什么这个n要从3开始呢?n在这段代码中好像代表的是要复制的那个单元格的行号,或许是我后面代码没看懂,所以这里不知道n为什么要从3开始
因为他查找的结果要从B4单元格开始放,因此下面才有一名 n = n + 1

3、 Arr = [B18].CurrentRegion (这个我知道,arr是从B18单元格开始往后面的数据区域)
For i = 2 To UBound(Arr) ( 这个请解释一下,主要是 ubond(arr), 如果b18到G30这个区域都有数据,那么ubond(arr)是多少呢?是13*6=78吗?
UBOUND(ARR)=13 相当于数组最大的行数
UBOUND(ARR,2)=6 相当于数组最大的列数
For i = 2 To UBound(Arr)则是从B19到B30进行循环

4、 Flag = True (这句代码明白,但是这个Flag在这里代表什么,有什么用,真心不知道)
这是为了判断查找结果设置的 ,先假设Flag = True ,如果找到则复制粘贴,找不到就=FALSE
5、 x = Join(Application.Index(Arr, i), "") (这句代码的意思是将B18:G30数据区域的第2个数据开始加个空格?比如如果B19单元格是香水A型,那么这个代码运行后就得到 X ={香水A型&”“},可是这个有什么用呢?为什么要加个空格呢?
这里就是为了SPLIT省略而设计的

6、 For y = 0 To UBound(aa) ( 如果我在B2输入我是中国人 5个字,那么这个UBOND(aa) 是多少呢?
=0,就是一个元素的数组,一维数组下标从0开始。

7、If InStr(UCase(x), UCase(Trim(aa(y)))) = 0 Then Flag = False: Exit For
这句应该是关键代码了,但是我很糊涂,trim(aa(y)) 是什么意思呢?如果trim(aa(y))这个字符串没有在X中出现,则flag=fasle,退出代码,请详细的解释下trim(aa(y))。
TRIM(AA(Y))是去掉空格的函数,将AA(Y)去掉空格

Next
If Flag = True Then
n = n + 1

8、 Cells(i + 17, 2).Resize(1, UBound(Arr, 2)).Copy Cells(n, 2)
这句也是关键代码,看不懂,求前辈耐心解释。
Cells(i + 17, 2).:这里应该是要查找的数据区域是从B19开始吧
Resize(1, UBound(Arr, 2)).Copy,如果查找到这行数据,将这行复制
Cells(n, 2):粘帖到第2列N行,即Bn单元格

End If
Next
End Sub
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-08
1、Split(Target.Value),省略第二个参数表示默认以空格" "作为分隔符号
2、n=3,表示n是开始行号,由于后面有n=n+1这一句,说明n是用来控制复制的内容在粘贴的时候是一行一行粘贴,而不是覆盖粘贴
3、ubond(arr)表示获得数组Arr的数组下标,你可以理解为数组有多少行
4、flag在这里作为控制复制的开关
5、Join(Application.Index(Arr, i), "") 这个表示将数组Application.Index(Arr, i)里面的所有数据合并成一个文本,""这个不是空格,是空,中间没有东西,空格是这个" ",比如:join({a,b,c,d,e},"")表示将数组合并成文本abcde
6、如果我在B2输入我是中国人 5个字,那么这个UBOND(aa) ,因为aa=Split(Target.Value),中间没有空格的话,UBOND(aa)=0
7、trim(aa(y)) 是什么意思呢?trim是一个函数,表示去掉参数两边的空格。
比如:trim(" ab c de ")=ab c de,即去掉" ab c de "两端的空格,而不是中间的空格
所以:trim(aa(y))表示去掉参数aa(y)两边的空格
8、Cells(i + 17, 2).Resize(1, UBound(Arr, 2)).Copy Cells(n, 2)
表示在Cells(i + 17, 2)这个单元格的基础上扩大选取区域
比如:
cells(1,1).resize(1,5)表示在A1单元格增加1-1=0行,5-1=4列的区域,就变成了A1:E1
所以:
Cells(i + 17, 2).Resize(1, UBound(Arr, 2))表示在Cells(i + 17, 2)的基础上增加了0行,UBound(Arr, 2)列的区域
Cells(i + 17, 2).Resize(1, UBound(Arr, 2)).Copy Cells(n, 2)表示复制Cells(i + 17, 2).Resize(1, UBound(Arr, 2))这个区域,并粘贴到Cells(n, 2)本回答被提问者采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网