第一篇:vba自定义函数小结
小结:
函数参数前面标记byval,实现的是实参与形参之间的值传递,即形参具有了实参的值或者说建立了一个实参的副本给了形参,这样对形参的操作不会影响实参;
函数参数前面标记byref,实现的是实参与形参之间的引用传递,这样对形参的操作会影响实参,或者说对形参的操作等同于对实参的操作;
在函数内部使用“r=形参”,实现的是把形参的副本给r,在函数中对r操作不会影像形参,如果使用“set r=形参”,那么对r的操作会影响形参,这里实现的效果是r只是形参的一个别名而已,所以对r的操作等同于对形参的操作。
在函数中形参前面不标记byref和byval,默认是引用传递byref,但是这种情况下如果实参是excel中worksheet的range区域,则默认是值传递。
有时调试结果不符合预期,比如值传递,对””r=形参”中的r操作,居然影响形参了,这可能是由于excel一时程序错乱导致,关闭重启就好了。
Public Function tjbcf(rng)
r = rng
'Set r = rng'注意带着set是错误的 k = 0 If UBound(r, 1)> 1 And UBound(r, 2)= 1 Then For i = 1 To UBound(r, 1)f = 0 For j = 1 To i1 If r(1, i)= r(1, j)Then f = 1 Exit For End If Next j If f = 0 And r(1, i)<> “" Then k = k + 1 End If Next i End If
If UBound(r, 1)> 1 And UBound(r, 2)> 1 Then For i = 1 To UBound(r, 1)For j = 1 To UBound(r, 2)If r(i, j)= ”“ Then f = 1 GoTo kk End If f = 0 For m = 1 To i1 If r(i, j)= r(i, n)Then f = 1 GoTo kk End If Next n kk: If f = 0 Then k = k + 1 End If Next j Next i End If
tjbcf = k
End Function
Public Function getnum(str, m)ss = ”“ For i = m To Len(str)If InStr(”0123456789.“, Mid(str, i, 1))<> 0 Then ss = ss & Mid(str, i, 1)Else GoTo kk End If Next i kk: getnum = Val(ss)'注意是val不是value,在sheet中是value函数,在vb中则是val函数 End Function Public Function getnum2(str, m)ss = ”“ f = 0 For i = m To Len(str)If InStr(”0123456789.“, Mid(str, i, 1))<> 0 Then ss = ss & Mid(str, i, 1)Else If f = 1 And ss <> ”“ Then GoTo kk End If f = 1 End If Next i kk: getnum2 = Val(ss)End Function
Public Function NewMmult(a, b)
a1 = a
'把range a的值赋给a1,a是几行几列的range,a1就是 几行几列的数组。注意a1是一个variant数组,即a1中的不同元素可以属性不同,a1中某个元素是字符,另一个可以是整数。
b1 = b
'把range b的值赋给b1 For i = 1 To UBound(a1, 1)
' UBound(a1, 1)指的是数组a1第1维度的大小,即a1的行数 For j = 1 To UBound(a1, 2)
' UBound(a1, 2)指的是数组a1第2维度的大小,即a1的列数 If a1(i, j)= ”“ Then
'判断a1(i,j)是不是空白,如果是,那就赋0值。a1(i, j)= 0 End If Next j Next i
For i = 1 To UBound(b1, 1)For j = 1 To UBound(b1, 2)If b1(i, j)= ”“ Then b1(i, j)= 0 End If Next j Next i
NewMmult = Application.MMult(a1, b1)
End Function
Public Function sim(str1, str2)
If Len(str2)= 0 Then
sim = 0
GoTo kk
End If
sim = 0
For i = 1 To Len(str2)
If InStr(str1, Mid(str2, i, 1))<> 0 Then
sim = sim + 1
End If
Next i
sim = sim / Len(str2)kk: End Function Public Function sima(ByVal str1, ByVal str2)
If Len(str2)= 0 Then
sima = 0
GoTo kk
End If
sima = 0
l = Len(str2)
For i = 1 To Len(str2)
If InStr(str1, Mid(str2, i, 1))<> 0 Then
sima = sima + 1
str1 = Application.WorksheetFunction.Substitute(str1, Mid(str2, i, 1), ”“, 1)
End If
Next i
sima = sima / l kk: End Function
Public Function mcc(rng, rng1, str1, Optional rng2 = ”“, Optional str2, Optional rng3 = ”“, Optional str3, Optional rng4 = ”“, Optional str4, Optional rng5 = ”“, Optional str5)r = rng r1 = rng1 r2 = rng2 r3 = rng3 r4 = rng4 r5 = rng5 mcc = ”“
If Application.CountA(rng2)= 1 Then For i = 1 To UBound(r, 1)
' UBound(a1, 1)指的是数组a1第1维度的大小,即a1的行数 If Application.WorksheetFunction.And(r1(i, 1)= str1)Then mcc = r(i, 1)GoTo kk End If Next i End If
If Application.CountA(rng3)= 1 Then For i = 1 To UBound(r, 1)
' UBound(a1, 1)指的是数组a1第1维度的大小,即a1的行数 If Application.WorksheetFunction.And(r1(i, 1)= str1, r2(i, 1)= str2)Then mcc = r(i, 1)GoTo kk End If Next i End If
If Application.CountA(rng4)= 1 Then For i = 1 To UBound(r, 1)
' UBound(a1, 1)指的是数组a1第1维度的大小,即a1的行数 If Application.WorksheetFunction.And(r1(i, 1)= str1, r2(i, 1)= str2, r3(i, 1)= str3)Then mcc = r(i, 1)GoTo kk End If Next i End If
If Application.CountA(rng5)= 1 Then For i = 1 To UBound(r, 1)
' UBound(a1, 1)指的是数组a1第1维度的大小,即a1的行数 If Application.WorksheetFunction.And(r1(i, 1)= str1, r2(i, 1)= str2, r3(i, 1)= str3, r4(i, 1)= str4)Then mcc = r(i, 1)GoTo kk End If Next i End If
For i = 1 To UBound(r, 1)
' UBound(a1, 1)指的是数组a1第1维度的大小,即a1的行数 If Application.WorksheetFunction.And(r1(i, 1)= str1, r2(i, 1)= str2, r3(i, 1)= str3, r4(i, 1)= str4, r5(i, 1)= str5)Then mcc = r(i, 1)GoTo kk End If Next i
kk: End Function
Public Function mccd(rng, rng1, str1, Optional rng2 = ”“, Optional str2, Optional rng3 = ”“, Optional str3, Optional rng4 = ”“, Optional str4, Optional rng5 = ”“, Optional str5)
r = rng r1 = rng1 r2 = rng2 r3 = rng3 r4 = rng4 r5 = rng5 mccd = ”"
If Application.CountA(rng2)= 1 Then
For i = 1 To UBound(r, 2)
' UBound(a1, 1)指的是数组a1第1维度的大小,即a1的行数 If Application.WorksheetFunction.And(r1(1, i)= str1)Then
mccd = r(1, i)GoTo kk End If Next i End If
If Application.CountA(rng3)= 1 Then For i = 1 To UBound(r, 2)
' UBound(a1, 1)指的是数组a1第1维度的大小,即a1的行数 If Application.WorksheetFunction.And(r1(1, i)= str1, r2(1, i)= str2)Then mccd = r(1, i)GoTo kk End If Next i End If
If Application.CountA(rng4)= 1 Then For i = 1 To UBound(r, 2)
' UBound(a1, 1)指的是数组a1第1维度的大小,即a1的行数 If Application.WorksheetFunction.And(r1(1, i)= str1, r2(1, i)= str2, r3(1, i)= str3)Then mccd = r(1, i)GoTo kk End If Next i End If
If Application.CountA(rng5)= 1 Then For i = 1 To UBound(r, 2)
' UBound(a1, 1)指的是数组a1第1维度的大小,即a1的行数 If Application.WorksheetFunction.And(r1(1, i)= str1, r2(1, i)= str2, r3(1, i)= str3, r4(1, i)= str4)Then mccd = r(1, i)GoTo kk End If Next i End If
For i = 1 To UBound(r, 2)
' UBound(a1, 1)指的是数组a1第1维度的大小,即a1的行数 If Application.WorksheetFunction.And(r1(1, i)= str1, r2(1, i)= str2, r3(1, i)= str3, r4(1, i)= str4, r5(1, i)= str5)Then mccd = r(1, i)GoTo kk End If Next i
kk: End Function
Public Function nsim(str, rng)'r1 = rng 'r2 = rng 'str1 = str 'str2 = str
v = sima(str, r(1, 1))+ sima(r(1, 1), str2)'str1 = str
‘这里不再需要赋值,因为sima设置的是值传递byval,sima调用实参str和r(1,1)不影响实参。'str2 = str k = 1 For i = 2 To UBound(r, 1)m =(sima(str, r(i, 1))+ sima(r(i, 1), str))'str1 = str 'str2 = str If v < m Then k = i v = m End If Next i nsim = r(k, 1)End Function
第二篇:VFP-04-06-变量作用域、自定义函数汇总(定稿)
VFP-04-06变量作用域、自定义函数.doc 8-1 变量作用域、自定义函数
4.5.3 内存变量的作用域
变量的作用域:变量的作范围。程序由模块(主、子程序)组成,模块中有内存变量,内存变量有作用范围。变量的作用域,从定义变量处开始,一直向下。
1.定义全局内存变量
全局变量既可以是单个变量,也可以是数组。分别以下列格式定义。
格式1:Public <内存变量表> 格式2:Public <数组名1>(上界1[,上界2[,...])[,„] 功能:定义全局变量。
①<内存变量表>中既可含普通变量,也可含数组。
②全局变量不会自动释放。只能用release命令显式释放,或退出VFP。③VFP命令窗口中定义的变量,默认为全局变量。④全局数组的每个元素都是全局的。
第116页,例 4.35 主程序中使用子程序中定义的全局变量。*文件名Main.prg set talk off clear clear memory &&清除所有内存变量 I=2 &&默认是私有的 Do ABC ?“主程序中的输出结果:” ?“I=”+str(I,2)+“ J=”+str(J,2)set talk on return *---------------------Procedure ABC public J J=I*8 J=J+5 ?“过程中的输出结果:” ?“I=”+str(I,2)+“ J=”+str(J,2)return 小提示:要检测全局变量,请先clear memory以排除干扰。
2.定义局部内存变量
(1)什么叫局部?
更小的范围就是局部。对于一个模块,更后的部分是局部。对于主程序,子程序是局部。
(2)Private定义局部变量 VFP-04-06变量作用域、自定义函数.doc 8-2 格式1:Private <内存变量表> 格式2:Private <数组名1>(上界1[,上界2[,...])[,„] 功能:定义局部变量。
①未经定义的变量,默认是局部(Private)的。
③无论全局还是局部变量,无初值的,一律自动赋初值.F.。③局部变量作用域的子模块扩展规则
Private变量的作用域,通过调用子模块而扩展到子模块中。
图4-20 Private变量作用域子模块扩展规则
第117页,例 4.36 子程序中的局部变量,在主程序中找不到。R=100 &&默认为Private变量 Do Sub1 &&调用子程序
?P &&主程序中找不到这个变量 Return *-------------------procedure Sub1 P=2*3.14*R &&主程序中的Private变量,子程序中可用 return 3.Private隐藏内存变量的功能
(1)同名变量就近使用规则(原理)
程序中,对于同名的变量,默认使用最近的。因此,①字段变量(因为在当前工作区内)优先于(即隐藏)同名内存变量; 注:什么叫隐藏?就是被遮住,看不见,用不上。
图4-22 字段变量隐藏同名内存变量
例如 use student.dbf use student.dbf VFP-04-06变量作用域、自定义函数.doc 8-3 ?学号 &&结果是字段变量“学号”值,如“960106” 学号=“abcd” &&“=”号赋值,只给内存变量赋值 ?学号 &&结果还是优先使用字段变量
?m.学号 &&特别用“m.”指明内存变量,结果才是“abcd” ②同一模块内,小局部存变量优先于(即隐藏)大局部同名内存变量;
图4-23 Private变量隐藏同模块同名变量
③不同模块中,子模块局部内存变量优先于(即隐藏)主模块同名内存变量。
图4-26 用Private隐隐藏变量
小提示:主程序中的private变量,子程序同样可以用private屏蔽。(3)为什么大范围定义的局部变量,小范围中再定义为全局变量会出错? 因为那样,与Private的隐藏功能相矛盾。
第118页,例 4.37 子程序中的同名局部变量隐藏主程序中同名变量。R=100 &&默认为Private变量 P=10 &&默认为Private变量 Do Sub2 &&调用子程序
?P &&仍是主程序中的值 Return *-------------------procedure Sub2 Private P &&局部变量,主程序中的同名变量被屏蔽 P=2*3.14*R &&主程序中的Private变量,子程序中可用 Return *(5)有没有不通过子程序扩展作用域的变量?
VFP-04-06变量作用域、自定义函数.doc 8-4 有,Local变量,即本地变量。如:Local x,y,z。小提示:采用Local变量,是向C语言靠拢。
4.调用过程时的数据传递
教学提示:VFP的参数传递,过程中默认传址,函数中默认传值。向过程传递数据,有两种方法。
(1)利用Private变量的作用域扩展规则,不传而传
过程中,可以直接使用主程序中的Private变量,不必传。第118页,例 4.38 计算矩形面积。G=8 &&长 K=6 &&宽 mj=0 &&面积 do sub3 ?Mj return *--------------procedure sub3 mj=G*K return(2)在过程第一句用Parameters接收参数
主程序中传出参数格式:Do <过程名> With <实际参数表> 子程序中接收参数格式: Parameters <内存变量表> 说明:
①子程序中,Parameters必须是第一句。Parameters变量是Private变量。②传值:Parameters后的变量与主程序中对应的实际参数无关。
③传引用:Parameters后的变量与主程序中对应的实际参数是同一个变量,名称可能不同而已,同时变化。
④引用隐藏实参规则
子模块中,引用参数隐藏实际参数,是因为引用参数与实际参数是同一个变量,只是在子模块中另取了一个名字(别名)而已。因此,原来的实际参数被隐藏,才不会混乱,包括实际参数是Public变量的情况。
⑤如何决定传值、传地址?由实际参数决定。过程的实际参数默认引用。要传值须实际参数加“()”,或者写成表达式。VFP-04-06变量作用域、自定义函数.doc 8-5
图4-27 传值与传引用
第119页,例 4.39 写程序运行结果。set talk off x=1 y=3 do sub4 with x,(y),5 ?x,y return *----------------Procedure sub4 parameters a,b,c a=a+b+c b=a+b-c return &&答: 9, 3 第120页,例 4.40 利用一个过程计算矩形面积,要求在主程序输出该面积值。set talk off clear input “矩形长:” to L input “矩形宽:” to W S=0 do Area with L,W,S ?“矩形面积:”,S return *--------------Procedure Area Parameters C,K,M M=C*K return
4.5.4 自定义函数 VFP-04-06变量作用域、自定义函数.doc 8-6 1.自定义函数的结构
自定义函数实际上是一个过程,只不过其Return语句后带有表达式,能向主函数返回值。
格式:
Function <函数名> [Parameters <形式参数表>] <语句序列> Return [<表达式>] 说明:
①缺省[<表达式>]返回.T.。
②与过程一样,自定义函数,可以单独以同名程序文件存储,也可以存入过程文件中。
2.自定义函数的调用
小提示:过程中叫实际参数的,函数中叫自变量。格式:[[因变量]=] <函数名>(自变量表)说明:
函数查找规则
调用函数时,先在内部函数中找;找不到再到打开的过程文件中找;再找不到,在当前文件夹中找;再找不到,出错。
①若自定义函数与内部函数同名,将不被找到,用不到。②参数表要与自变量表相对应,包括类型和个数。
③自变量表中,可以是变量,也可以是表达式。自变量默认传值。要传引用,须在自变量前面加“@”,或SET UDFPARMS TO REFERENCE设置默认为传引用。
④函数可以当过程用,调用格式为“do <函数名> with 自变量表”。但要注意,当过程用时,默认传引用,因为过程默认传引用;且放弃返回值。
小提示:自变量默认传值,是向C语言靠拢。小提示:过程默认传引用,函数默认传值。第122页,例 4.41 定义一个函数,将day()日期转成“公元 年 月 日”格式。Y=DA()?Y return *-------------Function DA D=“公元”+LTRIM(STR(YEAR(DATE())))+“年” D=D+LTRIM(STR(MONTH(DATE())))+“月” D=D+LTRIM(STR(DAY(DATE())))+“日” Return D 第122页,例 4.42 用自定义函数计算组合数。VFP-04-06变量作用域、自定义函数.doc 8-7 m!
n!(mn)!y=c(5,3)?y return *-------------------Function FAC &&阶乘factor parameters x f=1 for k=1 to x f=f*k endfor return f *-------------------Function C &&组合数conbination parameters m,n y=int(FAC(m)/(FAC(n)*FAC(m-n)))return y C(m,n)*附加 4.5.5 自定义函数的括号参数格式
“()”在VFP中是间接引用符,有传值之意。
1.自函数的“()式”结构
格式:
Function <函数名>([<参数表>])<语句序列> Return [<表达式>] 说明:这是自定义函数的另一种格式。它只是将Function行和Parameter行合并成一行,其它并无差别;其调用方式也没有区别。
小提示:表单自定义函数不能用括号参数格式,故一般不学、不用。例 自定义函数fun1(x,y,z),分别将其当过程和“()式”函数调用。A=123 B=234 C=“abc” clear do fun1 with A,(B),C &&当过程用,默认传引用,但B传值 ?“A=”,A,“B=”,B,“C=”,C D=fun1(A,@B,@C)&&当函数用,默认传值,但B和C传引用 ?“D=”,D Return *-------------------VFP-04-06变量作用域、自定义函数.doc 8-8 Function fun1(X,Y,Z)x=x+10000 y=y+10000 z=z+“12345” return X+Y
第三篇:小结函数对称性
小 结 函 数 对 称 性
数学组
刘宏博
函数是中学数学教学的主线,是中学数学的核心内容,也是整个高中数学的基础.函数的性质是竞赛和高考的重点与热点,函数的对称性是函数的一个基本性质,对称关系不仅广泛存在于数学问题之中,而且利用对称性往往能更简捷地使问题得到解决,对称关系还充分体现了数学之美.本文拟通过函数自身的对称性和不同函数之间的对称性这两个方面来小结与函数对称有关的性质.一、函数自身的对称性
定理1.函数 y = f(x)的图像关于点A(a ,b)对称的充要条件是
f(x)+ f(2a-x)= 2b 证明:(必要性)设点P(x ,y)是y = f(x)图像上任一点,∵点P(x ,y)关于点A(a ,b)的对称点P‘(2a-x,2b-y)也在y = f(x)图像上,∴ 2b-y = f(2a-x)即y + f(2a-x)=2b故f(x)+ f(2a-x)= 2b,必要性得证.(充分性)设点P(x0,y0)是y = f(x)图像上任一点,则y0 = f(x0)∵ f(x)+ f(2a-x)=2b∴f(x0)+ f(2a-x0)=2b,即2b-y0 = f(2a-x0).故点P‘(2a-x0,2b-y0)也在y = f(x)图像上,而点P与点P‘关于点A(a ,b)对称,充分性得征.推论:函数 y = f(x)的图像关于原点O对称的充要条件是f(x)+ f(-x)= 0 定理2.函数 y = f(x)的图像关于直线x = a对称的充要条件是
f(a +x)= f(a-x)即f(x)= f(2a-x)(证明留给读者)推论:函数 y = f(x)的图像关于y轴对称的充要条件是f(x)= f(-x)定理3.①若函数y = f(x)图像同时关于点A(a ,c)和点B(b ,c)成中心对称(a≠b),则y = f(x)是周期函数,且2| a-b|是其一个周期.②若函数y = f(x)图像同时关于直线x = a 和直线x = b成轴对称(a≠b),则y = f(x)是周期函数,且2| a-b|是其一个周期.③若函数y = f(x)图像既关于点A(a ,c)成中心对称又关于直线x =b成轴对称(a≠b),则y = f(x)是周期函数,且4| a-b|是其一个周期.①②的证明留给读者,以下给出③的证明: ∵函数y = f(x)图像既关于点A(a ,c)成中心对称,∴f(x)+ f(2a-x)=2c,用2b-x代x得: f(2b-x)+ f [2a-(2b-x)] =2c………………(*)又∵函数y = f(x)图像直线x =b成轴对称,∴ f(2b-x)= f(x)代入(*)得:
f(x)= 2c-f [2(a-b)+ x]…………(**),用2(a-b)-x代x得 f [2(a-b)+ x] = 2c-f [4(a-b)+ x]代入(**)得:
f(x)= f [4(a-b)+ x],故y = f(x)是周期函数,且4| a-b|是其一个周期.二、不同函数之间的对称性
定理4.函数y = f(x)与y = 2b-f(2a-x)的图像关于点A(a ,b)成中心对称.定理5.①函数y = f(x)与y = f(2a-x)的图像关于直线x = a成轴对称.②函数y = f(x)与a-x = f(a-y)的图像关于直线x +y = a成轴对称.③函数y = f(x)与x-a = f(y + a)的图像关于直线x-y = a成轴对称.定理4与定理5中的①②证明留给读者,现证定理5中的③
设点P(x0 ,y0)是y = f(x)图像上任一点,则y0 = f(x0)。记点P(x ,y)关于直线x-y = a的轴对称点为P‘(x1,y1),则x1 = a + y0 , y1 = x0-a,∴x0 = a + y1 , y0= x1-a 代入y0 = f(x0)之中得x1-a = f(a + y1)∴点P‘(x1,y1)在函数x-a = f(y + a)的图像上.同理可证:函数x-a = f(y + a)的图像上任一点关于直线x-y = a的轴对称点也在函数y = f(x)的图像上。故定理5中的③成立.推论:函数y = f(x)的图像与x = f(y)的图像关于直线x = y 成轴对称.三、函数对称性应用举例 例1:定义在R上的非常数函数满足:f(10+x)为偶函数,且f(5-x)= f(5+x),则f(x)一定是()
(B)是偶函数,但不是周期函数
(D)是奇函数,但不是周期函数(A)是偶函数,也是周期函数(C)是奇函数,也是周期函数
解:∵f(10+x)为偶函数,∴f(10+x)= f(10-x).∴f(x)有两条对称轴 x = 5与x =10,因此f(x)是以10为其一个周期的周期函数,∴x =0即y轴也是f(x)的对称轴,因此f(x)还是一个偶函数.故选(A)
例2.设f(x)是定义在R上的偶函数,且f(1+x)= f(1-x),当-1≤x≤0时,f(x)= -1x,则f(8.6)= _________
2解:∵f(x)是定义在R上的偶函数∴x = 0是y = f(x)对称轴;
又∵f(1+x)= f(1-x)∴x = 1也是y = f(x)对称轴。故y = f(x)是以2为周期的周期函数,∴f(8.6)= f(8+0.6)= f(0.6)= f(-0.6)= 0.3 例3.设f(x)是定义在R上的奇函数,且f(x+2)= -f(x),当0≤x≤1时,f(x)= x,则f(7.5)=()
(A)
0.5(B)-0.5
(C)1.5
(D)-1.5 解:∵y = f(x)是定义在R上的奇函数,∴点(0,0)是其对称中心;
又∵f(x+2)= -f(x)= f(-x),即f(1+ x)= f(1-x),∴直线x = 1是y = f(x)对称轴,故y = f(x)是周期为2的周期函数.∴f(7.5)= f(8-0.5)= f(-0.5)= -f(0.5)=-0.5 故选(B)
第四篇:vba单元格区域引用方式的小结
vba单元格区域引用方式的小结
在使用ExcelVBA进行编程时,我们通常需要频繁地引用单元格区域,然后再使用相应的属性和方法对区域进行操作。所谓单元格区域,指的是单个的单元格、或者是由多个单元格组成的区域、或者是整行、整列等。下面,我们设定一些情形,以问答的形式对引用单元格区域的方式进行归纳。------------------问题一:在VBA代码中,如何引用当前工作表中的单个单元格(例如引用单元格C3)? 回答:可以使用下面列举的任一方式对当前工作表中的单元格(C3)进行引用。(1)Range(“C3”)(2)[C3](3)Cells(3, 3)(4)Cells(3, “C”)(5)Range(“C4”).Offset(-1)Range(“D3”).Offset(,-1)Range(“A1”).Offset(2, 2)(6)若C3为当前单元格,则可使用:ActiveCell(7)若将C3单元格命名为“Range1”,则可使用:Range(“Range1”)或[Range1](8)Cells(4, 3).Offset(-1)(9)Range(“A1”).Range(“C3”)------------------问题二:在VBA代码中,我要引用当前工作表中的B2:D6单元格区域,有哪些方式? 回答:可以使用下面列举的任一方式对当前工作表中单元格区域B2:D6进行引用。(1)Range(“B2:D6”)(2)Range(“B2”, “D6”)(3)[B2:D6](4)Range(Range(“B2”), Range(“D6”))(5)Range(Cells(2, 2), Cells(6, 4))(6)若将B2:D6区域命名为“MyRange”,则又可以使用下面的语句引用该区域: ① Range(“MyRange”)② [MyRange]
(7)Range(“B2”).Resize(5, 3)(8)Range(“A1:C5”).Offset(1, 1)(9)若单元格B2为当前单元格,则可使用语句:Range(ActiveCell, ActiveCell.Offset(4, 2))(10)若单元格D6为当前单元格,则可使用语句:Range(“B2”, ActiveCell)------------------问题三:在VBA代码中,如何使用变量实现对当前工作表中不确定单元格区域的引用?
回答:有时,我们需要在代码中依次获取工作表中特定区域内的单元格,这通常可以采取下面的几种方式:
(1)Range(“A” & i)
(2)Range(“A” & i & “:C” & i)(3)Cells(i,1)(4)Cells(i,j)其中,i、j为变量,在循环语句中指定i和j的范围后,依次获取相应单元格。------------------问题四:在VBA代码中,如何扩展引用当前工作表中的单元格区域? 回答:可以使用Resize属性,例如:
(1)ActiveCell.Resize(4, 4),表示自当前单元格开始创建一个4行4列的区域。(2)Range(“B2”).Resize(2, 2),表示创建B2:C3单元格区域。(3)Range(“B2”).Resize(2),表示创建B2:B3单元格区域。(4)Range(“B2”).Resize(, 2),表示创建B2:C2单元格区域。
如果是在一个单元格区域(如B3:E6),或一个命名区域中(如将单元格区域B3:E6命名为“MyRange”)使用Resize属性,则只是相对于单元格区域左上角单元格扩展区域,例如:
代码Range(“C3:E6”).Resize(, 2),表示单元格区域C3:D6,并且扩展的单元格区域可不在原单元格区域内。
因此,可以知道Resize属性是相对于当前活动单元格或某单元格区域中左上角单元格按指定的行数或列数扩展单元格区域。
------------------问题五:在VBA代码中,如何在当前工作表中基于当前单元格区域或指定单元格区域处理其它单元格区域?
回答:可以使用Offset属性,例如:
(1)Range(“A1”).Offset(2, 2),表示单元格C3。
(2)ActiveCell.Offset(, 1),表示当前单元格下一列的单元格。(3)ActiveCell.Offset(1),表示当前单元格下一行的单元格。
(4)Range(“C3:D5”).Offset(, 1),表示单元格区域D3:E5,即将整个区域偏移一列。
从上面的代码示例可知,Offset属性从所指定的单元格开始按指定的行数和列数偏移,从而到达目的单元格,但偏移的行数和列数不包括指定单元格本身。
------------------问题六:在VBA代码中,如何在当前工作表中引用交叉区域? 回答:可以使用Intersect方法,例如:
Intersect(Range(“C3:E6”), Range(“D5:F8”)),表示单元格区域D5:E6,即单元格区域C3:E6与D5:F8相重迭的区域。
------------------问题七:在VBA代码中,如何在当前工作表中引用多个区域? 回答:
(1)可以使用Union方法,例如:
Union(Range(“C3:D4”), Range(“E5:F6”)),表示单元格区域C3:D4和E5:F6所组成的区域。Union方法可以将多个非连续区域连接起来成为一个区域,从而可以实现对多个非连续区域一起进行操作。
(2)也可以使用下面的代码:
Range(“C3:D4, E5:F6”)或[C3:D4, E5:F6] 注意:Range(“C3:D4”, “F5:G6”),表示单元格区域C3:G6,即将两个区域以第一个区域左上角单元格为起点,以第二个区域右下角单元格为终点连接成一个新区域。
同时,在引用区域后使用Rows属性和Columns属性时,注意下面代码的区别: ①Range(“C3:D4”, “F8:G10”).Rows.Count,返回的值为8;
②Range(“C3:D4,F8:G10”).Rows.Count,返回的值为2,即只计算第一个单元格区域。------------------问题八:在VBA代码中,如何引用当前工作表中活动单元格或指定单元格所在的区域(当前区域)? 回答:可以使用CurrentRegion属性,例如:
(1)ActiveCell.CurrentRegion,表示活动单元格所在的当前区域。(2)Range(“D5”).CurrentRegion,表示单元格D5所在的当前区域。
当前区域是指周围由空行或空列所围成的区域。该属性的详细使用参见《CurrentRegion属性示例》一文。[NextPage]------------------问题九:在VBA代码中,如何引用当前工作表中已使用的区域? 回答:可以使用UsedRange属性,例如:
(1)Activesheet.UsedRange,表示当前工作表中已使用的区域。
(2)Worksheets(“sheet1”).UsedRange,表示工作表sheet1中已使用的区域。
与CurrentRegion属性不同的是,该属性代表工作表中已使用的单元格区域,包括显示为空行,但已进行过格式的单元格区域。该属性的详细使用参见《解析UsedRange属性》一文。
------------------问题十:如何在单元格区域内指定特定的单元格? 回答:可以使用Item属性,例如:
(1)Range(“A1:B10”).Item(5,3)指定单元格C5,这个单元格处于以区域中左上角单元格A1(即区域中第1行第1列的单元格)为起点的第5行第3列。因为Item属性为默认属性,因此也可以简写为:Range(“A1:B10”)(5,3)。
如果将A1:B10区域命名为”MyRange”,那么Range(“MyRange”)(5,3)也指定单元格C5。
(2)Range(“A1:B10”)(12,13)指定单元格M12,即用这种方式引用单元格,该单元格不必一定要包含在区域内。
同时,也不需要索引数值是正值,例如: ① Range(“D4:F6”)(0,0)代表单元格C3; ② Range(“D4:F6”)(-1,-2)代表单元格A2。而Range(“D4:F6”)(1,1)代表单元格D4。(3)也可以在单元格区域中循环,例如:
Range(“D4:F6”)(2,2)(3,4)代表单元格H7,即该单元格位于作为左上角单元格E5的第3行第4列(因为E5是开始于区域中左上角单元格D4起的第2行第2列)。
(4)也能使用一个单个的索引数值进行引用。计数方式为从左向右,即在区域中的第一行开始从左向右计数,第一行结束后,然后从第二行开始从左到右接着计数,依次类推。(注:从区域中第一行第一个单元格开始计数,当第一行结束时,转入第二行最左边的单元格,这样按一行一行从左向右依次计数。以单元格区域中第1个单元格开始,按上述规则依次为第2个单元格、第3个单元格„.等等),例如:
Range(“A1:B2”)(1)代表单元格A1; Range(“A1:B2”)(2)代表单元格B1; Range(“A1:B2”)(3)代表单元格A2; Range(“A1:B2”)(4)代表单元格B2。
这种方法可在工作表中连续向下引用单元格(即不一定是在单元格区域内,但在遵循相同的规律),例如:
Range(“A1:B2”)(5)代表单元格A3; Range(“A1:B2”)(14)代表单元格B7,等等。也可以使用单个的负数索引值。这种使用单个索引值的方法对遍历列是有用的,例如,Range(“D4”)(1)代表单元格D4,Range(“D4”)(2)代表单元格D5,Range(“D4”)(11)代表单元格D14,等等。同理,稍作调整后也可遍历行,例如:
Range(“D4”).Columns(2)代表单元格E4,Range(“D4”).Columns(5)指定单元格H4,等等。(5)当与对象变量配合使用时,Item属性能提供简洁并有效的代码,例如: Set rng = Worksheets(1).[a1] 定义了对象变量后,像单元格方法一样,Item属性允许使用两个索引数值引用工作表中的任一单元格,例如,rng(3,4)指定单元格D3。(By Chip Pearson)------------------问题十一:在VBA代码中,如何引用当前工作表中的整行或整列? 回答:见下面的示例代码:
(1)Range(“C:C”).Select,表示选择C列。Range(“C:E”).Select,表示选择C列至E列。(2)Range(“1:1”).Select,表示选择第一行。Range(“1:3”).Select,表示选择第1行至第3行。(3)Range(“C:C”).EntireColumn,表示C列; Range(“D1”).EntireColumn,表示D列。
同样的方式,也可以选择整行,然后可以使用如AutoFit方法对整列或整行进行调整。------------------问题十二:在VBA代码中,如何引用当前工作表中的所有单元格? 回答:可以使用下面的代码:
(1)Cells,表示当前工作表中的所有单元格。
(2)Range(Cells(1, 1), Cells(Cells.Rows.Count, Cells.Columns.Count)),其中Cells.Rows表示工作表所有行,Cells.Columns表示工作表所有列。
------------------问题十三:在VBA代码中,如何引用工作表中的特定单元格区域?
回答:在工作表中,您可能使用过“定位条件”对话框。可以通过选择菜单“编辑——定位”,单击“定位”对话框中的“定位条件”按钮显示该对话框。这个对话框可以允许用户选择特定的单元格。例如:
(1)Worksheets(“sheet1”).Cells.SpecialCells(xlCellTypeAllFormatConditions),表示工作表sheet1中由带有条件格式的单元格所组成的区域。
(2)ActiveCell.CurrentRegion.SpecialCells(xlCellTypeBlanks),表示当前工作表中活动单元格所在区域中所有空白单元格所组成的区域。
当然,还有很多常量和值的组合,可以让您实现特定单元格的查找并引用。参见《探讨在工作表中找到最后一行》一文。
------------------问题十四:在VBA代码中,如何引用其它工作表或其它工作簿中的单元格区域?
回答:要引用其它工作表或其它工作簿中的单元格区域,只需在单元格对象前加上相应的引用对象即可,例如:
(1)Worksheets(“Sheet3”).Range(“C3:D5”),表示引用工作表sheet3中的单元格区域C3:D5。(2)Workbooks(“MyBook.xls”).Worksheets(“sheet1”).Range(“B2”),表示引用MyBook工作簿中工作表Sheet1上的单元格B2。
------------------问题十五:还有其它的一些情形吗? 回答:列举如下:
(1)Cells(15),表示单元格O1,即可在Cells属性中指定单元格数字来选择单元格,其计数顺序为自左至右、从上到下,又如Cells(257),表示单元格B1。
(2)Cells(, 256),表示单元格IV1,但是如果Cells(, 257),则会返回错误。
------------------结语
我们用VBA对Excel进行处理,一般是对其工作表中的数据进行处理,因此,引用单元格区域是ExcelVBA编程中最基本的操作之一,只有确定了所处理的单元格区域,才能使用相应的属性和方法进行下一步的操作。
上面列举了一些引用单元格区域的情形和方式,可以看出,引用单元格区域有很多方式,有一些可能不常用,可以根据工作表的所处的环境和个人编程习惯进行选择使用。
当然,在编写程序时,也可能会将上面的一些属性联合使用,以达到选取特定操作对象的目的,例如Offset属性、Resize属性、CurrentRegion属性、UsedRange属性等的组合。文章标签: ExcelVBA引用单元格
第五篇:第5章 视图、存储过程和用户自定义函数复习题范文
第5章 视图、存储过程和用户自定函数
1.什么是基本表?什么是视图?两者的区别和联系是什么?
答:
基本表是本身独立存在的表,在 sQL 中一个关系就对应一个表。视图是从一个或几个基本表导出的表。视图本身不独立存储在数据库中,是一个虚表。即数据库中只存放视图的定义而不存放视图对应的数据,这些数据仍存放在导出视图的基本表中。视图在概念上与基本表等同,用户可以如同基本表那样使用视图,可以在视图上再定义视图。.试述视图的优点。
答
(l)视图能够简化用户的操作;(2)视图使用户能以多种角度看待同一数据;(3)视图对重构数据库提供了一定程度的逻辑独立性;(4)视图能够对机密数据提供安全保护。.所有的视图是否都可以更新?为什么?
答:
不是。视图是不实际存储数据的虚表,因此对视图的更新,最终要转换为对基本表的更新。因为有些视图的更新不能惟一有意义地转换成对相应基本表的更新,所以,并不是所有的视图都是可更新的.4 .哪类视图是可以更新的?哪类视图是不可更新的?各举一例说明。
答:基本表的行列子集视图一般是可更新的。若视图的属性来自集函数、表达式,则该视图肯定是不可以更新的。
5.教材P89习题1-5。