3.编写sub过程及开发函数——《Excel VBA 程序开发自学宝典》
3.1 编写sub过程
实例:
Sub 建立10个表()
If sheets.count>=10 then exit sub
Sheets.add , sheets(sheets.count) , 1
Call 建立10个表 ‘过程递归
End sub
Sub 选取统计()
Dim msg as string
Msg = “单元格个数:” & selection.count & chr(10)
Msg = msg & “数字个数:” & worksheetfunction.count(selection) & chr(10)
Msg = msg & “非空单元格:” & worksheetfunction.counta(selection) & chr(10)
Msg = msg & “空白单元格个数:” & worksheetfunction.countblank(selection) & chr(10)
Msg = msg & “选区之和:” & worksheetfunction.sum(selection)
Msgbox msg , 64, “选区统计”
End sub
3.2 关于过程的参数
实例:
Sub 转换(target) ‘首字母转大写
Selection(1) = strconv(target , vbpropercase)
End sub
Private sub worksheet_selectionchange(byval target as range) ‘指定工作表;byval表示该参数按值传递,过程不改变变量本身的值
Call 转换(target(1))
End sub
Sub 姓名(name as string) ‘单参数过程
Dim I as byte , rng as range
For I = 1 to sheets.count
If thisworkbook.sheets(i).name = “许可人员列表” then : goto OK
Next i
Msgbox “不存在“许可人员列表”” , 64
Exit sub
OK:
If len(name)<2 or len(name)>4 then msgbox “长度只能是2到4,请重新输入”,64:
Exit sub
Set rng = thisworkbook.sheets(“许可人员列表”).range(“A1:A10”).find(name)
If rng is nothing then msgbox “你无操作权限” else msgbox “你具有操作权限”
End sub
Sub 确认权限一() ‘手工制定姓名
Call 姓名(application.inputbox(“请输入您的姓名”,”确认权限”,,,,,2))
End sub
Sub 确认权限二() ‘以当前表A1的值进行判断
Call 姓名(activesheet.range(“A1”))
End sub
Sub 确认权限三() ‘以office安装用户名进行判断
Call 姓名(application.username)
End sub
3.3 开发自定义函数
实例:
‘返回有公式的单元格地址
Function FunAdd() '申明函数,无参数
Dim rng as range, cell as range
for each rng in activesheet.usedrange '遍历当前表的已用区域
if rng.hasformula then '如果单元格有公式
if rng.address<>application.thiscell.adress then '如果变量rng的地址不等于当前公式所在单元格的地址,为了防止函数返回的地址包含本公式的单元格
if cell is nothing then '如果变量cell未初始化
set cell=rng '将变量rng赋值给变量cell
else
set cell= application.union(cell,rng) '将变量cell和rng所代表的两个单元格对象合并为一个对象,赋值给cell
end if
end if
end if
next rng
if cell is nothing then FunAdd = "" else FunAdd = cell.address(0,0) '如果变量cell未初始化(即未找到符合条件的单元格)那么返回空文本,否则返回cell的地址
end function
'建立工作表目录
Function 工作表(Optional 序号) As String '有一个参数为可选参数,为该工作表的序号
application.volatile '声明为易失性函数
if ismissing(序号) then 序号=activesheet.index '如果未输入参数,则赋予变量序号为当前表的地址,index属性是指工作表在所有工作表中的序号(从左向右数)
if 序号>sheets.count then '如果参数大于工作表数量
工作表=“”
else
工作表=sheets(序号).name '表名
end if
end function
'将“花生15公斤,黄豆234斤,大米20袋"分列,将品名、数量、单位放在不同单元中
Function Breakdown (rng as range , optional style as byte=1) as string '第一个参数为单元格引用,第二参数表示分列后的第几列
application.volatile
on error resume next '防错
dim i as integer, str as string '将单元格的值以逗号分隔符转换为一维数组,再从数组中取字符串赋值给变量str,取值的位置取决于第二参数
str = split(rng.text,",")(worksheetfunction.roundup(style/3,0)-1) ’split将一个字符串按照”,“为分隔符转换为一个数组
if style mod 3=1 then '如果第二个参数除以3的余数是1
for i=1 to len(str)
if isnumeric(mid(str,i,1)) then exit function '如果遇到数字就结束过程
breakdown= breakdown & mid(str,i,1) '将取出的所有字符串联起来作为函数的返回值
next i
elseif style mod 3=2 then
for i=1 to len(str)
if VBA.isnumeric(mid(str,i,1) or mid(str,i,1)="." then breakdown = breakdown & mid(str,i,1)
next i
elseif style mod 3=0 then
for i=len(str) to 1 step=1
if isnumric(mid(str,i,1)) then exit function
breakdown= mid(str,i,1) & breakdown
next i
end
if err<> then breakdown ="" '如果有错误就返回空白
end function
'中国式排名,需要忽略重复值
Function 排名(区域,成绩) '区域为需要排名的所有成绩,成绩为需要计算排名的该成绩
application.valatile
dim dic as object, rng ,i as integer
set dic=createobject("scripting.dictionary") '声明字典对象变量,特点是成员不重复
for each rng in 区域
if rng = 成绩 then i=1 else if rng>成绩 then dic(rng*1)=1 '如果rng大于成绩,则将rng的值追加到字典中
next
if i>0 then 排名=dic.count+1 else 排名="超出范围"
end function
3.编写sub过程及开发函数——《Excel VBA 程序开发自学宝典》的更多相关文章
- 1.VBA 基本概念——《Excel VBA 程序开发自学宝典》
1.1 常见对象及含义 对象名 含义 application 整个Excel应用程序 window 窗口 worksheet 一个工作表 sheets 指定工作簿的所有工作表的合集 shaperan ...
- 2.深入解析数据类型与变量——《Excel VBA 程序开发自学宝典》
2.1 数据类型 数据类型 所占字节 Byte 1 Boolean 2 Integer 2 Long 4 Single 4 Double 8 Currency 8 Decimal 14 Date 8 ...
- Android开发-API指南-应用程序开发基础
Application Fundamentals 英文原文:http://developer.android.com/guide/components/fundamentals.html 采集(更新) ...
- 微信开发(2)---微信小程序开发实战part1
微信开发现在来说,简单可以概括为两部分,微信公众号和微信小程序. 微信公众号的技术已经非常成熟.分为服务号和订阅号.简单的.可以弄一个个人订阅号,在编辑模式下就可以实现推送图文.自动回复.自定义菜单的 ...
- 开发工具之Spark程序开发详解
一 使用IDEA开发Spark程序 1.打开IDEA的官网地址,地址如下:http://www.jetbrains.com/idea/ 2.点击DOWNLOAD,按照自己的需求下载安装,我们用免费版 ...
- 微信小程序开发2-第一个小程序开发准备
1.首先在官网上注册一个账号( https://mp.weixin.qq.com/ )申请一个AppID(类似于人的身份证,小程序也需要身份证) 注册过程不多说 2.安装开发工具( https://m ...
- [web开发] 利用微信小程序开发上海大学失物招领平台
我从开始学微信小程序到最后完全写完这个小程序耗时四天,可以说开发难度非常之低,门槛也非常低,之前从来没接触过微信小程序,重新写下开发记录. 先放图: 1.前端开发 前端我用到了iview的ui框架,因 ...
- 【小程序开发】微信小程序开发中遇到的那些坑...
第一坑: 设置了三个tabBar,却默认显示第二个,不能展示我的第一个[首页]. "list": [{ "pagePath":"page/KTGJ/i ...
- Excel VBA入门(六)过程和函数
前面讲过,VBA代码有两种组织形式,一种就是过程(前面的示例中都在使用),另一种就是函数.其实过程和函数有很多相同之处,除了使用的关键字不同之外,还有不同的是: 函数有返回值,过程没有 函数可以在Ex ...
随机推荐
- codeforces 933D A Creative Cutout
题目链接 正解:组合数学. 充满套路与细节的一道题.. 首先我们显然要考虑每个点的贡献(我就不信你能把$f$给筛出来 那么对于一个点$(x,y)$,我们设$L=x^{2}+y^{2}$,那么它的贡献就 ...
- 那些不明不白的$符号设计--Sass和Emmet,变量设计原理相通
以前看到php变量的定义,直接使用$符号开始,怎么看都不习惯.后来呀,在使用Emmet的过程中,又接触到了$符号.今天,在学习Sass的过程种,再一次接触到$符号,兴致所致,不由得想写一篇,对比一下搞 ...
- RAC with asm on AIX, ORA-01114 error,with "gipcretAuthFail (22) " in ocssd.log
I/O Errors in Alert log with ORA-29701, with "gipcWait failed with 16" in trace (文档 ID 149 ...
- 【转】Android SDK,ADT,API 版本的对应关系
写对应关系之前,先了解一下几个名字的含义. 一. Android ADT: 按照官方网站的开发介绍:Android Development Tools (ADT) is a plugin for th ...
- A NB群友 【记忆化搜索】(2019年华南理工大学程序设计竞赛(春季赛))
冲鸭!去刷题:https://ac.nowcoder.com/acm/contest/625/A 题目描述 CC是著名的算法竞赛选手,他不仅人长得帅,而且技术了得,自然而然就有了许多粉丝. 为了能帮助 ...
- DevOps 解读
本文为 转载文章, 非原创 DevOps DevOps(Development和Operations的组合词)是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化.运 ...
- Spring源码分析(十八)创建bean
本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 目录 一.创建bean的实例 1. autowireConstructor 2 ...
- 怎么用CIFilter给图片加上各种各样的滤镜_2
上一篇讲了怎么找到能用的的滤镜和大概怎么去寻找... 这里接着说如何详细地给图片加滤镜效果..前的准备工作... . 1. 在找到想用的滤镜名字之后.须要知道这个滤镜究竟须要什么參数. . 例如以下图 ...
- Linux VFS的主要的数据结构
先说明一下,linux内核中各种数据结构也不停的在变,所以不同版本的内核各个数据结构的定义可能会差别很大,这一组关于linux 文件系统的文章中的代码都摘自linux-2.6.34.1. VFS依赖于 ...
- 旧贴-在 win7 / win8 下安装苹果系统 (懒人版)
前言 该文转载自远景论坛,发布时间2012年,仅供学习参考 这篇安装教程的素材在国庆就准备好了,但那时学习任务比较重,没有时间发帖,一直拖到现在.趁这个周末有空,赶紧写完它,希望能帮助一些景友. 论坛 ...