vba自定义函数小结

vba自定义函数小结
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 i - 1

If r(i, 1) = r(j, 1) Then

f = 1

Exit For

End If

Next j

If f = 0 And r(i, 1) <> "" 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, 2)

f = 0

For j = 1 To i - 1

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 i - 1

For n = 1 To UBound(r, 2)

If r(i, j) = r(m, n) Then

f = 1

GoTo kk

End If

Next n

Next m

For n = 1 To j - 1

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

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)

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

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)

r = 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

v = m

End If

Next i

nsim = r(k, 1) End Function

excel利用vba定义函数的教程全解

excel利用vba定义函数的教程全解 用vba定义函数步骤1:例:下面表格中需要计算一些三角形的 面积 用vba定义函数步骤2:B列是底边长,C列是高,要求在D列 通过公式计算三角形面积。 (通常我们会在D3单元格用公式=B3*C3/2来计算,然后把这个 公式向D列下方拖动复制,得到其他公式。这只是一个简单的例子,通过它来学习编写简单的自定义函数) 用vba定义函数步骤3:打开VBA窗口 按ALT+F11调出VBA窗口,插入一个用户模块。 用vba定义函数步骤4:编写代码 把下面这个自定义函数代码粘贴到刚插入的用户模块中就可以使用了。 Functionsjxmj(di,gao) sjxmj=di*gao/2 EndFunction 这段代码非常简单只有三行,先看第一行,其中sjxmj是自己取的函数名字,括号中的是参数,也就是变量,di表示“底边长”,gao表示“高”,两个参数用逗号隔开。 再看第二行,这是计算过程,将di*gao/2这个公式赋值给sjxmj,即自定义函数的名字。 用vba定义函数步骤5:使用自定义函数 用vba定义函数步骤6:通过上面例子可以了解自定义函数的编 写和使用方法,下面再介绍一个稍微复杂点的自定义函数。

经常对数据进行处理的朋友可以会遇到多条件查找某一个数据,一般这种情况需要编写“数组公式”来解决,公式较长,也不易理解。 比如下面统计成绩的表格,需要根据A1:D7的成绩表,统计出两门功能都在90分以上的学生人数。 大家可以看到在H3单元格中的公式比较长,理解起来也有一定难度。 我们通过自定义函数也可以得到正确结果,函数代码如下: Function统计(a,b,c,d,e) Fori=1Toa.Rows.Count Ifb=a.Cells(i,1)Anda.Cells(i,c)>=eAnda.Cells(i,d)>=eThen 统计=统计+1 EndIf Next EndFunction 这个函数用了五个参数(因为涉及到一个区域和四个条件) 参数a表示要统计的区域,在此例中为B2:E7 参数b表示要统计的是哪一个班级,在此例中为G3单元格 参数d表示数学成绩相对于区域第一列向右的列数,在此例中为4 参数e表示分数,在此例中为90分 提示:要注意参数c和d“相对”于“区域”的列数,并非是从A列开始向右的列数。 把上面这段代码也粘贴到用户模块中就可以使用了

EXCEL VBA 新个人所得税税率自定义函数IN_TAX()及用法

Excel VBA新个人所得税税率自定义函数in_tax()及用法1、VBA代码 Public Function in_tax(in_month As Single)As Single Dim sl As Single,kcs As Single,ynse As Single'定义税率sl,扣除数kcs,应纳税额ynse变量 ynse=in_month-3500 Select Case ynse Case0To1500'如果应纳税额<=1500,税率3%,速算扣除数0。 sl=0.03 kcs=0 Case1501To4500'如果应纳税额(1500,4500],税率10%,速算扣除数105。 sl=0.1 kcs=105 Case4501To9000'如果应纳税额(4500,9000],税率20%,速算扣除数555。 sl=0.2 kcs=555 Case9001To35000'如果应纳税额(9000,35000],税率25%,速算扣除数1005。 sl=0.25

kcs=1005 Case35001To55000'如果应纳税额(35000,55000],税率30%,速算扣除数2755。 sl=0.3 kcs=2755 Case55001To80000'如果应纳税额(55000,80000],税率35%,速算扣除数5505。 sl=0.35 kcs=5505 Case Else'如果应纳税额>80000,税率45%,速算扣除数13505。 sl=0.45 kcs=13505 End Select If ynse<=0Then in_tax=0 Else in_tax=Round(ynse*sl-kcs,2) End If End Function 2、使用方法

史上最全面的计算简体繁体汉字笔画的VBA自定义函数及汉字笔画字库

Function char_wordnum(my_char_word) '史上最权威最全面的计算简体繁体汉字笔画的VBA自定义函数及汉字笔画字库 'from bdQuaker 20140619 '笔画数据库来自在线新华字典 https://www.360docs.net/doc/b28640289.html, 'VBA中一条语句内的换行符号,不能超过25个。 '函数功能:对输入的汉字,返回其笔画的数量。 Dim char_wordtable(31), wordnum_i, wordnum_j, wordnum_k, temp_wordnum temp_wordnum = "" If my_char_word = "" Then char_wordnum = 0 Exit Function End If char_wordtable(0) = "" char_wordtable(1) = "" char_wordtable(2) = " " char_wordtable(3) = " 亏马亇么门宀万卄女丬丌乞千犭刃刄三山彡上勺饣士尸扌氵巳纟" + _ "夊土乇丸亾兦亡尢囗卫?兀习夕下乡小忄彐卂劜丫幺也弋亿已义于亐与丈夂之子" char_wordtable(4) = "卬夭仈巴办勽贝币比卞仌不仓长尺车丑丒仇刅从亣歹丹邓弔订仃斗队仒厄乏反方分凤 " + _ " " + _ "闩双水亖太天邒厅圡屯屲瓦卐卍罓尣王韦厃为文毋勿午五乌兮心匂凶牙圠爻辷忆刈艺以弌冘引尹尤友肀予元円月曰匀云勻允帀扎兂仄仉爫爪止支中专卆" char_wordtable(5) = "艾屵凹叐叭扒白半包北本夯必弁边丙氷仢癶布卟仺册冊仧仩仦斥叱叺刍処出处丛匆刌打代歺旦石氹辺忉叨氐电叼汈鸟饤忊艼奵帄叮东冬乧叾对戹弍尓尔尒发犯氾払" + _ "冯弗付玍尕轧匃匄仠甘冮夰乬巪仡功句古冎叧瓜叏丱広宄氿归扖邗汉厈号禾仜弘讧乎囘卉屶屷汇伋记饥刉击叽甲加戋匞叫艽讦节钅丼冋匛旧纠凥且卡冚刊尻厼可叩" + _ "凷圦邝兰艻叻扐氻忇乐立厉屴礼辽另令龙卢圥劢邙矛夘卯们汅灭民皿末仫目母奶艿疒尼囜宁奴汃皮庀丕氕平叵圤扑讫邔刋阡仟巧邛卭芁叴犰扏囚玌丘去厺犮冉让讱" + _ "仞仭辸扔宂邚仨壭讪闪邖叶申圣生辻仕世丗示市史矢失朮术帅甩氺四丝司玊亗他它夳冭台叹讨夲朰田芀圢庁汀仝头凸阤仛讬外罒未戊阢务卌邜仚仙屳写阠兄玄穴廵" + _ "讯训疋圧央业凧匇匜仪肊议阣衤印囙用永由甴幼右邘驭玉込夗戉曱孕匝仔庂汄札乍占仗召厇氶正卮汁只主左" char_wordtable(6) = "吖阨伌安犴仰朳玐百阪邦闭毕朼夶邠冰并伧艸奼汊扱扠犲芆忏产辿伥场仯伡尘臣丞成朾弛池驰伬吃充冲虫岀汌舛传闯创朿次此汆伜存忖邨达汏刐伔凼圵当乭导氘朷" + _

“四舍六入五单双”利用VBA自定义函数解决

利用VBA自定义函数解决 业务研究加入时间:2007-3-9 20:42:35 点击:504 Microsoft Office套装办公软件是大家十分熟悉的办公软件,在工作中经常使用。但在水文工作中,仍然感觉到有很不方便的时候!比如,水文行业广泛使用的“四舍六入五单双”,就很难用Microsoft Office中的内部函数进行处理。但是与Microsoft Office套装办公软件绑定的VBA(Visual Basic For Application)语言提供了强大的二次开发功能,笔者以Excel为例,用它来解决上面所提到的问题,就非常容易了。 一、水文及水质资料使用的“四舍六入五单双”,执行《数值修约规范》(GB8170-87)1.拟舍弃数字的最左一位数字小于5时,则舍去,即保留的各位数字不变。 2.拟舍弃数字的最左一位数字大于5时;或者是5,而其后跟有并非全部为0的数字时,则进一,即保留的末位数字加1。 3. 拟舍弃数字的最左一位数字为5,而后面无数字或皆为0时,若所保留的末位数字为奇数(1,3,5,7,9)则进一,为偶数(2,4,6,8)则舍弃。 二、初识VBAIDE 打开Excel,按Alt+F11即进入VBAIDE,在菜单上依次点击[插入]->[模块],然后输入如下代码: ' “四舍六入五单双”自定义函数 ' 函数形式 Round5(x,mm),返回值Round5为 Double 型 ' X为操作数值,mm为保留小数位数 ' mm为 Integer 型,mm = 0 表示取整数 Private Function round5(X As Double, mm As Integer) As Double Dim Temp1, Temp2 As String Temp1 = 1 If mm < 0 Then Temp1 = 10 ^ Abs(mm) X = X / Temp1 mm = 0 End If If ((Int((Abs(X) - Int(Abs(X))) * 10 ^ mm) Mod 2) = 0 And (Abs(X) * 10 ^ mm - Int(Abs(X) * 10 ^ mm)) <= 0.5) And X <> Val(Round(Abs(X), mm) * Sgn(X)) Then round5 = Val((Round(Abs(X) - 10 ^ (-mm) / 5, mm))) Else round5 = Val(Round(Abs(X), mm)) End If round5 = Val( round5 * Sgn(X) * Temp1) End Function 以上程序是在“取绝对值(Abs)”、“取整(Int)”、“四舍五入(Round)”等系统内部函数的基础上完成的,函数的型式及其每个参数需要用户在属性设置中定义和声明,故叫做自定义函数。以上定义“四舍六入五单双”的函数名为Round5,定义成功后便可在Excel 中象系统函数那样引用了,例如对编辑完后按Alt+Q即返回Excel,再在某一单元格输入“= Round5(A1,3)”(A1既可以是单元格,也可以是输入的数值),回车结果就出来了。如果出现

excel中161个VBA_自定义函数(超级实用)(精)

目录 '1.函数作用:返回 Column 英文字 (9) '2.函数作用:查询某一值第num 次出现的值................9 '3.函数作用:返回当个人工资薪金所得为2000元(起征点为850元时的应纳个人所得税税额.............................10 '4.函数作用:从形如"123545ABCDE"的字符串中取出数字....11 '5.函数作用:从形如"ABCD12455EDF"的字符串中取出数字...11 '6.函数作用:按SplitType 取得RangeName 串值中的起始位置12 '7.函数作用:将金额数字转成中文大写....................13 '8.函数作用:计算某种税金..............................18 '9.函数作用:人民币大、小写转换........................19 '10.函数作用:查汉字区位码.............................20 '11.函数作用:把公元年转为农历.........................21 '12.函数作用:返回指定列数的列标.......................42 '13.函数作用:用指定字符替换某字符.....................43 '14.函数作用:从右边开始查找指定字符在字符串中的位置...43 '15.函数作用:从右边开始查找指定字符在字符串中的位置...44 '16.函数作用:计算工龄.................................44 '17.函数作用:计算日期差,除去星期六、星期日.. (45) '18.函数作用:将英文字反转的自定函数 (46) '19.函数作用:计算个人所得税...........................46 '20.函数作用:一个能计算是否有重复单元的函数...........47 '21.数字金额转中文大写................................48 '22.函数 作用:将数字转成英文...........................49 '23.函数作用:人民币大小写转换.........................52 '24.函数作用:获取区域颜色值...........................53 '25.函数作用:获取活动工作表名.........................53 '26.函数作用:获取最后一行行数. (54) '27.函数作用:判断是否连接在线.........................54 '28.函数作用:币种转换.................................54 '29.函数作用:检验工作表是否有可打印内容...............55 '30. 函数作用:查找一字符串(withinstr在另一字符串中(findstr1中某一次(startnum出现 时的位置,返回零表示没找到。..................................................57 '31.函数作用:增加文件路径最后的“\”符号..............58 '32.函数作用:计算所得税...............................58 '33.函数作用:从工作表第一行的标题文字以数字形式返回所在列号..................................................58 '34.函数作用:在多个工作表中查找一个范围内符合某个指定条件的项目对应指定范围加总求和..........................59 '35.函数作用:返回

Excel VBA编程 调用函数

Excel VBA 编程 调用函数 调用函数时,为了使用函数的返回值,必须指定函数给变量,并且用括号将参数封闭起来。 语法:函数过程名([参数列表]) 由于函数过程名返回一个值,故函数过程不能作为的单独语句加以调用,必须作为表达式或表达式的一部分,然后再配以其他的语法成分构成语句。 在调用函数之前,应首先来定义一个函数,如定义一个myreplace(S,Olds,NewS)函数过程,即用News 子字符串替换在S 字符串中出现的OldS 字符串。 例如,下面的程序是对前面自定义的函数过程CalculateSquareRoot 的调用,其代码如下: Private Sub CommandButton1_Click() Dim a a = InputBox("请输入数字") '调用CalculateSquareRoot 函数 MsgBox "计算平方根:" & CalculateSquareRoot(CInt(a)) End Sub 返回工作表中,单击【计算平方根】按钮,在弹出的如图9-3所示的对话框中,输入数字 25。然后,单击【确定】按钮,即可弹出如图9-4所示的效果。 图9-3 输入数字 图9-4 显示结果 注 意 “参数列表”称为实参或实元,它必须与形参保持个数相同,位置与类型一一对应。其中,实参可以是同类型的常数、变量、数组元素或表达式。 另外,在Visual Basic 中,通过WorksheetFunction 对象可使用Excel 工作表函数。例如,以下Sub 过程使用Min 工作表函数来确定单元格区域中的最小值,其代码如下: Sub UseFunction() Dim myRange As Range Set myRange = Worksheets("Sheet1").Range("A1:C10") answer = Application.WorksheetFunction.Min(myRange) MsgBox answer End Sub 从上述的代码可以观察到,用户将变量myRange 声明为Range 对象,然后将其设置为Sheet1上的A1至C10单元格区域。指定另一个变量answer 为对myRange 应用Min 函数的结果。最后,answer 的值显示在消息框中,效果如图9-5所示。 输入 单击

用VBA编写Excel自定义的累加函数

用VBA编写Excel自定义的累加函数 郑云勇 云南楚雄思远投资有限公司 摘要:Excel是常用的数据统计分析软件,本文介绍了用VBA编写加载宏的方法来扩展、定制Excel,以适合工程统计专业的特殊需要。下面,讨论如何实现一个自定义的具有任意合计形如“30.2m/165.45m3”的“分子/分母”工程量统计功能的函数,由于Sum函数系统已经内置,我们要实现的函数不妨命名为uLSum和uRSum。 关键词:Excel,定制,加载宏 1引言 电子表格软件Microsoft Excel具有快捷方便的数据输入方式和强大的数据处理能力,是工程地质中常用的数据统计分析软件,为我们的工作带来了极大的方便。但Excel毕竟只是一个通用的办公软件,对于工程专业中的各种特殊需求,它自然不会有专门的功能支持。比如:采矿工程师在做每年的采掘生产计划时,通常遇到要累加掘进工程量的合计数,即“30.5/125.6”加“120.2/625.8”的合计,我们通常的做法是分步完成,先将分子之、分母之和求出来后,在填入单元格中。或者将分子、分母分别填入两列中,分别用sum函数求和。这样既劳神,又容易出错,特别是对大量数据进行复杂的公式计算。如果从头编写一个独立、专门的计算程序来处理,则似有小题大作之嫌,而且还不能与Excel无缝集成。那么有

没有更好的解决办法呢?答案是肯定的,那就是定制Excel,通过编程扩展它的功能。 事实上,Excel作为Microsoft最优秀的软件之一,很早就开始提供了二次开发的接口,4.0版以前有XLM,4.0版又发布了Excel C API,5.0版则内置了VBA。现在的Excel,除了人所共知的操作功能外,还是一个完善的软件开发平台。它拥有完备的ActiveX Automation服务器和客户机机制,可以通过编程对其进行全方位的扩展、定制,实现各种自定义功能。基于ActiveX Automation技术,使用C/C++等多种支持Automation的编程语言均可控制Excel,但我们最为熟悉和常用的还是内置于Excel中的VBA。 2VBA简介 Visual Basic for Application(VBA)是Microsoft面向最终用户的应用软件编程语言。它最早出现于Microsoft的Excel和Project中,如今VBA已成为VB和所有Office产品的组件。另外,越来越多的软件开发商购买了VBA语言的使用权,如常用的绘图软件AutoCAD等均已支持VBA作为二次开发工具。这意味着我们懂得VB,就已经懂得了VBA,反之亦然。 VBA的最大特点和最大优点是利用面向对象(OOP)的ActiveX Automation技术,使语言的引擎在技术上与开发环境分离,这可以从在任何VBA的IDE环境中都可以看到VBA单独的入口得到印证。因此,VBA的功能在很大程度上依赖于它的客户显露的Automation 接口,例如,VB与Office套件中的VBA,能完成的功能就大不一样。

原创—EXCEL VBA SPC自定义函数包括CPK PPK CP……

'################## stdevR=average(max-min)/R系数组内差 Function stdevR(ParamArray rng() As Variant) As Variant Dim rang As Range, rngi As Range, T As Single, F As Single, i As Integer, e As Integer Dim trr Dim arr() Dim brr() For Each r In rng If rang Is Nothing Then Set rang = r Else Set rang = Union(rang, r) For Each c In r Next Next n = rang.Cells.Count aa = rang.Columns.Count bb = rang.Rows.Count cc = Application.WorksheetFunction.Ceiling(n / 5, 1) If aa > 1 Then ReDim arr(1 To bb) For i = 1 To bb Set rngi = rang(i, 1).Resize(1, aa) arr(i) = Application.Max(rngi.Value) - Application.Min(rngi) Next F = Application.WorksheetFunction.Average(arr) trr = [{0,1.128,1.693,2.059,2.326,2.534,2.704,2.847,2.97,3.078,3.173,3.258,3.336,3.407,3.472,3.532,3.58 8,3.64,3.689,3.735,3.778,3.819,3.858}] T = trr(aa) stdevR = F / T Else e = 0 ReDim brr(1 To cc) For i = 1 To cc Set rngi = rang(1, 1).Resize(5, 1).Offset(e, 0) brr(i) = Application.Max(rngi.Value) - Application.Min(rngi) e = e + 5 Next F = Application.WorksheetFunction.Average(brr) T = 2.326 stdevR = F / T End If End Function '################## ppk=min(ppu,ppl)=(1-k)*pp 整体的过程能力指数带中心值的 Function ppk(USL As Variant, LSL As Variant, ParamArray rng() As Variant) As Variant Dim AV As Single, rang As Range, n As Integer, T As Single, SumN As Single, SE As Single, k As Single For Each r In rng If rang Is Nothing Then Set rang = r Else Set rang = Union(rang, r) For Each c In r

VBA自定义函数选合集(代码注释)

自定义函数选 附代码注释 By 蓝桥玄霜 前言 我们平时在工作表单元格的公式中常常使用函数,Excel自带的常用的函数多达300多个,功能强大,丰富多彩,博大精深。在Excel内置函数和扩展函数中有十多个应用领域的函数,如数学与三角函数、统计函数、文本和数据函数、查找和引用函数、数据库函数、财务函数、日期和时间函数、信息函数、工程函数和宏表函数等等。 但是我们每个人还可能有各种各样的问题而不能直接应用这些函数得到解决,于是Excel也提供了VBA可以让我们自己编一个自定义函数来解决自己特定的需求。以下挑选一些自定义函数,由简到繁,附以代码注释,供大家参考。 第1例折扣函数 一、题目: 要求编写一个当销售数量大于等于100时,售价打九折的计算折扣的自定义函数。二、代码: Function Zekou(sul, jiag) As Double If sul>=100 Then Zekou =sul*jiag*0.1 Else Zekou =0 EndIf Zekou =Application.Round(Zekou,2) End Function 三、代码详解 1、Function Zekou(sul, jiag) As Double :自定义函数的开始语句。 自定义函数总是以Function开头,以End Function语句结束。自定义函数的代码一定要放在标准模块里面。 Zekou是函数名,名字可取一个较短的描述信名称,这样容易记忆。如sul数量和jiag 价格,这里用的是拼音字母。函数后括号里的两个变量叫做函数的参数。两个参数都没有显式声明数据类型,都是可变型数据类型variant。AS Double 表示函数返回值的数据类型是双精度浮点型数据。 2、If sul>=100 Then 如果sul(数量)大于等于100,那么 这是标准的If…Then…Else判断语句,意思是如果第一个条件成立,或者说满足了第一个条件,那么执行Then以后的语句;否则执行Else以后的语句。

excel自定义函数编写方法

Excel自定义函数基础教程 1.总述、编写环境与设置 自定义函数功能是Excel中一个强大的扩展功能,它可以实现不同用户的特定计算要求。以使得Excel计算自主化、专业化,可以大大简化人工劳动(查表、专业公式计算、统计等)。所以编写与使用自定义函数应是每个工程计算人员必不可少的技能。本教程为零基础教程,特为呼和浩特职业技术学院编写,如需引用或咨询请联系526949738@https://www.360docs.net/doc/b28640289.html,。 本教程以Excel2003为平台讲解,使用其他版本Excel的同学请参照学习。自定义函数需要应用宏编写,请进行如下设置。 工具—>宏—>安全性

写的宏了。 辑器,在弹出的窗口点击插入—>模块,即进入了编写环境。

选中相应的模块点击文件—>导出文件,就可以存储.bas的源文件。这样就可以方便存储整理,以便日后引用。 2.宏的概念与Visual Basic基础 有VB编程基础的同学可跳过此章。 宏实际上就是一段用以完成某些功能的源代码,Excel中的

宏以Visual Basic(以后简称VB)编写,存储后的.bas文件可以用记事本打开,里面记录的就是编写的代码。 VB是一门高级编程语言,其语法简单易于掌握,适合初学者学习。本教程中只对VB进行初步讲解,如果需要深入学习请参照VB相关的专门书籍(Visual Basic编辑器中的帮助也有详细介绍)。 顺序、选择、循环是编程的三种结构,合理组合嵌套这三种结构就可以解决所有编程问题。默认情况下,代码按照顺序结构执行,所以下面只介绍选择和循环结构的语句表达。 选择结构: 选择结构非常常见,它的作用是使程序根据条件的不同执行不同的语句。这里我们只介绍最简单的一种语句。 If condition Then [statements] [Else elsestatements] 或者 If condition Then [statements] [ElseIf condition-n Then [elseifstatements] ... [Else [elsestatements]] End If 注释:condition:条件表达式;statements:执行语句;[]中的内容为可选内容。

EXCEL-VBA自定义角度转换函数

'1、角度转换函数 '1.1---“度分秒”化“度”函数 '注:“度分秒”->“度”的角度单位转化 Public Function 度分秒_度(C2 As Double) Dim FuHao As Integer, C1 As Double Dim Du As Integer, Fen As Integer, Miao As Double FuHao = Sgn(C2) C1 = C2 + 0.0000000000001 * FuHao C1 = Abs(C1) Du = Int(C1) Fen = Int(C1 * 100) - Int(C1) * 100 Miao = (C1 * 100 - Int(C1 * 100)) * 100 If Fen >= 60 Or Miao >= 60 Then 度分秒_度 = "输入有误!" Exit Function End If 度分秒_度 = FuHao * (Du + Fen / 60 + Miao / 3600) End Function '1.2---“度.分秒”化“弧”函数 Public Function 度分秒_弧(度分秒 As Double) As Double Dim FuHao As Integer, C1 As Double Dim 度 As Integer, 分 As Integer, 秒 As Double FuHao = Sgn(度分秒) C1 = 度分秒 + 0.0000000000001 * FuHao C1 = Abs(C1) 度 = Int(C1) 分 = Int(C1 * 100) - Int(C1) * 100 秒 = (C1 * 100 - Int(C1 * 100)) * 100 If 分 >= 60 And 秒 >= 60 Then 度分秒_弧= "“分秒”输入有误!" Exit Function End If If 分 >= 60 Then 度分秒_弧= "“分”输入有误!" Exit Function

推荐-Excel中自定义函数实例剖析 精品

Excel中自定义函数实例剖析 稍有Excel使用经验的朋友,都知道Excel内置函数的快捷与方便,它大大增强了Excel数据计算与分析的能力。不过内置的函数并不一定总是能满足我们的需求,这时,就可以通过定义自己的函数来解决问题。 一、认识VBA 在介绍自定义函数的具体使用之前,不得不先介绍一下VBA,原因很简单,自定义函数就是用它创建的。VBA的全称是Visual Basic for Application,它是微软最好的通用应用程序脚本编程语言,它的特点是容易上手,而且功能非常强大。 在微软所有的Office组件中,如Word、Access、Powerpoint等等都包含VBA,如果你能在一种Office组件中熟练使用VBA,那么在其它组件中使用VBA的原理是相通的。 Excel中VBA主要有两个用途,一是使电子表格的任务自动化;二是可以用它创建用于工作表公式的自定义函数。 由此可见,使用Excel自定义函数的一个前提条件是对VBA基础知识有所了解,如果读者朋友有使用Visual Basic编程语言的经验,那么使用VBA 时会感觉有很多相似之处。如果读者朋友完全是一个新手,也不必太担心,因为实际的操作和运用是很简单的。 二、什么时候使用自定义函数? 有些初学Excel的朋友可能有这样疑问:Excel已经内置了这么多函数,我还有必要创建自己的函数吗?

回答是肯定的。原因有两个,它们也正好可以解释什么时候使用Excel自定义函数的问题。 第一,自定义函数可以简化我们的工作。 有些工作,我们的确可以在公式中组合使用Excel内置的函数来完成任务,但是这样做的一个明显缺点是,我们的公式可能太冗长、繁琐,可读性很差,不易于管理,除了自己之外别人可能很难理解。这时,我们可以通过使用自定义函数来简化自己的工作。 第二,自定义函数可以满足我们个性化的需要,可以使我们的公式具有更强大和灵活的功能。 实际工作的要求千变万化,仅使用Excel内置函数常常不能圆满地解决问题,这时,我们就可以使用自定义函数来满足实际工作中的个性化需求。 上面的讲述比较抽象,我们还是把重点放在实际例子的剖析上,请大家在实际例子中进一步体会,进而学会在Excel中创建和使用自定义函数。 三、自定义函数实例剖析 下面我们通过两个典型实例,学习自定义函数使用的全过程。这里实际上假设读者朋友都有一定的VBA基础。 假如你完全没有VBA基础也不要紧,当学习完实例后,若觉得自定义函数在自己以后的工作中可能用到,那么再去补充相应的VBA基础也不迟。 (一) 计算个人调节税的自定义函数 任务 假设个人调节税的收缴标准是:工资小于等于800元的免征调节税,工资800元以上至1500元的超过部分按5%的税率征收,1500元以上至2000元的超过部分按8%的税率征收,高于2000元的超过部分按20%的税率征收。 分析

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 i - 1 If r(i, 1) = r(j, 1) Then

f = 1 Exit For End If Next j If f = 0 And r(i, 1) <> "" 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, 2) f = 0 For j = 1 To i - 1 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 i - 1 For n = 1 To UBound(r, 2) If r(i, j) = r(m, n) Then f = 1 GoTo kk End If Next n Next m For n = 1 To j - 1

EXCEL自定义函数(反算正算角度化弧度)(精)

EXCEL自定义函数(反算、正算、角度化弧度)在Excel中建立自定义函数 一、建立自定义函数 ㈠、录制宏: ①、打开一个新的Excel工作薄 ②、选择“工具”菜单中的“宏”子菜单,从它的下级菜单中选择“录制新宏” ③、在“录制新宏”对话框的“宏名”中输入要建立的函数名,例:Rad ④、在“保存在”列表中选择“个人宏工作薄” ⑤、左击“确定” ⑥、在“停止录”对话框中左击蓝色的小方框 ㈡、写程序代码 ①、选择“工具”菜单中的“宏”子菜单,从它的下级菜单中选择“Visual Basic 编辑器”,双击模块* ②、将sub Rad()改写成Public Function Rad(y) ③、将下列程序代码写入(或拷贝)到 坐标反算代码 Public Function fsa(x1, y1, x2, y2) Dim aa, a, b, b1, b2, b3, a1, x, y, a0 Const pi = 3.14159265358979 x = x2 - x1: y = y2 - y1 a = Atn(y / x) If (x < 0 And y > 0) Or (x < 0 And y < 0) Then a = a + pi End If If x > 0 And y < 0 Then a = a + 2 * pi End If ab = a aa = Sgn(ab): If aa < 0 Then ab = Abs(ab) a0 = ab / pi * 180: b1 = Int(a0): a1 = (a0 - b1) * 60: b2 = Int(a1) / 100 b3 = (a1 - b2 * 100) * 60 / 10000 b = b1 + b2 + b3 fsa = b * aa '计算的角度为:°′″(12.3645---12°36′45″) End Function 将60进制角度化成弧度――2 Public Function rad(a)

在excel中如何自编函数并运用

在excel中如何自编函数并运用 工作中如果有大量的计算并很复杂,可以自编函数并保存下来,以后可以在相似的运算中套用工式,或在同一个表格中出现了反复的同格式运算时也可以用。 以下以做专业教学计划表时安排课程算课时为例说明。造计划表时要在八个学期安排各门课程,由于每学期周课时有限制,一开始安排时所放的课程可能会在八个学期间移来移去,具体安排多少课时或安排几个学期也是会变动。由于八个学期其实周数并不全是18周,所以一移动该门课总课时总会变。如果有一个公式能自动计算变动的周课时并算出该课程该学期的总课时,会减少很多麻烦。其它如总学分、全部总课时或实践课时等也可以依此做出相同的公式。 方法如下: 1.在“工具”菜单上,指向“宏”,然后单击“Visual Basic 编辑器”。 2.在“Microsoft Visual Basic”窗口中的“插入”菜单上,单击“模块”。 3.在“模块”窗口中,键入函数代码。例如,计算每门课“总学时”的函数可如下所示: (Function 总学时(MyNum1, MyNum2, MyNum3, MyNum4, MyNum5, MyNum6, MyNum7, MyNum8) 总学时 = MyNum1 * 15 + MyNum3 * 16 + (MyNum2 + MyNum4 + MyNum5 + MyNum6) * 18 + MyNum7 * 14 + MyNum8 * 6 End Function) 说明:由于每门课不知道移动时会出现在excel表格八个学期的列中的哪一列,但它安排在了某个学期,则其它学期的相应位置为空(值为0),这样,设计一个公式把把八个学期全算进去,则没有安排此课的学期不会有学时。上面的MyNum1至MyNum8是excel自定义函数的自定义变量,这里对应八个学期某门课所对应的八个单元格。第一学期为15周,第三学期为16周,第七学期为14周,第八为6周,其余为18周。因此该课的总学时可以用八学期算总数的方式得出。(注:第一行定义八个变量值,用英文逗号隔开,不需要空格。图上第二行数值之间的空格并不需要输入时敲入,函数按正常输入完成后系统自动分出空格。) 4.在“文件”菜单上,单击“关闭并返回到Microsoft Excel”。 5.在工作表上,在需要输入一门课程总学时的地方调用函数,就像使用任何工作表函数一样。点“插入——函数”,在其中找到自定义函数“总学时”并调用。

使用VBA编写自定义函数(修改版)

使用VBA编写自定义函数 前言 本教程仅适用于不懂或初学VBA的朋友。 万事开头难,VB的内容繁多庞杂,没接触过VB但想学习编程的朋友可能无所适从,然而,这也远不是一个小教程能说得明白的,所以,本教程没有讲过多的语法、函数,也没有摘录VBA帮助(可以算是主要的参考教程)里的内容,而是以口语的方式讲解编程的一个基本思路,再辅以讲解平常可能遇到情况,让学习者能基本上手编写一段简单的代码,我的目的就达到了,接下去,就是学习者自己去论坛找资料学习了。 一、VBA简介 Visual Basic for Applications(VBA)基于Visual Basic的一种宏语言,是微软用来扩展Windows的应用程序,特别是在Microsoft Office软件中执行通用的自动化(OLE)任务的编程语言。它与VB不同的是,VB的对象主要是可视化窗口,VBA的对象则主要是Microsoft Office应用程序,如EXCEL的单元格、工作表、工作薄等。由于对象不同,那么,对象的属性、方法、事件就会发生相应的变化,所以,学习VBA,或从VB转到VBA,就是要根据具体对象特性而进行不同的处理。 我们在使用EXCEL时,如果仅仅只限于简单的数据处理,那就完全没有发挥出EXCEL强大的功能,我们完全可以使用VBA让我们的工作效率大大提高。 一般情况下,我们通常编写三类程序: 1、自定义函数:它与工作表内置函数使用方法一样,使用简单,适用于固定几个参数得出结果这种类型; 2、表格处理,这种编程较为复杂,适用于对整表进行大批量量数据的处理,对表格进行美化处理等。 3、可视化窗口,可以通过窗口设置对表格数据进行处理。 以上三种并不是独立存在的,可以相互结合使用,更能发挥更大的效率。 本次讲解的主要自定义函数,从较为简单的独立的自定义函数开始,逐渐学习进行大数据处理的能力。

VBA之自定义函数及加载

VBA之自定义函数 这一贴说的是自定义函数。Excel本身已自带了很多函数,供我们使用,但有些问题用原有的函数解决起来很复杂,甚至是无能为力,但有了VBA,可能就可以现实。 怎样自定义一个函数?下面我们建一个名为RangeCount和函数,用来统计给定单元格数量。上贴说过怎么插入一个宏(子程序),其实细心的朋友就会发现,里面有一项函数的选项,就是用这个添加了!键入你需要的名称RangeCount,即会自动生成一个函数的头Public Function RangeCount()和尾End Function!这时大家可以知道,子程序都是以Sub关键字开头,而函数是以Function关键字开头。 怎样给自定义函数传递参数?用过Sum函数的朋友都知道Sum的用法,在单元格中键入=Sum(A1:A10)就能对A1:A10进行求和,那么怎么让我们的自定义函数也有此功能呢,其实很简单,只要在Function RangeCount()中的(与)之间加入即可,象现在我们要给这个自定义函数传递一个单元格的参数,即在()间加入XRan As Range即可。其中XRan就是我们给这个参数设定的名称,As 是关键字,而Range就是给定参当数的类型(单元格类型),更详细的说明可以参见VBA的帮助(上贴有说明怎么用帮助了吧:))。 怎么样自定义函数加入功能?其实也和子程序一样,在函数的头Public Function RangeCount()和尾End Function之间就可以加入代码,我们这个函数的代码只有一句:RangeCount = XRan.Count 怎么样让自定义函数返回值?从上面的例子看出,只要将函数的名称设定为需要返回的值即可。 怎么当前工作表中使用自定久函数?使用自定义函数的方法其实和一般函数的方法是一样的,在单元格中键入=RangeCount(A1:A10),即可以得到值(10)!当然,也可以通过菜单插入/函数,在类别中选择用户自定义里找到你自定义的函数。 怎么在工作表里使用别的工作表里的自定义函数?从菜单插入/函数,类别中的用户自定义里,可以看到,如果这个自定义函数不是在当前的工作表里的,函数会变成——文件名.xls!函数名了,这样我们使用上面的自定义函数就变成=Book1.xls!RangeCount(A1:A10)(设我们刚才保存文件为Book1)。 怎么样在任何工作表中使用自定义函数?自定义了函数后,每一次使用都要打开这个工作簿,不方便,那么怎么样让任何工作簿都能使用这个自定义函数呢?有两个方法,第一个就是把代码写在上面说到的个人宏工作簿中,因为个人宏工作簿都是随Excel自动打开的,那么我们就可以通过PERSONAL.XLS!函数名来使用这个自定义函数。第二个方法就是加载宏(关于加载宏的其它用法和具体说明以后还会有专门的一贴),将包含这个自定义函数的工作簿,去掉无关的内容(不去当然也行啦!)后另存为加载宏(不会不知道怎么另存吧,汗!后注!),这样在菜单工具/加载宏里,将相关项前打勾,即可使用该自定义函数,这时使用函数的方法只要直接用函数名即可,如=RangeCount(A1:A10)。 最后再说一点大家少遇到的现象:用过VBA后,大家知道在同一模块中是不能有相同名称的子程序与函数的,如果有,运行时会提示存在二义性!但在不同模块中,却能有相同甸称的函数存在,那么怎么使用这样的函数呢?从菜单插入/函数,类别中的用户自定义里,我们可以看出这样的函数变成模块名.函数名了,这样我们的使用方法就是=模块1.RangeCount(A1:A10)或=模块2.RangeCount(A1:A10)。 后注:详细的另存为加载宏的过程,点击菜单/文件/另存为,在文件类型里选择Microsoft Excel加载宏项,这时文件夹自动转到保存加载宏的AddIns,再保存即可。 附:上面RangeCount的完整代码: Function RangeCount(XRan As Range) RangeCount = XRan.Count

相关主题
相关文档
最新文档