用VBA实现定期检验中的计算.docx
《用VBA实现定期检验中的计算.docx》由会员分享,可在线阅读,更多相关《用VBA实现定期检验中的计算.docx(19页珍藏版)》请在冰点文库上搜索。
用VBA实现定期检验中的计算
用VBA实现压力容器压力管道定期检验中的计算
云南云天化无损检测有限公司陈兴友
摘要:
Excel,VBA,压力容器,压力管道,定期检验,计算。
VBA是VisualBasicForApplications的简称,它是微软公司开发,建立在Office中的一种应用程序开发工具,是一种程序语言。
在Excel中,利用VBA可以有效扩展Excel的功能,设计和构建人机交互界面,打造自己的管理系统,帮组Excel用户更有效地完成一些基础操作、函数公式等很难完成的任务。
在压力容器、压力管道定期检验中,经常遇到各类计算,当从现场采集各类数据后,要迅速的得到结果,就需要借助VBA。
本文介绍通过ExcelVBA实现快速计算功能。
定期检验中的计算主要有:
压力容器:
1、强度校核;2、凹坑G0计算;3、非圆形缺陷定级;压力管道:
1、强度校核;2、未熔合定级;3、局部减薄计算。
下面分别介绍如下:
1、压力容器强度校核
分别按应用较多的部件进行设计:
内压圆筒、内压球壳、内压椭圆封头。
椭圆封头把标准封头和非标准封头分别列开计算。
其他按顺序分别计算即可。
下图为典型的计算过程:
2、压力容器无量纲G0计算
先设计输入项:
条件判断与计算
1-4项为手工判断,5-8项为程序自动判断。
G0=C/T*(A/(RT)^0.5,G0通过需程序自动计算,G0<0.1,则凹坑允许存在。
程序部分代码:
Range("Q15").Value="通过"
Range("Q15").Font.Bold=True
Range("Q15").Font.color=RGB(255,0,0)
G=c*a/(t*(R*t)^0.5)‘计算G0
Range("Q16").Value=G‘为单元格Q16复制
Range("Q16").Font.Bold=True
Range("Q16").Font.color=RGB(255,0,0)
Range("Q17").Font.Bold=True
Range("Q17").Font.color=RGB(255,0,0)
IfG<0.1Then
Range("Q17").Value="允许"‘判断结果
ElseIfG>=0.1Then
Range("Q17").Value="不允许"
EndIf
3、压力容器非圆形缺陷定级
非圆形缺陷定级主要指:
未熔合、未焊透、条状夹渣。
分别按一般压力容器和有特殊要求的压力容器进行计算。
我们看一般压力容器纵缝未熔合定级(其他类同),H≤0.1t且H≤2,L≤2t时定3级(H为缺陷自身高度,L为缺陷长度,t为板厚)。
那么超出上述尺寸应该定4级,低于上述尺寸应该定2级。
我们可以用一个函数来实现:
PublicFunction容器未熔合a(H,L,tAsSingle)AsString
IfH=""Then
容器未熔合a="--级"
GoToEsc
ElseIfH<=0.1*tAndH<=2AndL<=0.67*tThen’定2级的情况
容器未熔合a="2级"
ElseIfH<=0.1*tAndH<=2AndL<=2*tThen’定3级的情况
容器未熔合a="3级"
Else
容器未熔合a="4级"
EndIf
Esc:
EndFunction
实现的界面效果:
4、压力管道强度校核
强度校核采用GB/T20801-2006的计算公式:
tw=PD/(2(Sφ/I+PY)),直管和弯头用同一公式;当选定为直管时,系数I为1。
界面设计为同一个界面,方便了计算:
选择单元格E3(直管或弯头)时,计算代码:
PrivateSubWorksheet_Change(ByValTargetAsRange)
IfNotIntersect(Target,Range("E3"))IsNothingThen
IfRange("E3").Value="直管"Then
Range("E14").Value=1‘如果选择直管,单元格E14=1(即I=1)
ElseIfRange("E3").Value="弯头"Then
Range("E14").Formula="=(4*E12/E7-1)/(4*E12/E7+2)"
‘如果选择弯头,则通过公式计算I的值。
EndIf
EndIf
EndSub
5、压力管道未熔合定级
通过如下函数Fusionx,实现表6的定级功能:
表6 各级管道所允许的单个焊接接头中未熔合自身高度的最大值
壁厚
2级
3级
t<2.5mm
存在未熔合时,定为4级
2.5mm≤t<4mm
不超过0.15t且不超过0.5mm不影响定级;否则定为4级
4mm≤t<8mm
0.15t与1.0mm中的较小值
0.20t与1.5mm中的较小值
8mm≤t<12mm
0.15t与1.5mm中的较小值
0.20t与2.0mm中的较小值
12mm≤t<20mm
0.15t与2.0mm中的较小值
0.20t与3.0mm中的较小值
t≥20mm
3.0mm
0.20t与5.0mm中的较小值
PublicFunctionFusionx(ByValGCAsString,ByValD,ByValt,ByValL,ByValHAsSingle)AsString
DimcAsSingle
DimjAsInteger
ConstPIAsSingle=3.14159
c=PI*D
IfGC="GC1"AndL>0.5*cThen
Fusionx="GC1级管道,当单个焊接接头未熔合的总长度大于焊接接头长度的50%时,定4级。
"
ElseIfGC=""Then
Fusionx="--"
ElseIfGC="GC1"OrGC="GC2"OrGC="GC3"Then
SelectCaset
Case0To2.49
IfL>0Then
Fusionx="存在未熔合时,定4级"
EndIf
Case2.5To3.99
IfH<=0.15*tAndH<0.5Then
Fusionx="不超过0.15t且不超过0.5mm不影响定级"
Else
Fusionx="超过0.15t或0.5mm,定4级"
EndIf
Case4To7.99
IfH<=0.15*tAndH<1#Then
Fusionx="0.15t与1.0mm中的较小值"
ElseIfH<=0.2*tAndH<1.5Then
Fusionx="0.20t与1.5mm中的较小值"
Else
Fusionx="超过0.20t与1.5mm中的较小值"
EndIf
Case8To11.99
IfH<=0.15*tAndH<1.5Then
Fusionx="0.15t与1.5mm中的较小值"
ElseIfH<=0.2*tAndH<2#Then
Fusionx="0.20t与2.0mm中的较小值"
Else
Fusionx="超过0.20t与2.0mm中的较小值"
EndIf
Case12To19.99
IfH<=0.15*tAndH<2#Then
Fusionx="0.15t与2.0mm中的较小值"
ElseIfH<=0.2*tAndH<3#Then
Fusionx="0.20t与3.0mm中的较小值"
Else
Fusionx="超过0.20t与3.0mm中的较小值"
EndIf
CaseIs>=20
IfH<3#Then
Fusionx="超过3.0mm"
ElseIfH<=0.2*tAndH<5#Then
Fusionx="0.20t与5.0mm中的较小值"
Else
Fusionx="超过0.20t与5.0mm中的较小值"
EndIf
EndSelect
EndIf
EndFunction
操作界面如下:
6、压力管道局部减薄计算
局部减薄计算是所有计算中最为复杂的计算。
涉及的参数多,过程复杂。
首先看看输入参数(7个):
下面是过程参数与计算结果:
通过函数score实现定级:
PublicFunctionscore(GC,p,bAsString,t,c,HAsSingle)AsString
Application.VolatileTrue
SelectCaseGC
CaseIs=""
score="-级"
'GC1管道
CaseIs="GC1"
'P<0.3PL0条件
Ifp="P<0.3PL0"Then
SelectCaseb
CaseIs="B/(ΠD)≤0.25"
IfH<=(0.3*t-c)Then
score="2级"
ElseIfH<=(0.35*t-c)Then
score="3级"
Else
score="4级"
EndIf
CaseIs="0.25
IfH<=(0.2*t-c)Then
score="2级"
ElseIfH<=(0.3*t-c)Then
score="3级"
Else
score="4级"
EndIf
CaseElse
IfH<=(0.15*t-c)Then
score="2级"
ElseIfH<=(0.2*t-c)Then
score="3级"
Else
score="4级"
EndIf
EndSelect
EndIf
'***********************************
'0.3PL0
Ifp="0.3PL0
Ifb="B/(ΠD)≤0.25"Then
IfH<=(0.15*t-c)Then
score="2级"
ElseIfH<=(0.2*t-c)Then
score="3级"
Else
score="4级"
EndIf
ElseIfb="0.25
IfH<=(0.1*t-c)Then
score="2级"
ElseIfH<=(0.15*t-c)Then
score="3级"
Else
score="4级"
EndIf
EndIf
EndIf
'*************************************
'GC2或GC3管道
CaseIs="GC2","GC3"
'P<0.3PL0条件
Ifp="P<0.3PL0"Then
SelectCaseb
CaseIs="B/(ΠD)≤0.25"
IfH<=(0.33*t-c)Then
score="2级"
ElseIfH<=(0.4*t-c)Then
score="3级"
Else
score="4级"
EndIf
CaseIs="0.25
IfH<=(0.25*t-c)Then
score="2级"
ElseIfH<=(0.33*t-c)Then
score="3级"
Else
score="4级"
EndIf
CaseElse
IfH<=(0.2*t-c)Then
score="2级"
ElseIfH<=(0.25*t-c)Then
score="3级"
Else
score="4级"
EndIf
EndSelect
EndIf
'***********************************
'0.3PL0
Ifp="0.3PL0
Ifb="B/(ΠD)≤0.25"Then
IfH<=(0.2*t-c)Then
score="2级"
ElseIfH<=(0.25*t-c)Then
score="3级"
Else
score="4级"
EndIf
ElseIfb="0.25
IfH<=(0.15*t-c)Then
score="2级"
ElseIfH<=(0.2*t-c)Then
score="3级"
Else
score="4级"
EndIf
EndIf
EndIf
CaseElse
score="-级"
'MsgBox"请用下拉菜单输入管道级别!
"
EndSelect
EndFunction
PublicFunctionscoreN(GC,p,bAsString,t,c,HAsSingle)AsString
Application.VolatileTrue
'GC1管道
IfGC=""Then
scoreN="无"
EndIf
IfGC="GC1"Then
'P<0.3PL0条件
Ifp="P<0.3PL0"Then
SelectCaseb
CaseIs="B/(ΠD)≤0.25"
IfH<=(0.3*t-c)Then
scoreN="0.30t-C"
ElseIfH<=(0.35*t-c)Then
scoreN="0.35t-C"
Else
scoreN="超标"
EndIf
CaseIs="0.25
IfH<=(0.2*t-c)Then
scoreN="0.20t-C"
ElseIfH<=(0.3*t-c)Then
scoreN="0.30t-C"
Else
scoreN="超标"
EndIf
CaseElse
IfH<=(0.15*t-c)Then
scoreN="0.15t-C"
ElseIfH<=(0.2*t-c)Then
scoreN="0.20t-C"
Else
scoreN="超标"
EndIf
EndSelect
EndIf
'***********************************
'0.3PL0
Ifp="0.3PL0
Ifb="B/(ΠD)≤0.25"Then
IfH<=(0.15*t-c)Then
scoreN="0.15t-C"
ElseIfH<=(0.2*t-c)Then
scoreN="0.20t-C"
Else
scoreN="超标"
EndIf
ElseIfb="0.25
IfH<=(0.1*t-c)Then
scoreN="0.10t-C"
ElseIfH<=(0.15*t-c)Then
scoreN="0.15t-C"
Else
scoreN="超标"
EndIf
EndIf
EndIf
EndIf
'*************************************
'GC2或GC3管道
IfGC="GC2"OrGC="GC3"Then
'P<0.3PL0条件
Ifp="P<0.3PL0"Then
SelectCaseb
CaseIs="B/(ΠD)≤0.25"
IfH<=(0.33*t-c)Then
scoreN="0.33t-C"
ElseIfH<=(0.4*t-c)Then
scoreN="0.40t-C"
Else
scoreN="超标"
EndIf
CaseIs="0.25
IfH<=(0.25*t-c)Then
scoreN="0.25t-C"
ElseIfH<=(0.33*t-c)Then
scoreN="0.33t-C"
Else
scoreN="超标"
EndIf
CaseElse
IfH<=(0.2*t-c)Then
scoreN="0.20t-C"
ElseIfH<=(0.25*t-c)Then
scoreN="0.25t-C"
Else
scoreN="超标"
EndIf
EndSelect
EndIf
'***********************************
'0.3PL0
Ifp="0.3PL0
Ifb="B/(ΠD)≤0.25"Then
IfH<=(0.2*t-c)Then
scoreN="0.20t-C"
ElseIfH<=(0.25*t-c)Then
scoreN="0.25t-C"
Else
scoreN="超标"
EndIf
ElseIfb="0.25
IfH<=(0.15*t-c)Then
scoreN="0.15t-C"
ElseIfH<=(0.2*t-c)Then
scoreN="0.20t-C"
Else
scoreN="超标"
EndIf
EndIf
EndIf
EndIf
EndFunction
结束语
通过ExcelVBA很好的实现了,压力容器、压力管道定期检验中的自动计算,减轻了我公司检验员的工作量,提高了效率。