Excel高级应用VBA实验题目解析Word格式.docx
《Excel高级应用VBA实验题目解析Word格式.docx》由会员分享,可在线阅读,更多相关《Excel高级应用VBA实验题目解析Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
2在sheet1上创建“窗体”命令按钮并指定“宏”代码sy22,补充代码完成:
从键盘输入一个整数n,输出如下图形。
其中每个“*”在单元格中水平和垂直方向都要求居中。
n
Subsy22()
DimnAsInteger,iAsInteger,jAsInteger'
第1空
n=InputBox("
输入行数"
)'
从键盘输入数据并存放到变量n
Sheets("
Sheet1"
).Cells.ClearContents'
清除sheet1工作表中单元格的容
Fori=1Ton'
循环打印,输出n行"
*"
Forj=1To2*i-1'
每行输出奇数(2*i-1)个"
,如:
1,3,5个
Cells(i,n-i+j).Value="
Nextj
Nexti
Cells(1,n).Activate'
激活A列N行的单元格
ActiveCell.CurrentRegion.Select'
选定单元格所在的当前区域
.Font.Size=16'
字体大小
.Font.Bold=True'
字体加粗
.HorizontalAlignment=xlCenter'
水平方向居中
.VerticalAlignment=xlCenter'
垂直方向居中
Endsub
Esy03
1.调用EXCEL的RAND和INT部函数,在A列的1—10行输入序号1—10,在B列的1—10行填入0—1之间的随机数,在C列的1—10行填入两位正整数,最后在C列的11行求出该列的最大数(调用MAX函数)。
请参照程序上下文补充完整的语句
Subsy31()
DimkAsInteger
DimaAsString,bAsString,cAsString
Fork=1To10
a="
A"
&
k
b="
B"
c="
C"
Range(a).Value=k'
在A列的1-10行输入序号1-10
Range(b).Value=Rnd()'
在B列的1-10行填入0-1之间的随机数
Range(c).Value=10+Int(90*Rnd())'
在C列的1-10行填入两位正整数
Nextk
Setmyr=Worksheets("
).Range("
C1:
C10"
)
c11"
)=WorksheetFunction.Max(myr)'
在C列的11行求出该列的最大数(调用MAX函数)
Esy04
输入一个字符,判断该字符是字母字符、数字字符还是其他字符,并用Msgbox函数输出结果。
分析:
用IF语句实现
Subpdzi()
DimstrCAsString'
定义变量strC为字符型
strC=InputBox("
请输入字符"
第1空,利用InputBox函数输入字符放到strC中
IfUCase(strC)>
="
AndUCase(strC)<
Z"
Then'
判断输入字符是否为A~Z(其中UCase函数为将字符转换成大写字符的函数)
MsgBox(strC&
"
是字母"
第2空,利用MsgBox函数输出判断结果
ElseIfstrC>
=0AndstrC<
=9Then'
'
第3空,判断输入字符是否为0~9
是数字"
利用MsgBox函数输出判断结果
Else'
第4空
MsgBox("
字符"
strC&
既不是字母,也不是数字"
EndIf
2某学校的职工人事数据存在Excel工作表中。
现要按职称提升每位职工的工资,各种职称的工资增长情况如下:
教授150、副教授130、讲师100、助教80、高级工程师150、工程师140、助工90。
用select语句编写计算增加工资的过程。
Subaddsalary()
r=ActiveCell.Row'
活动单元格为要求得增加工资的单元格,计算活动单元格的行号
t=Cells(r,3)'
第1空,定位“职称”所在的单元格
SelectCaset
Case"
教授"
"
高级工程师"
第2空
ActiveCell=150
副教授"
ActiveCell=130
讲师"
ActiveCell=100
助教"
ActiveCell=80
工程师"
ActiveCell=140
助工"
ActiveCell=90
EndSelect'
第3空,
3:
某教师讲授了一门考查课程,他平时及期末考试都用百分制衡量学生的成绩,设该教师的成绩表如图所示。
学校要求最后的成绩都用等级制。
百分制与等级制的转换规则为:
60分以下为不及格,60~70分为及格,70~80分为中等,80~90分为良,90~100分为优。
编写一个百分制与等级制的转换过程实现成绩的等级转换。
Subchange()
score=ActiveCell.Offset(0,-1).Value'
SelectCasescore
CaseIs>
=90'
ActiveCell="
优"
=80
良"
=70
中"
=60
及格"
CaseElse'
第3空
不及格"
EndSelect
4:
打开Excel工作簿EC404.xls,在A2,B2和C2单元格输入a,b,c的值,单击最大值按钮,在D2显示这三个数的最大值。
解题思路:
假设三个数中的第一个数是最大值,用这个假定的最大值分别跟剩下的两个数比较,如果假定的最大值小于其它两个数,则最大值为较大的那个数。
Submax()
DimaAsDouble,bAsDouble,cAsDouble,maxAsDouble
a=Val(Cells(2,1))
b=Val(Cells(2,2))
c=Val(Cells(2,3))
max=a'
Ifmax<
bThen
max=b'
cThen'
max=c'
Cells(2,4)=max
5:
编写程序:
创建一简单应用程序,单击窗体,利用InputBox函数如(图2)所示显示对话框,设定固定密码就是“password”(注意输入的大小写);
若输入密码正确与否,利用MsgBox函数分别显示如(图3)和(图4)所示来提示用户输入的密码正确与不正确的对话框。
(图2)
(图3)(图4)
提示:
请根据图3和图4中的界面填写第2空和第3空,Msgbox函数的格式为:
Msgbox提示信息,按钮数目及形式,对话框标题
Subpass()
t=InputBox("
请输入密码"
输入密码"
Ift="
password"
MsgBox"
恭喜你,密码正确!
"
0,"
正确"
Else
对不起!
你是非法用户!
vbCritical,"
拒绝"
EndIf
Esy05
实验1:
编写程序,求1+2+3+….+10的和并输出其结果。
该题用For……Next结构实现累加。
Subsum()
Rem求1+2+..+10的和并输出
DimsAsInteger
s=0'
Fori=1To10'
s=s+i'
Nexti
MsgBox("
1+2+3+...+10="
s)'
实验2:
输入任意多个正整数,编写程序求其和与平均值。
当输入数小于0时结束数据的输入。
该题用DoWhile……Loop结构实现累加,While后面需要有控制循环是否继续的条件,请注意While与Until的区别。
Subcomput()
DimsumAsLong'
sum用来保存所输入数的和
DimdataAsInteger
DimkAsInteger'
k为记数器,记录输入数的个数
k=0
data=InputBox("
请输入数据:
DoWhiledata>
=0'
sum=sum+data'
k=k+1'
data=InputBox("
Loop
一共输入了"
k&
个数。
_
&
vbCrLf&
其和为"
sum&
其平均值为:
sum/k
实验3:
编写程序计算SUM=1+1*2+1*2*3+……+1*2*3*…*100的和。
该题用Do……Loop结构实现累积与累加,目标是求100项的累加,而每一项是一个累积式。
Submulti()
DimsumAsDouble
DimiAsInteger
DimtAsDouble
i=1:
t=1:
sum=0
DoWhilei<
=100'
t=t*i'
sum=sum+t'
i=i+1'
Loop
1+1*2+1*2*3+...+1*2*3*...*100="
sum)
实验4:
打开Excel工作簿E504.xls,编写程序,将当前工作表中第1行从指定位置m开始的n个数按相反顺序重新排列。
例如,原数列为:
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20。
从第5个数开始,将10个数进行逆序排列,则得到新数列为:
1,2,3,4,14,13,12,11,10,9,8,7,6,5,15,16,17,18,19,20。
Sub逆置()
i=Cells(6,12)'
起始位置
j=i+Cells(7,12)-1'
第1空,终止位置
j'
t=Cells(1,i)
Cells(1,i)=Cells(1,j)'
Cells(1,j)=t'
i=i+1
j=j-1'
第5空
EndSub
Esy06
打开Excel工作簿E601.xls,编写一个程序,提取字符串中的数字符号。
例如,程序运行后输入字符串abc123edf456gh,则输出“123456”。
Subtq()
s=InputBox("
请输入一个字符串:
输入一个字符串,放在变量s中
n=Len(s)'
第1空,求出s的长度,放在变量n中
Fori=1Ton
a=Mid(s,i,1)'
第2空,求字符串a
Ifa>
=oAnda<
第3空,如果a的值是0到9之间的数字符号,
b=b&
a'
第4空,则把它拼接到结果字符串变量b中
MsgBoxb'
输出结果
打开Excel工作簿E602.xls,工作表第1行有n个升序排列的数值,第2行有m个升序排列的数值,请编写一个程序,将第2行的数据合并到第1行中,并保持所有数据升序排列
Sub合并()
r=Rows
(1).End(xlToRight).Column'
求第一行列数
t=Rows
(2).End(xlToRight).Column'
求第二行列数
Fori=1Tot'
对第二行的每个数据进行处理
a=Cells(2,i):
Cells(2,i)="
取出第二行的一个数据
Fors=rTo1Step-1'
第1空,从后往前扫描
=Cells(1,s)ThenExitFor'
第4空,退出本层循环
Cells(1,s+1)=Cells(1,s)'
第2空,移动数据
Nexts
Cells(1,s+1)=a'
插入数据
r=r+1'
第3空,修改目标数据区长度
Next'
第5空
在“D:
\Esy06”文件夹下打开文件EC603.xls,“求任意区域数值总和”按钮指定到名称为“sumSelection”的宏,补充宏代码,使之完成如下功能:
计算工作表中任意选定区域的数据总和,并用信息提示对话框将结果输出,完成后按原文件名保存在原位置
SubsumSelection()
ForEachxInSelection'
第1空,”For####[1]####InSelection“
s=s+x'
Next
msgbox"
该区域的总和为:
s'
第3空,”msgbox"
####[3]####“
\Esy06”文件夹下打开文件EC604.xls,“从分班”按钮指定到名称为“Student”的宏,补充宏代码,使之完成如下功能:
按顺序(成绩从高到低)对学生进行分班,每个班25名学生,每个班保存在一个新的工作表中。
完成后按原文件名保存在原位置
SubStudent()
n=0
WhileNot(IsEmpty(Cells(n+4,1)))
n=n+1'
第1空
Wend
m=Application.WorksheetFunction.RoundUp((n/25),0)
bs=1
Do
Sheets.Add
ActiveSheet.Name=Str(bs)+"
班"
Cells(1,1)="
英语"
+Str(bs)+"
Cells(2,1)="
学号"
Cells(2,2)="
姓名"
Cells(2,3)="
成绩"
Fori=1To25
Forj=1To3'
第2空
Cells(i+2,j)=Sheets("
sheet1"
).Cells(i+3+(bs-1)*25,j)'
第3空
bs=bs+1'
第4空,####[4]####
LoopWhilebs<
=m'
第5空,####[5]####
Esy07
打开文件E701.xls,“一维数组求极值”按钮指定到名称为“一维数组求极值”的宏,补充宏代码,使之完成如下功能:
输入10个数,将这10个数分别放在第1行的10个单元格中,求出这10个数的最大值和最小值放在相对应的单元格中。
Sub一维数组求极值()
DimE(1To10)AsSingle'
第1空,定义一个名称为E,元素个数为10的一维数组
DimmaxAsSingle,minAsSingle
MsgBox"
输入的10个数据如下:
Fori=1To10'
For语句的作用是先将输入的数据放到数组中,然后再将数组中的数放到对应单元格里
E(i)=InputBox("
Cells(1,i)=i'
max=E
(1):
min=E
(1)
Fori=2To10
E(i)Thenmax=E(i)'
Ifmin>
E(i)Thenmin=E(i)'
Cells(2,2)=max
Cells(3,2)=min
打开文件E702.xls,“一维动态数组的使用”按钮指定到名称为“一维动态数组的使用”的宏,补充宏代码,将整型动态数组X声明为具有20个元素的数组,并给数组的所有元素赋值1。
Sub一维动态数组的使用()
DimX()AsInteger'
第6空
ReDimX(1To20)'
第7空
ForI=1To20
X(I)=1'
第8空
Cells(I,1)=X(I)
NextI
打开文件E703.xls,“统计英语成绩”按钮指定到名称为“统计英语成绩”的宏,补充宏代码,使之完成如下功能:
首先输入该班人数,然后再分别输入该班学生的英语成绩并将英语成绩依次放在第1行,将大于平均值的数据以红色字体显示出来。
Sub统计英语成绩()
DimE()AsSingle
DimnAsInteger
DimsAsSingle,averAsSingle
请输入该班的人数"
ReDimE(n)'
第9空
输入的"
n&
个数据如下:
请输入英语成绩:
Cells(1,i)=E(i)
s=s+E(i)'
第10空
aver=s/n'
第11空
将大于平均值的数据以红色字体显示出来:
Ifaver<
E(i)ThenCells(1,i).Font.ColorIndex=3
Esy08
打开文件E801.xls,“子程序过程求阶乘”按钮指向名称为“子程序过程求阶乘”的宏,首先补充子程序过程Fact的代码,使之完成阶乘计算。
然后,分别用call语句调用Fact过程计算出5的阶乘,用非call语句调用Fact过程计算出8的阶乘。
Subfact(nAsInteger)'
子程序fact求n的阶乘
DimiAsInteger,tAsLong
t=1
MsgBoxn&
的阶乘为:
t'
第2空,输出如下容“n的阶乘为:
t”,当程序运行时n和t都为具体数
Sub子程序过程求阶乘()
Callfact(5)'
第3空,call语句调用Fact过程计算5的阶乘
fact8'
第4空,非call语句调用Fact过程计算8的阶乘
打开文件E802.xls,补充自定义函数“Area”的宏代码,首先判断三条边能否组成三角形,如果能就完成三角形面积的计算(三角形面积=
),如果不能则输出"
这三条边不能组成三角形!
,并在D2:
D8中调用“Area”函数。
Functionarea(x,y,z)
c=(x+y+z)/2
Ifx+y>
zAndy+z>
xAndx+z>
yThen'
第5空,判断三条边能否组成三角形
area=((c-x)*(c-y)*(c-z))^1/2'
area="
EndFunction
打开文件E803.xls,补充宏代码,完成如下功能:
将当前工作表中第1行从指定位置m开始的n个数按相反顺序重新排列。
从第5个数开始,将10个数进行逆序排列