Excel VBA 常用代码50例.docx

上传人:b****2 文档编号:13984377 上传时间:2023-06-19 格式:DOCX 页数:52 大小:44.38KB
下载 相关 举报
Excel VBA 常用代码50例.docx_第1页
第1页 / 共52页
Excel VBA 常用代码50例.docx_第2页
第2页 / 共52页
Excel VBA 常用代码50例.docx_第3页
第3页 / 共52页
Excel VBA 常用代码50例.docx_第4页
第4页 / 共52页
Excel VBA 常用代码50例.docx_第5页
第5页 / 共52页
Excel VBA 常用代码50例.docx_第6页
第6页 / 共52页
Excel VBA 常用代码50例.docx_第7页
第7页 / 共52页
Excel VBA 常用代码50例.docx_第8页
第8页 / 共52页
Excel VBA 常用代码50例.docx_第9页
第9页 / 共52页
Excel VBA 常用代码50例.docx_第10页
第10页 / 共52页
Excel VBA 常用代码50例.docx_第11页
第11页 / 共52页
Excel VBA 常用代码50例.docx_第12页
第12页 / 共52页
Excel VBA 常用代码50例.docx_第13页
第13页 / 共52页
Excel VBA 常用代码50例.docx_第14页
第14页 / 共52页
Excel VBA 常用代码50例.docx_第15页
第15页 / 共52页
Excel VBA 常用代码50例.docx_第16页
第16页 / 共52页
Excel VBA 常用代码50例.docx_第17页
第17页 / 共52页
Excel VBA 常用代码50例.docx_第18页
第18页 / 共52页
Excel VBA 常用代码50例.docx_第19页
第19页 / 共52页
Excel VBA 常用代码50例.docx_第20页
第20页 / 共52页
亲,该文档总共52页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Excel VBA 常用代码50例.docx

《Excel VBA 常用代码50例.docx》由会员分享,可在线阅读,更多相关《Excel VBA 常用代码50例.docx(52页珍藏版)》请在冰点文库上搜索。

Excel VBA 常用代码50例.docx

ExcelVBA常用代码50例

ExcelVBA常用代码50例

001。

用命令按扭打印一个sheet1中B2:

M30区域中的内容?

我想在Sheet2中制件一个命令按扭,打印表Sheet1中的[B2:

M30]区域中的内容?

解答:

可以将打印区域设为b2:

m30,然后打印,如:

sheets("sheet1").printarea="b2:

m30"

sheets("sheet1").printout

随手写的,你可以试试看。

最简单的方法是:

你先录制宏,在录制宏过程中,跑到页面设置里面,把打印范围设置到你想要的范围。

然后退出,停止录制宏,你就可以得到一些代码!

002。

能否对一列中的文字统一去掉最后一个字?

这些文字不统一,有些字数多,有些字数少。

如何处理?

我用{"&-}不行

解答:

=REPLACE(A1,LEN(A1),1,"")(在过渡列进行)

003.能否根据单元格数值自动标记序号?

各位大佬,一工作表有两列,“序号”及“金额”,能否将金额不等于0的行自动标上序号呢?

如无现成的函数,应怎样设置?

解答:

DimxuhaoAsInteger

xuhao=1

Range("b2").Select

DoWhileSelection<>""

IfSelection<>0Then

ActiveCell.Previous.Value=xuhao

xuhao=xuhao+1

EndIf

ActiveCell.Offset(1,0).Range("a1").Select

Loop

004.求教自定义函数

查询了一些自定义函数的例子都是单变量的。

自定义函数能否建立“(AsRange)AsInterger”的函数,应该可以的,请各位大师赐教!

请以“∑x2”为例,万分感谢!

(该用"ForEach...Next",就是还不知道如何引用Range中的每个值,请高手指点。

解答:

参数使用Range而函数值为Integer是可以的

用foreachnext循环思路也是对的,应该这样作:

dimrgasrange

dimivalueasinteger

foreachrgin参数区域

ivalue=ivalue+rg.value

next

函数=ivalue

大概意思如此,但没有加入防错处理,你自己先试试看,有问题在问。

又问:

试了一天,还是不行。

PublicFunctionx2(rngAsRange)AsInteger

DimrngAsRange

DimivalueAsInteger

ForEachrngInrng.Range

ivalue=ivalue+rng.value^2

Next

x2=ivalue

EndFunction

还望您的帮助。

解答:

PublicFunctionSUMX2(rngAsRange)AsInteger

'你的错误有几项:

'1.函数名不能使用单元格位址的形式,否则在工作表中引用函数产生歧义,excel以为你引用单元格

'2.参数名与内部变量名冲突,rng本来是定义参数,在过程中不应出现重名变量

'3.rng已被定义为range对象变量,实际意义是一range引用,不能再用rng.Range引用,range的range属性是什么呢,没有吧

'函数我已经给你改了,基本能用

DimrgAsRange

DimivalueAsInteger

ForEachrgInrng

ivalue=ivalue+rg.value^2

Next

SUMX2=ivalue

EndFunction

结果:

调试成功!

,非常感谢!

005.判断字符串的包含性

用什么命令“abcdefg”是否包含“abc”?

解答:

IfVBA.InStr(1,"abcdefg","abc")<>0ThenMsgBox"包含"

006.利用背景实现套打的解决方案

利用背景套打主要在于数据打印位置的确定,关键就是要使图片和实物之间的尺寸保持一致,这里我引入一个中间参照物—空白表(只有表格线的表)。

具体操作以套打支票为例说明:

(1)将支票扫描成图片。

(2)打印一个空白表,使其与支票尺寸一致(需反复调整打印,也可行、列分别打印)。

(3)用“画图”的缩放功能调整图片大小,导入excel作背景,并使其与空白表大小一致(亦需反复调整导入,每次均用原图缩放,再另存为一个文件)。

(4)根据图片背景调整好单元格,填入数据后套打支票,效果是匹配度达99%。

(5)由于每次都是用原图缩放,故可取得缩放比例作为参数,再套打其他表格时,即可直接依参数缩放图片。

思路:

因为空白表=支票,图片=空白表,所以图片=支票。

该方案已证实可行。

007.宏放在worksheet和sheet及模块中各有什么区别?

解答:

放在thisworkbook或sheet中的宏与模块中的宏的主要区别是book或sheet中的过程函数只能是对象所专有的,不能在对象之外的任何地方调用(很显然不能声明Public过程,否则编译报错),而模块中声明Public过程函数可以在任何地方使用。

008.关于excel问题

在excel中如何用公式实现单元格内容递增?

如:

AB12

AB13

AB14

.......

AB100

条件是无法确定储存格中的内容的前面有多少个字符,也就是,可能是2个,也可能是3个,或者更多。

解答:

為什麼要用公式呢?

如A1=AB12,只要你向下拉的複制就可以。

公式可参考(条件是AB12不可以是AB02,处理0为首的文字有困难,亦不可以只有英文字)

A1=AB12

A2=LEFT(A1,LEN(A1)-SUM(LEN(A1)-LEN(SUBSTITUTE(A1,{"0","1","2","3","4","5","6","7","8","9"},""))))&RIGHT(A1,SUM(LEN(A1)-LEN(SUBSTITUTE(A1,{"0","1","2","3","4","5","6","7","8","9"},""))))+1

(A1=AB12

公式

=LEN(SUBSTITUTE(A1,{"0","1","2","3","4","5","6","7","8","9"},""))

答案看到的是4,但其實它回傳一個數組{4,3,3,4,4,4,4,4,4,4}

公式

=LEN(A1)-LEN(SUBSTITUTE(A1,{"0","1","2","3","4","5","6","7","8","9"},""))

答案看到的是0,但其實它回傳一個數組{0,1,1,0,0,0,0,0,0,0}

公式

=SUM(LEN(A1)-LEN(SUBSTITUTE(A1,{"0","1","2","3","4","5","6","7","8","9"},"")))是將{0,1,1,0,0,0,0,0,0,0}加總

=2)

009.给数组公式、VBA爱好者泼点冷水。

数组公式、VBA威力巨大,在某些情形下提高效率非常明显,但各有其弱点。

数组公式在大数据的时候,运行速度慢得无法忍受。

比如,我日常需要编制得几个报表,原始数据有4-8万行,20——30列,用数组根本无法操作。

倒是利用数据透视表及其他一些组合功能,可谓神速。

而VBA主要适用与日常比较固定的一些工作,对于一些临时性工作而言,缺乏灵活性,有杀鸡用牛刀之嫌疑。

因此,根据我个人多年工作经验的体会,能熟练地灵活运用EXCEL基本功能和常用函数,就可以高效地完成大部分日常工作。

我比较常用地东西有:

数据透视表,数据——有效性,ctrl+enter,index,match,indirect,offset,if,vlookup,下拉列表框,绝对引用与相对引用,编辑——选择性粘贴(数值、乘除、转置等),图表,条件格式,定义名称,分列,填充等。

相反观点:

数据透视表的计算是excel中内置的,同样的计算次数速度与数组公式是一样的,数组公式计算慢有两个因素,一是公式的编写不合理,另一个主要的原因是数组公式要对所有的引用数据进行计算,不管这些数据是否有效。

VBA应该是最灵活的,在VBA中结合数组公式是可以达到最佳目的的,可用VBA先分析出数组公式要用的有效引用区域,在辅助表中进行数组计算(这个速度比用VBA直接分析计算要快得多),再将结果记入需要的单元格中,然后删除辅助表。

其实你说的那些基本操作均可用VBA来做的,速度比手工做要快。

 

010.从式子抽取一小式子的问题?

b1=sum(a1:

a10)+(10+20)/4,怎么从中取出(10+20)/4或其结果(即5)?

用evaluate、get.cell都不能取出。

解答:

定义X=get.formula($B$1)得到B1的公式,再用MID、Right等函数截取

011.or可以用数组应用?

有一个工作表,数据上万行,其中一列是我要分析的数值,数值比如为:

0111,0112,0113,0114,0115,0116,0117中的任何一个。

我要统计除0111,0113,0115之外的数据。

公式:

{sum(if(or(sheet!

A2:

A1111="0111",sheet!

a2:

a1111="0113",sheet!

a2:

a1111="0115"),1,0))},可是统计数字和我筛选相加的不一样,用if层层选,可以。

请问原因?

解答:

数组公式中用*、+代替AND、OR

{sum(if((sheet!

A2:

A1111="0111")+(sheet!

a2:

a1111="0113")+(sheet!

a2:

a1111="0115"),1,0))}

012.countif表达式的格式

请问:

我想找A1:

A15中,值不为空的数目,用countif命令怎么写呢?

解答1:

应为counta(a1:

a15)。

countif为找a1:

a15中,特定值的数目。

解答2:

=ROWS(A1:

A15)*COLUMNS(A1:

A15)-COUNTIF(A1:

A15,"")

=ROWS(A1:

A15)*COLUMNS(A1:

A15)-COUNTBLANK(A1:

A15)

解答3:

直接用count(a1:

a15)不是更好吗!

013.删除字符串中某个字符的函数是什么?

删除字符串中某个字符的函数是什么?

举例:

字符串“iloveyoua!

"想删除a字面,应该用什么函数实现?

还有就是在字符串中某个位置加入某个字符用什么函数呢?

解答:

如果有一定的规律,可以用Replace函数。

例如:

在A1单元格已有的字符串”123467"中加入个5变为“1234567”。

可以这样做:

=replace(a1,5,,"5")

另一方法:

用CONCATENATE函数。

例如:

a5单元格里的数据是“asdfhjkl",在另外的单元格了输入下面的函数

CONCATENATE(LEFT(A5,4),"l",RIGHT(A5,4)),得到的结果就是”asdflhjkl",然后用“选择性粘贴,粘贴数值”粘贴回a5单元格就可以了。

014.两表合一实例

问题提出:

怎样把两个表(有相同的字段)怎样合并成一个表?

思路:

用CountIf()函数对表1进行判断,如果其值为0,则表示没以重复,再将表2中和表1不重复的数据复制到表1中,从而实现两表合一。

解题的方法:

Subdd()

b=Sheets

(2).[a1].CurrentRegion.Rows.Count+1

‘判断表2的行数

Fori=3Tob

a=Sheets

(1).[a1].CurrentRegion.Rows.Count+1 

‘判断表1的行数

c=Sheets

(2).[a1].CurrentRegion.Columns.Count  

‘判断表2的列数

IfApplication.WorksheetFunction.CountIf(Sheets

(1).[b1:

b1000],Sheets

(2).Cells(i,2))=0Then

Sheets

(2).Range(Sheets

(2).Cells(i,1),Sheets

(2).Cells(i,c)).CopySheets

(1).Cells(a,1) 

‘将表2中与表1不重复的数据复制到表1中

EndIf

Next

EndSub

015.有没有办法把加载宏内置到Excel文件里?

因为用了Networkdays函数,用到了分析工具库,但是还要发给别人,怎么办?

解答:

试试在"Thisworkbook"中写如下语句:

PrivateSubWorkbook_Open()

Application.RegisterXLLFilename:

=_

"Office安装路径\Office\Library\Analysis\ANALYS32.XLL"

EndSub

又问:

Office安装路径怎么写呀?

大家不一定都装在C盘上。

解答:

试试:

Application.Path&"\Library\Analysis\ANALYS32.XLL"

046.如何在userform上显示最大化与最小化按钮

解答:

利用API

OptionExplicit

PrivateDeclareFunctionGetWindowLongLib"user32"Alias"GetWindowLongA"(ByValhWndAsLong,ByValnIndexAsLong)AsLong

PrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(ByVallpClassNameAsString,ByVallpWindowNameAsString)AsLong

PrivateDeclareFunctionSetWindowLongLib"user32"Alias"SetWindowLongA"(ByValhWndAsLong,ByValnIndexAsLong,ByValdwNewLongAsLong)AsLong

PrivateConstGWL_STYLE=(-16)

PrivateConstWS_THICKFRAMEAsLong=&H40000'(恢复大小)

PrivateConstWS_MINIMIZEBOXAsLong=&H20000'(最小化)

PrivateConstWS_MAXIMIZEBOXAsLong=&H10000'(最大化)

PrivateSubUserForm_Initialize()

DimhWndFormAsLong

DimIStyleAsLong

hWndForm=FindWindow("ThunderDFrame",Me.Caption)

IStyle=GetWindowLong(hWndForm,GWL_STYLE)

IStyle=IStyleOrWS_THICKFRAME'还原

IStyle=IStyleOrWS_MINIMIZEBOX'最小化

IStyle=IStyleOrWS_MAXIMIZEBOX'最大化

SetWindowLonghWndForm,GWL_STYLE,IStyle

EndSub

017.这个判断代码怎么写

在A列输入日期,如果所输入日期为1月1日或5月1日则B列相关单元格+1,其他日期+0,这要用到什么函数?

代码怎么写?

谢谢!

解答:

用IF函数或用Worksheet_Change事件

PrivateSubWorksheet_Change(ByValTargetAsRange)

IfTarget.Column=1Then

IfIsDate(Target)Then

If(Month(Target)=1AndDay(Target)=1)Or(Month(Target)=5AndDay(Target)=1)Then

Target.Offset(0,1)=Target.Offset(0,1)+1

EndIf

EndIf

EndIf

EndSub

018.这个汇总表拆分程序怎么写,高手帮忙!

要将总表里的数据按工作单位字段拆分成数个分表(每个单位一张表格,标签名字为工作单位)这个程序怎么编写,请高手指点。

如果记录增多或字段增多(但拆分字段不增)这个程序又应该怎样改写,请高手稍微讲解一下,应为我不是为这一个表,还想用到别的工作表中,谢谢!

解答:

SubAdd_data(sht_Name)'找出要取资料的区域

DimiAsInteger,jAsInteger,row_dAsInteger

DimFirst_rowAsInteger,Last_rowAsInteger

OnErrorResumeNext

WithSheets("总表")

i=1

DoUntil.Cells(i,3).value=sht_Name

i=i+1

Loop

First_row=i

j=First_row

DoUntil.Cells(j,3)<>sht_Name

j=j+1

Loop

Last_row=j-1

EndWith

Sheets("总表").Range(Cells(First_row,1),Cells(Last_row,12)).Select

Selection.Copy

Sheets(sht_Name).Select

Range("A2").Select

ActiveSheet.Paste

WithActiveSheet

row_d=.Range("A2").End(xlDown).Row+1

Range("B"&row_d).value="合计"

Fori=5To11

Cells(row_d,i).value=Application.WorksheetFunction.Sum(Range(Cells(2,i),Cells(row_d-1,i)))

Nexti

EndWith

Sheets("总表").Activate

Range("A2").Select

EndSub

020.这个公式应该怎么写?

我想统计所有物料编码的第一个字符为a的库存数量的总和,这个公式应该怎么写?

A列为物料编码,B列为库存数量。

解答:

=SUMIF($A:

$A,"a*",$B:

$B)

 

021.样修改此宏?

下面的宏是k版主帮我写的,从文件夹内汇入其他工作表表格。

汇入范围为第五行、第L列。

如汇入范围改为第三行、第R列。

怎样修改此宏?

PublicSubFeed_in2()

DimRow_dn,Row_dn1,i,j,k,mAsInteger

DimPath1,Str1AsString

DimwbAsWorkbook

Row_dn=[B65536].End(xlUp).Row

Path1=Application.ActiveWorkbook.Path

Str1=ActiveWorkbook.Name

k=5

WithApplication

.EnableEvents=False

.ScreenUpdating=False

IfRow_dn>=5Then

Range("B5:

L"&Row_dn).ClearContents

EndIf

With.FileSearch

.NewSearch

.LookIn=Path1

.FileType=msoFileTypeExcelWorkbooks

If.Execute<=1Then

MsgBox"filesnofound":

ExitSub

Else

Form=1To.FoundFiles.Count

Str2=Split(.FoundFiles(m),"\")

n1=UBound(Str2)

Str2=Str2(n1)

IfStr2<>Str1Then

Setwb=Workbooks.Open((Path1&"\"&Str2),True,True)

Row_dn1=wb.Sheets

(1).[B65536].End(xlUp).Row

Fori=5ToRow_dn1

Forj=2To12

Workbooks(Str1).Sheets

(1).Cells(k,j)_

=wb.Sheets

(1).Cells(i,j)

Nextj

k=k+1

Nexti

wb.CloseFalse

Setwb=Nothing

EndIf

Nextm

EndIf

EndWith

.EnableEvents=True

EndWith

EndSub

解答:

除了B65536中的5,其余5都改成3;将Range("B5:

L"&Row_dn)改成Range("B5:

R"&Row_dn);将Forj=2To12改成Forj=2To17。

022.怎样控制textbox的只读,要使textbox中的数据不能改变(删除或修改),在属性里我没有找到

有相关的方法吗?

解答:

Textbox.Enabled=False,直接修改控件属性都行。

又问:

这样还不行,因为Textbox在显示上就灰显了,我想只让它不可改变值,在显示上还是原来的形式。

解答:

那就用Label代替,设置BackColor和SpecialEffect属性。

023.请教个小问题!

你好:

我录制了个删除工作表的宏,但每次运行后,总出现确认删除提示框,请问该如何编写,直接默认删除,不在作确认呢?

解答:

Application.DisplayAlerts=False

代码为:

SubDell()

'

'DellMacro

'DC.Direct记录的宏2003-11-14

Application.DisplayAlerts=False

Sheets("Sheet2").Select

ActiveWindow.SelectedSheets.Delete

ActiveWorkbook.Save

Application.DisplayAlerts=True

EndSub

024.小知识:

当垂直滚动条滚动到无法显示1-3行时,冻结窗口,1-3行就好像被隐藏了,但是取消隐藏也不行。

025.选A1后,自动显示B1内容,有无方

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2