我有一个包含数十万行数据的表,但我只想查看其中的一部分。我应该怎么办?有没有一种页面只显示固定数量的项目,可以像网页预览一样翻页?--雨夜重逢不用担心问题,我给你三种方法来搞定,从简单的公式到代码,再到数据库语言的SQL方法,今天一一为你解析。01函数方法看一下数据格式。右边的页码,自定义项的个数,控制显示项的个数,效果如图(功能方法效果演示)如果判断最大页数?我想四舍五入取整为12.5页,我在第13页显示总行数=COUNTA(data!A:A)-1COUNTA(data!A:A)----总行数ofdataitemsintheheaderCOUNTA(data!A:A)-1----是去掉header后的数据总数。每页行数=K2单元格小数点四舍五入,用函数:ROUNDUP(number,decimalplaces)hereattheend公式:=IFERROR(ROUNDUP((COUNTA(data!A:A)-1)/k2,0),1)用了一个IFERROR函数,容错也显示了1页的思维规则。如何判断要显示的第一个数字是什么?最先显示的数字是:(页码-1)*每页条数+1最终公式:=($G$2-1)*$K$2+1(注意绝对引用,防止拖改)有没有这个数字和数据行数的关系?Number+1是实际数据的行数。这里为了方便理解,给出一个辅助栏目。不是,把数字想象成行号来操作,知道位置。使用什么函数返回结果?MATCH函数语法:INDEX(数组或范围,行在数组和范围中的位置,列在数组和范围中的位置)1参数范围:实际数据范围,注意绝对锁定2参数,行号,是数字+1三参数列,即1到3的数字处理函数:INDEX(data!$A$1:$C$1000,number+1,COLUMN(A1))Result:INDEX(data!$A$1:$C$1000,($G$2-1)*$K$2+1+1,COLUMN(A1))这个公式可以得到第一个数据结构,我需要根据下拉得到正确的结果,只要数ofrows下拉编号,使用ROW函数语法:ROW(cell)返回单元格的行数。我这里写ROW(A1),通过下拉,A1里面变成B1,C1,D1,E1,还有1,2,3,4结果也需要限制条目数,这里使用IF函数判断,只要超过条目数,就会被显示为空,让函数出错。函数的最后部分:IF(ROW(A1)<=$K$2,ROW(A1)-1,"")最后的结果,结果部分放在一起,加个容错函数IFERROR=IFERROR(索引(数据!$A$1:$C$1000,($G$2-1)*$K$2+1+1+IF(ROW(A1)<=$K$2,ROW(A1)-1,""),COLUMN(A1)),""),可以通过向右下拉单元格来完成函数部分的设置,但是通过函数方法来分析相关参数和方法更快(VBA显示效果),我们已经知道可以通过数字直接知道数据单元格的位置:数字+1个不同的页码,显示第一个数字=(页码-1)*每页行数+1VBA有单元格RESIZE属性,表示截取指定数据区域语法:cell.RESIZE(范围内的行数,范围内的列数)范围内的行数=范围内的行数=范围内的列数=totaldata通过这个属性,可以很方便的把Sub的列数写出来cellmethod()DimrngAsRangeDimlngPagesAsLong'页数DimlngNumAsLong'每页行数DimlngRowAsLong'第一个值行DimlngColAsLong'数据列总数'-----------------下面是程序开头------------lngPages=Range("I2").Value'I2单元格值lngNum=Range("M2").Value'M2单元格值'函数部分学习了,知道数字+1就是行号lngRow=(lngPages-1)*lngNum+1+1'数据的最大列数lngCol=Sheets("data").Cells(1,Columns.Count).End(xlToLeft).Column'清除原数据Range("b3:d65536").ClearContents'取出那块数据Range("b3").Resize(lngNum,lngCol).Value=_Sheets("data“)。Cells(lngRow,1).Resize(lngNum,lngCol).ValueEndSub代码部署,通过单元格值改变事件,改变页数和每页项目数,目的属性数据写入privateSubWorksheet_Change(ByValTargetAsRange)'判断指定工作表中只有I2和M2单元格发生变化时才执行代码调用代码Application.EnableEvents=True'打开Worksheet_Change事件EndIfEndSub通过上下箭头,点击改变页码调用代码在开发工具中。ACTIVEX控件放在单元格位置后,在设计模式下,右键-插入卡片代码写入代码,控制上下箭头微调页码PrivateSubScrollBar1_Change()WithSheet4.ScrollBar1.LinkedCell="I2"'连接到I2单元格Min=1'最小值为1.Max=Range("K2").Value'最大值为K2单元格值EndWithCall单元格方法'调用核心代码EndSub03数据库语言SQL方法显示效果同02部分VBA代码这里分析SQL部分的解决方案我可以使用“SELECTTOP5*FROM[data$]”这条SQL语句获取前5条数据。这里我们根据变化的页数和块数来控制TOP后面的数据。总数据去掉已经翻过的数据,然后固定每页的条数。详细分析了TOP数据。代码SubSQL方法2()DimcnAsObject,rsAsObjectDimsql1AsString,sql2$DimnAsLongDimiAsLongDimkAsLongSetcn=CreateObject("Adod??b.Connection")Withcn.Provider="Microsoft.Ace.Oledb.12.0;ExtendedProperties=Excel12.0".OpenThisWorkbook.FullNameEndWith'设置参数WithSheet1.ScrollBar1.Min=1.Max=Sheet1.Range("K2").ValueEndWithn=Sheet1.Range("M2").Value'每页条目数k=Sheet1.Range("I2").Value'页码Ifk>1Then'当页码大于1页时'这个就是已经翻过的页数,还有那些sql1="selecttop"&n*(k-1)&"numbersfrom[data$]"'这个是总表和已经翻过的页码比较,合成一个新表,这个表有四个字段sql2="selecta.号码,一个。学校,A.学生,A.学费,b。numberastempcolumfrom[data$]aleftjoin("_&sql1&")bona.Number=b.Number"'通过判断第四个字段为空,找到去掉翻页数据的目的'sql2="selectc.Number,c.学校,c.学生,c。tuitionfrom("&sql2&")cwherec.tempcolumisnull"'获取上面新数据的前N条数据'sql2="selecttop"&n&"number,school,student,tuitionfrom("&sql2&")"else'当页码时执行=1page'获取每页条数的数据,即1-N条数据sql2="selecttop"&n*k&"number,school,student,tuitionfrom[data$]"EndIf'getRSdatasetrs=cn.Execute(sql2)'关闭屏幕刷新Application.ScreenUpdating=False'清除之前的结果Range("a1:e65536").ClearContents'获取headerFori=0Tors.Fields.Count-1Cells(2,i+2).Value=rs.Fields(i).NameNexti'将结果复制到单元格中Range("B3").CopyFromRecordsetrscn.Close:Setcn=NothingApplication.ScreenUpdating=TrueEndSub解释下几条SQL语句sql1="selecttop"&n*(k-1)&"Numberfrom[Data$]"获取已经翻过的数字数据(左边表格根据页码显示已经翻过的数字)sql2="selecta.nu??mber,a.school,a.student,a.tuition,b.numberastempcolumfrom[data$]aleftjoin("_&sql1&")bona.number=b.number"得到一个五列的表,与previous页码比较表(这条语句后得到的表形式)sql2="selectc.number,c.school,c.student,c.tuitionfrom("&sql2&")cwherec.tempcolumisnull"通过SQL语言,其中相当于筛选了tempcolum字段为空数据。我只取前四列数据,可以理解(不加过滤,只取前四列)sql2="selecttop"&n&"Number,school,student,tuitionfrom("&sql2&")"取第一个N条数据在实际工作中,数据库管理中经常会用到大数据分页,SQL这种方式会被广泛使用。
