Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2015|回复: 9

[已解决]关于自定义函数请教两个问题

[复制链接]
发表于 2009-9-3 15:03 | 显示全部楼层 |阅读模式
Public Function sheetslastrow() As Long
Dim s, i As Long
s = Sheets.Count
maxRow = 0
For i = 1 To s
maxRow = WorksheetFunction.Max(maxRow, Sheets(i).[a65536].End(xlUp).Row)
Next i
sheetslastrow = maxRow
End Function
'问题1:如何使得函数结果能及时更新,即自动重新计算,函数值随各工作表最后非空行的位置变化而重新计算,目前必须按f9 才能重新计算?
'问题2:如何加入参数使得可以选择某一列,目前只能默认A列?
最佳答案
2009-9-3 15:34

在Workbook下增加

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Application.CalculateFull
End Sub

Public Function sheetslastrow(XL) As Long
Dim s, i As Long
s = Sheets.Count
maxRow = 0
For i = 1 To s
maxRow = WorksheetFunction.Max(maxRow, Sheets(i).Cells(65536, XL).End(xlUp).Row)
Next i
sheetslastrow = maxRow
End Function

用的时候

=sheetslastrow(2)

=sheetslastrow("B")

都可以

发表于 2009-9-3 15:34 | 显示全部楼层    本楼为最佳答案   

在Workbook下增加

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Application.CalculateFull
End Sub

Public Function sheetslastrow(XL) As Long
Dim s, i As Long
s = Sheets.Count
maxRow = 0
For i = 1 To s
maxRow = WorksheetFunction.Max(maxRow, Sheets(i).Cells(65536, XL).End(xlUp).Row)
Next i
sheetslastrow = maxRow
End Function

用的时候

=sheetslastrow(2)

=sheetslastrow("B")

都可以

回复

使用道具 举报

发表于 2009-9-3 15:42 | 显示全部楼层

Public Function sheetslastrow(ByVal r As String) As Long
Dim s, i As Long
s = Sheets.Count
maxRow = 0
For i = 1 To s
maxRow = WorksheetFunction.Max(maxRow, Sheets(i).Cells(65536, r).End(xlUp).Row)
Next i
sheetslastrow = maxRow
End Function

=sheetslastrow("C")

Public Function sheetslastrow1(ByVal r As Range) As Long
Dim s, i As Long
s = Sheets.Count
maxRow = 0
For i = 1 To s
maxRow = WorksheetFunction.Max(maxRow, Sheets(i).Cells(65536, r.Column).End(xlUp).Row)
Next i
sheetslastrow1 = maxRow
End Function

=sheetslastrow1(C:C)

回复

使用道具 举报

 楼主| 发表于 2009-9-3 15:43 | 显示全部楼层

QUOTE:
以下是引用amulee在2009-9-3 15:34:00的发言:

在Workbook下增加

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Application.CalculateFull
End Sub

Public Function sheetslastrow(XL) As Long
Dim s, i As Long
s = Sheets.Count
maxRow = 0
For i = 1 To s
maxRow = WorksheetFunction.Max(maxRow, Sheets(i).Cells(65536, XL).End(xlUp).Row)
Next i
sheetslastrow = maxRow
End Function

用的时候

=sheetslastrow(2)

=sheetslastrow("B")

都可以

多谢了,朋友,你解决了我不少问题。请教一下要加ByVal Sh As Object是什么意思, Application.CalculateFull
这一句是不是自动计算的意思?那么Private Sub Workbook_SheetChange这个事件程序的目的是否是当选择定位工作表或改变某个工作表的单元格内容都会触发呢?还有就是XL定义的是字符型的还是数值型的,为什么

=sheetslastrow(2)

=sheetslastrow("B")两个都可以呀?问题比较多,麻烦你了。

回复

使用道具 举报

发表于 2009-9-3 16:04 | 显示全部楼层

那个是Workbook的事件,在Thisworkbook里面可以看到的

xl 可以变的,既可以数字也可以字符

因为这里

Cells(65536, XL)的XL既可以用数字表示第几列,也可以用字母表示哪列。

回复

使用道具 举报

发表于 2009-9-3 16:05 | 显示全部楼层

补充一点,Application.CalculateFull就是完整计算的意思
回复

使用道具 举报

 楼主| 发表于 2009-9-3 16:17 | 显示全部楼层

QUOTE:
以下是引用amulee在2009-9-3 16:04:00的发言:

那个是Workbook的事件,在Thisworkbook里面可以看到的

xl 可以变的,既可以数字也可以字符

因为这里

Cells(65536, XL)的XL既可以用数字表示第几列,也可以用字母表示哪列。

原来cells()的参数还可以为字符,以前以为只能是数值呢,学到了。

回复

使用道具 举报

 楼主| 发表于 2009-9-3 16:58 | 显示全部楼层

多谢你了,你好厉害!
回复

使用道具 举报

发表于 2009-9-4 05:52 | 显示全部楼层

学习[em02][em02]
回复

使用道具 举报

发表于 2009-9-7 10:47 | 显示全部楼层

用下面这个更方便,Application.Volatile可将函数标志为易失性函数,每次更改数值会自动重算。

Volatile 方法

用于将用户自定义函数标记为易失性函数,无论何时在工作表的任意单元格中进行计算时,易失性函数都必须重新进行计算。非易失性函数只在输入变量改变时才重新计算,若不用于计算工作表单元格的用户自定义函数中,则此方法无效。

Public Function sheetslastrow(XL) As Long
Dim s, i As Long
s = Sheets.Count
maxRow = 0
For i = 1 To s
maxRow = WorksheetFunction.Max(maxRow, Sheets(i).Cells(65536, XL).End(xlUp).Row)
Next i
sheetslastrow = maxRow
Application.Volatile
End Function

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-6-7 22:31 , Processed in 0.334234 second(s), 5 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表