vba 怎么在单元格调用自定义函数

vba 怎么在单元格调用自定义函数,第1张

  如何编写自定义函数

  ①新插入一个标准模块;

  ②插入一个空的Function过程;

  ③写入相应的代码。

  注意:最后一定要将结果返回给过程名。

  扩展:什么是自定义函数

  自定义函数就是用户自己编写的函数。在VBA中,自定义函数就是一个Function过程。在vba 系统中,系统也提供了相当多的vba 系统函数,如instr,cstr,val 等系统函数。

  

  语法结构,同Sub类似。

  [Public]、[Private]、[Static] Function 函数名([参数])[As数据类型]

  [语句块]

  [函数名=过程结果]

  [Exit Function]

  语句块

  [函数名=过程结果]

  End Function

  公有与私有自定义函数的区别:同sub相似,私有的只能在当前模块中过程中调用,而且在插入函数中不可见此函数名。

你这个要求不能实现啊,我用了ParamArray 关键字,用来指定一个 任意元素个数 的数组

共参考:

---------

Function shuzu(ParamArray x())

ApplicationVolatile

Dim i, n, m, tmp

n = UBound(x) - LBound(x) + 1

If n Mod 2 <> 0 Then tmp = "#Err_x()": GoTo 1000

n = n / 2

m = LBound(x)

For i = 1 To n

tmp = tmp + x(m + i - 1) x(m + i - 1 + n)

Next

1000:

shuzu = tmp

End Function

-----------

输入公式的时候,需要 成对 的元素,套用你的公式如下:

=shuzu((K5,L5,M7,N9),(M13,L15,K13,M17))

可以输入任意 成对的 元素,比如使用10个参数:

=shuzu((K5,L5,M7,N9,M10),(M13,L15,K13,M17,N20))

vba代码可以实现,但是比较繁琐(新手),可以用office的定义名称来实现。

要借助空白区域,在空白的任意一个单元格(我的是a8)插入——名称,

(2003版本的是插入——名称,2007版本的是公式——定义名称),名称写col,引用位置上写=GETCELL(63,Sheet2!A2:E3),,(a2:e3表示是有颜色的区域,图中456行的颜色是我后面加的确定,)关闭,在a8处写=col,回车得到一个数字55(这个数字就是当前a2单元格的背景颜色代码),然后拖动单元格到和元数据单元格区域大小,2003版的按f9刷新,2007版的不用。然后在f2那些写=sumif(a8:e8,55,$a$1:$e$1),回车,向下拖动公式就可以了。($a$1:$e$1表示绝对引用需要做加运算的数字区域)

传布上来。。。。。。

窗体放一个Label和一个Command,代码如下:

Private Sub Command1_Click()

Dim i, a(19), max, min, sum, a1, a2, a3, a4, a5 As Integer

Label1Caption = ""

Randomize

Label1Caption = "20名学生成绩:" & vbCrLf

For i = 0 To 19

a(i) = Int(Rnd 101)

Label1Caption = Label1Caption & a(i) & IIf(i = 19, vbCrLf, ",") & IIf(i = 9, vbCrLf, "")

If i = 0 Then

max = a(i)

min = a(i)

Else

If a(i) < min Then min = a(i)

If a(i) > max Then max = a(i)

End If

sum = sum + a(i)

Select Case a(i)

Case 0 To 59

a1 = a1 + 1

Case 60 To 69

a2 = a2 + 1

Case 70 To 79

a3 = a3 + 1

Case 80 To 89

a4 = a4 + 1

Case 90 To 100

a5 = a5 + 1

End Select

Next i

Label1Caption = Label1Caption & "最高分=" & max & vbCrLf

Label1Caption = Label1Caption & "最低分=" & min & vbCrLf

Label1Caption = Label1Caption & "平均分=" & Format(sum / 20, "000") & vbCrLf

Label1Caption = Label1Caption & "0 - 59分人数:" & a1 & vbCrLf

Label1Caption = Label1Caption & "60 - 69分人数:" & a2 & vbCrLf

Label1Caption = Label1Caption & "70 - 79分人数:" & a3 & vbCrLf

Label1Caption = Label1Caption & "80 - 89分人数:" & a4 & vbCrLf

Label1Caption = Label1Caption & "90 - 100分人数:" & a5 & vbCrLf

Call paixu(a)

Label1Caption = Label1Caption & "排序后20名学生成绩:" & vbCrLf

For i = 0 To 19

Label1Caption = Label1Caption & a(i) & IIf(i = 19, vbCrLf, ",") & IIf(i = 9, vbCrLf, "")

Next

End Sub

Private Sub Form_Load()

Label1Move 0, 0, MeWidth

Label1AutoSize = True

Label1Caption = ""

End Sub

Private Sub paixu(b() As Variant)

Dim i As Integer, x As Integer

For i = LBound(b) To UBound(b)

For j = LBound(b) To i

If b(j) < b(i) Then x = b(i): b(i) = b(j): b(j) = x

Next

Next

End Sub

思路:把范围内的所有数先按大小排一下序,那最大两个数的和肯定是“任意两个值的和的最大值”

Function

RangeCount(XRan

As

Range)

As

Integer

Dim

i

As

Integer

Dim

j

As

Integer

Dim

k

As

Integer

Dim

a()

As

Integer

'

取值

ReDim

a(XRanCount)

k

=

1

For

j

=

1

To

XRanColumnsCount

For

i

=

1

To

XRanRowsCount

a(k)

=

XRanCells(i,

j)

k

=

k

+

1

Next

i

Next

j

'

排序

For

i

=

1

To

XRanCount

-

1

For

j

=

1

To

XRanCount

-

i

If

a(j)

>

a(j

+

1)

Then

k

=

a(j)

a(j)

=

a(j

+

1)

a(j

+

1)

=

k

End

If

Next

j

Next

i

'

返回值

RangeCount

=

a(XRanCount)

+

a(XRanCount

-

1)

End

Function

vba中formulaarray函数如何自定义步骤如下:

1、想自定义函数,需要进入VBA环境。打开Excel选项窗口,切换到自定义功能区选项卡,勾选开发工具选项。点击确定按钮。

2、在Excel程序主界面中,切换到开发者选项选项卡,点击点击VisualBasic按钮进入。

3、在VBA环境中,右击工作表,选择插入-模块项。

4、对应的自定义函数完成后,点击VBA界面中的Excel视图即可返回。

function F(rng as range) as String

if rngcount <>5 then F="Err":exit function

dim a(4) as double,b as integer

dim cel as range

for each cel in rng

a(b)=val(celvalue)

b=b+1

next

F = a(0) + a(1)a(2) + a(3) + a(4)

end function

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12175893.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存