数值函数系列之一

‘将任意整数分解为等比数列之中的数值
Dim vRet As Variant
vRet = GeometricSeriesEx(2147483647)
For I = LBound(vRet) To UBound(vRet)
Debug.Print vRet(I)
Next I

Public Function GeometricSeriesEx(ByVal lData As Long) As Variant ‘分解整数为 1 2 4 8 16 32 64 … …,且每个数只出现一次
Dim I As Integer, J As Integer
If Not IsNumericEx(lData) Then Exit Function
Dim sBin As String
sBin = DEC_to_BIN(lData)
Dim iCount As Integer
Dim TempArray() As Long
For I = 1 To Len(sBin)
If Mid(sBin, I, 1) = “1” Then
ReDim Preserve TempArray(0 To iCount)
TempArray(iCount) = 2 ^ (Len(sBin) – I)
iCount = iCount + 1
End If
Next I
GeometricSeriesEx = TempArray
End Function

Public Function DEC_to_BIN(Dec As Long) As String ‘十进制转化为二进制
DEC_to_BIN = “”
Do While Dec > 0
DEC_to_BIN = Dec Mod 2 & DEC_to_BIN
Dec = Dec \ 2
Loop
End Function

Public Function IsNumericEx(ByVal sData As String) As Boolean ‘电子表格空格被 IsNumeric 视为数值 0,IsNumericEx 则视为字符 “”
IsNumericEx = False
sData = Trim(sData)
If sData = “” Then Exit Function
IsNumericEx = IsNumeric(sData)
End Function

Public Function IsInteger(ByVal txtString As String) As Boolean ‘是数值,且是整数
IsInteger = True
If Not IsNumeric(txtString) Then
IsInteger = False
Exit Function
End If
If Not CDbl(txtString) / 1 = CDbl(txtString) \ 1 Then
IsInteger = False
End If
End Function

Public Function IsInRange(ByVal sData As String, ByVal LowerLimit As Double, ByVal UpperLimit As Double, ByVal bAllowThreshold As Boolean) As Boolean ‘判断某数据是不是数值,且是否在界内
IsInRange = False
If Not IsNumeric(sData) Then Exit Function ‘字符等视为越界,防止以下比较时发生错误
If bAllowThreshold Then ‘压界算在界内
If CDbl(sData) > UpperLimit Then Exit Function ‘越上界
If CDbl(sData) < LowerLimit Then Exit Function ‘越下界 Else ‘压界不算在界内 If CDbl(sData) >= UpperLimit Then Exit Function ‘越上界
If CDbl(sData) <= LowerLimit Then Exit Function ‘越下界
End If
IsInRange = True
End Function

二十八星宿对应分野

角、亢、(氏)〔氐〕,鄭,兗州:東郡入角一度;東平、任城、(由)〔山〕陽入角六度;泰山入角十二度;濟北、陳留入亢五度;濟陰入氐一度;東平入氐七度。

  房、心,宋,豫州:潁川入房一度;汝南入房二度;沛郡入房四度;梁國入房五度;淮陽入心一度;魯國入心三度;楚國入心四度。

  箕、尾,燕,幽州:營州(人)〔入〕箕中十度;上谷入尾一度;漁陽入尾三度;右北平入尾七度;西河、上郡、北地、遼西東入尾十度;涿郡入尾十六度;渤海入箕一度;樂浪入箕三度;玄菟入箕六度;廣陽入箕九度。

  斗、牽牛、須女,吳、越,揚州:九江入斗一度;廬江入斗六度;豫章入斗十度;丹陽入斗十六度;會稽入牛一度;臨淮入牛四度;廣陵入牛八度;泗水入女一度;六安入牛六度。

  虛、危,齊,青州:齊國入虛六度;北海入虛九度;濟南入危一度;樂安入危四度;東萊入危九度;平原入危十一度;淄州入危十四度。

  營室、東壁,衛,并州:安定入營室一度;天水入營室八度;隴西入營室四度;酒泉入營室十一度;張掖入營室十二度;武都入東壁一度;金城入東壁四度;武威入東壁六度;燉(威)〔煌〕入東壁八度。

  奎、婁、胃,魯,徐州:東海入奎一度;瑯邪入奎一度;琅密入婁一度;(陽城)〔城陽〕入婁九度;膠東入胃(七)〔一〕度。

  昴、畢,趙,冀州:魏郡入昴一度;鉅鹿入昴三度;常山入昴五度;廣平入昴七度;中山入昴一度;清河入昴九度;信都入(十)〔畢〕三度;趙郡入畢八度;安平入畢四度;河間入畢十度;真定入畢十三度。

  觜、參,魏,益州:廣漢入觜一度;越巂入觜三度;蜀郡入觜一度;犍為入參三度;牁入參五度;巴郡入參五度;漢中入參九度;益州入參七度。

  東井、輿鬼,秦,雍州:雲中入東井一度;定襄入東井八度;雁門入東井十六度;代郡入東井二十八度;太原入東井二十九度;上黨入輿鬼二度。

  柳、七星、張,周,三輔:弘農入柳一度;河南入七星三度;河東入張三度;河內入張九度。

  翼、軫,楚,荊州:南陽入翼六度;南郡入翼十度;江夏入翼十二度,零陵入軫十一度;桂陽入軫六度;武陵入軫十度,長沙入軫十六度。

Excel 函数系列之一

Public Function MinRow(ByVal vSheet As Variant) As Integer ‘有内容的最小行号
MinRow = -1
On Error Resume Next
If vSheet Is Nothing Then Exit Function
vSheet.Activate
MinRow = vSheet.UsedRange.Rows(vSheet.UsedRange.Rows.Count).Row – vSheet.UsedRange.Rows.Count + 1
On Error GoTo 0
End Function

Public Function MaxRow(ByVal vSheet As Variant) As Integer ‘有内容的最大行号
MaxRow = -1
On Error Resume Next
If vSheet Is Nothing Then Exit Function
vSheet.Activate
MaxRow = vSheet.UsedRange.Rows(vSheet.UsedRange.Rows.Count).Row
On Error GoTo 0
End Function

Public Function MinColumn(ByVal vSheet As Variant) As Integer ‘有内容的最小列号
MinColumn = -1
On Error Resume Next
If vSheet Is Nothing Then Exit Function
vSheet.Activate
MinColumn = vSheet.UsedRange.Columns(vSheet.UsedRange.Columns.Count).Column – vSheet.UsedRange.Columns.Count + 1
‘vSheet.Cells.Find(“*”, , , , 2, 1).Column 同
On Error GoTo 0
End Function

Public Function MaxColumn(ByVal vSheet As Variant) As Integer ‘有内容的最大列号
MaxColumn = -1
On Error Resume Next
If vSheet Is Nothing Then Exit Function
vSheet.Activate
MaxColumn = vSheet.UsedRange.Columns(vSheet.UsedRange.Columns.Count).Column
‘vSheet.Cells.Find(“*”, , , , 2, 2).Column 同
If Err.Number <> 0 Then Call SaveOccurredErr(1)
If Not ExposeError Then On Error GoTo 0
End Function

Public Function SheetExist(ByVal vBook As Variant, ByVal sSheet As String) As Boolean ‘当前 WorkBook 之 Sheet 存在
On Error Resume Next
Dim I As Integer, J As Integer
SheetExist = False
If vBook Is Nothing Then Exit Function
‘If vSheet Is Nothing Then Exit Function
For I = 1 To vBook.Sheets.Count
If vBook.Sheets(I).Name = sSheet Then SheetExist = True
Next I
If Err.Number <> 0 Then SheetExist = False
On Error GoTo 0
End Function

Public Function GetColumnNumber(ByVal vSheet As Variant, ByVal sData As String, ByVal iRow As Integer) As Integer ‘确定数据在某行的哪一列,如果不存在则指向新列
Dim I As Integer, J As Integer
GetColumnNumber = 0
If vSheet Is Nothing Then Exit Function
vSheet.Activate
For J = MinColumn(vSheet) To MaxColumn(vSheet)
If sData = vSheet.Cells(iRow, J) Then GetColumnNumber = J
Next J
If GetColumnNumber = 0 Then GetColumnNumber = MaxColumn(vSheet) + 1
End Function

SWIFT

SWIFT 又称“环球同业银行金融电讯协会”,是国际银行同业间的国际合作组织,成立于一九七三年,目前全球大多数国家大多数银行已使用SWIFT系统。SWIFT的使用,使银行的结算提供了安全、可靠、快捷、标准化、自动化的通讯业务,从而大大提高了银行的结算速度。由于SWIFT的格式具有标准化,目前信用证的格式主要都是用SWIFT电文。

SWIFT(Society for Worldwide Interbank Financial Telecommunications—环球同业银行金融电讯协会),是一个国际银行间非盈利性的国际合作组织,总部设在比利时的布鲁塞尔,同时在荷兰阿姆斯特丹和美国纽约分别设立交换中心(Swifting Center),并为各参加国开设集线中心(National Concentration),为国际金融业务提供快捷、准确、优良的服务。SWIFT运营着世界级的金融电文网络,银行和其他金融机构通过它与同业交换电文(Message)来完成金融交易。除此之外,SWIFT还向金融机构销售软件和服务,其中大部分的用户都在使用SWIFT网络。

SWIFT组织成立于1973年5月,其全球计算机数据通讯网在荷兰和美国设有运行中心,在各会员国设有地区处理站,来自美国、加拿大和欧洲的15个国家的239家银行宣布正式成立SWIFT,其总部设在比利时的布鲁塞尔,它是为了解决各国金融通信不能适应国际间支付清算的快速增长而设立的非盈利性组织,负责设计、建立和管理SWIFT国际网络,以便在该组织成员间进行国际金融信息的传输和确定路由。

从1974年开始设计计算机网络系统。

1977年夏,完成了环球同业金融电信网络(SWIFT网络)系统的各项建设和开发工作,并正式投入运营。

1977年时SWIFT在全世界就拥有会员国150多个,会员银行5000多家,SWIFT系统日处理SWIFT电讯300万笔,高峰达330万笔。

到2007年6月为止,SWIFT的服务已经遍及207个国家,接入的金融机构超过8100家。台湾地区唯一的具有商业策略以及服务供应伙伴资格的是资通电脑Ares。

在国际贸易结算中,SWIFT信用证是正式的、合法的,被信用证各当事人所接受的、国际通用的信用证,信用证是指凡通过SWIFT系统开立或予以通知的信用证。采用SWIFT信用证必须遵守SWIFT的规定,也必须使用SWIFT手册规定的代号(Tag),而且信用证必须遵循国际商会2007年修订的《跟单信用证统一惯例》各项条款的规定。在SWIFT信用证可省去开证行的承诺条款(Undertaking Clause),但不因此免除银行所应承担的义务。SWIFT信用证的特点是快速、准确、简明、可靠。

该组织创立之后,其成员银行数逐年迅速增加。从1987年开始,非银行的金融机构,包括经纪人、投资公司、证券公司 和证券交易所等,开始使用 SWIFT。至2010年,该网络已遍布全球206个国家和地区的8,000多家金融机构,提供金融行业安全报文传输服务与相关接口软件,支援80多个国家和地区的实时支付清算系统。

1980年SWIFT联接到香港。我国的中国银行于1983年加入SWIFT,是SWIFT组织的第1034家成员行,并于1985年5月正式开通使用,成为我国与国际金融标准接轨的重要里程碑。之后,我国的各国有商业银行及上海和深圳的证券交易所,也先后加入SWIFT。

进入90年代后,除国有商业银行外,中国所有可以办理国际银行业务的外资和侨资银行以及地方性银行纷纷加入SWIFT。SWIFT的使用也从总行逐步扩展到分行。1995年,SWIFT在北京电报大楼和上海长话大楼设立了SWIFT访问点SAP(SWIFT Access Point),它们分别与新加坡和香港的SWIFT区域处理中心主节点连接,为用户提供自动路由选择。

为更好地为亚太地区用户服务,SWIFT于1994 年在香港设立了除美国和荷兰之外的第三个支持中心,这样,中国用户就可得到SWIFT支持中心讲中文的员工的技术服务。SWIFT还在全球17个地点设有办事处,其2000名的专业人员来自55个国家,其中北京办事处于1999年成立。

全世界金融数据传输、文件传输、直通处理STP(Straight Through Process)、撮合,清算和净额支付服务、操作信息服务、软件服务、认证技术服务、客户培训和24小时技术支持。

SWIFT自投入运行以来,以其高效、可靠、低廉和完善的服务,在促进世界贸易的发展,加速全球范围内的货币流通和国际金融结算,促进国际金融业务的现代化和规范化方面发挥了积极的作用。我国的中国银行、中国农业银行、中国工商银行、中国建设银行、交通银行、中信实业银行等已成为环球银行金融通信协会的会员。这也就是为什么PP只支持电汇这几家国内银行的原因。

SWIFT的设计能力是每天传输1100万条电文,而当前每日传送500万条电文,这些电文划拨的资金以万亿美元计,它依靠的便是其提供的240种以上电文标准。SWIFT的电文标准格式,已经成为国际银行间数据交换的标准语言。这里面用于区分各家银行的代码,就是SWIFT Code,依靠SWIFT Code便会将相应的款项准确的汇入指定的银行。

SWIFT Code是由该协会提出并被ISO通过的银行识别代码,其原名是BIC(Bank Identifier Code),但是BIC这个名字意思太泛,担心有人理解成别的银行识别代码系统,故渐渐大家约定俗成地把BIC叫作SWIFT Code了。SWIFT是(Society for Worldwide Interbank Financial Telecommunications)环球银行间金融通信协会是一个由金融机构共同拥有的私营股份公司,按比利时的法律登记注册,由会员银行和其他金融 机构协同管理。

SWIFT银行识别代码

每家申请加入SWIFT组织的银行都必须事先按照SWIFT组织的统一原则,制定出本行的SWIFT地址代码,经 SWIFT组织批准后正式生效。银行识别代码(Bank Identifier Code—BIC)是由电脑可以自动判读的八位或是十一位英文字母或阿拉伯数字组成,用于在SWIFT电文中明确区分金融交易中相关的不同金融机构。 凡该协会的成员银行都有自己特定的SWIFT代码,即SWIFT Code。在电汇时,汇出行按照收款行的SWIFT Code发送付款电文,就可将款项汇至收款行。该号相当于各个银行的身份证号。

十一位数字或字母的BIC可以拆分为银行代码、国家代码、地区代码和分行代码四部分。以中国银行北京分行为例,其银行识别代码为BKCHCNBJ300。其含义为:BKCH(银行代码)、CN(国家代码)、BJ(地区代码)、300(分行代码)。

(1)银行代码(Bank Code):由四位英文字母组成,每家银行只有一个银行代码,并由其自定,通常是该行的行名字头缩写,适用于其所有的分支机构。

(2)国家代码(Country Code):由两位英文字母组成,用以区分用户所在的国家和地理区域。

(3)地区代码(Location Code):由0、1以外的两位数字或两位字母组成,用以区分位于所在国家的地理位置,如时区、省、州、城市等。

(4)分行代码(Branch Code):由三位字母或数字组成,用来区分一个国家里某一分行、组织或部门。如果银行的BIC只有八位而无分行代码时,其初始值订为“XXX”。

同时,SWIFT还为没有加入SWIFT组织的银行,按照此规则编制一种在电文中代替输入其银行全称的代码。所有此类代码均在最后三位加上“BIC”三个字母,用来区别于正式SWIFT会员银行的SWIFT地址代码。

SWIFT Code的查询方法

要查询某家银行的SWIFT Code,推荐的方式是:

(1)直接去银行询问工作人员

(2)可以打电话咨询。

(3)通过SWIFT的官方网站查询:

①精确查找,进入网站后,如果你知道银行的SWIFT代码(BIC Code)或机构关键字(Institution Keyword),可以做快速查找它的信息;例如:中国银行的 关键字是Bank of China,输入就可以查询中国银行在全世界的分行的SWIFT Code,当然包括大陆各地的代码。从搜索结果可以看到,内地分行的开始8位全部是BKCHCNBJ,可以直接在BIC搜索下输入这8位,列出国内中国银 行各地分行的SWIFT Code。

②若不太清楚,那么就可进入另一个查询页面,进行详细的查找,点击下方的位置即可进入。

国内各银行总行的SWIFT代码

中国银行:BKCHCNBJ

工商银行:ICBKCNBJ

建设银行:PCBCCNBJ

农业银行:ABOCCNBJ

招商银行:CMBCCNBS

交通银行:COMMCN

中信银行:CIBKCNBJ

兴业银行:FJIBCNBA

民生银行:MSBCCNBJ

华夏银行:HXBKCN

浦发银行:SPDBCNSH

汇丰银行:HSBCCNSH

渣打银行:SCBLCNSX

花旗银行:CITICNSX

德意志银行:DEUTCNSH

瑞士银行:UBSWCNBJ

荷兰银行:ABNACNSH

香港汇丰:BLICHKHK

香港花旗:CITIHK

香港东亚银行:BEASCNSH

代码后需要统一添加分行阿拉伯数字代号。

AutoCAD 选择图元

‘本节介绍几个知识点,即建立过滤器、建立选择集、四种方式选择图元。

'打开并绑定文件 D:/Test.dwg
Dim I As Integer, J As Integer
Dim oAutoCAD As Object
Call BindAutoCAD(True)
Dim oDraw As Object
Set oDraw = oAutoCAD.Application.Documents.Open("D:/Test.dwg")

'申明选择集及集成员
Dim oSelset As Object, oItem As Object

'建立过滤器,目标是位于 0 层的红色的单行文字、直线、圆(半径为15)、样条曲线、多义线
Dim FilterType(13) As Integer
Dim FilterData(13) As Variant
FilterType(0) = -4
FilterData(0) = "<AND"
FilterType(1) = 8 'Layer
FilterData(1) = "0"
FilterType(2) = 62 'Color
FilterData(2) = 1 'Red
FilterType(3) = -4
FilterData(3) = "<OR"
FilterType(4) = 0 '图元
FilterData(4) = "text"
FilterType(5) = 0 '图元
FilterData(5) = "line"
FilterType(6) = -4
FilterData(6) = "<AND"
FilterType(7) = 0 '图元
FilterData(7) = "circle"
FilterType(8) = 40 '半径
FilterData(8) = 15
FilterType(9) = -4
FilterData(9) = "AND>"
FilterType(10) = 0 '图元
FilterData(10) = "spline"
FilterType(11) = 0 '图元
FilterData(11) = "Polyline"
FilterType(12) = -4
FilterData(12) = "OR>"
FilterType(13) = -4
FilterData(13) = "AND>"

'点选式选择图元,同时满足过滤器原则
Call AppActivate(oAutoCAD.Caption)
Set oSelset = oDraw.SelectionSets.Add(SelName(8))
oSelset.Select 5, , , FilterType, FilterData
'acSelectionSetWindow = 0;
'acSelectionSetCrossing = 1;
'acSelectionSetFence = 2;
'acSelectionSetPrevious = 3;
'acSelectionSetLast = 4;
'acSelectionSetAll = 5;
For I = 0 To oSelset.Count - 1
Debug.Print Replace(oSelset(I).ObjectName, "AcDb", "", 1, -1, vbTextCompare)
Next I
Debug.Print

'屏幕选择图元,同时满足过滤器原
Call AppActivate(oAutoCAD.Caption)
Set oSelset = oDraw.SelectionSets.Add(SelName(8))
oSelset.SelectOnScreen FilterType, FilterData
For I = 0 To oSelset.Count - 1
Debug.Print Replace(oSelset(I).ObjectName, "AcDb", "", 1, -1, vbTextCompare)
Next I
Debug.Print

'多边形选择图元,同时满足过滤器原则
Call AppActivate(oAutoCAD.Caption)
Set oSelset = oDraw.SelectionSets.Add(SelName(8))
Dim PointArray(0 To 11) As Double
PointArray(0) = 0
PointArray(1) = 0
PointArray(2) = 0
PointArray(3) = 77
PointArray(4) = 380
PointArray(5) = 0
PointArray(6) = 215
PointArray(7) = 425
PointArray(8) = 0
PointArray(9) = 466
PointArray(10) = 188
PointArray(11) = 0
oSelset.SelectByPolygon 2, PointArray, FilterType, FilterData
'acSelectionSetFence = 0
'acSelectionSetWindowPolygon = 1
'acSelectionSetCrossingPolygon = 2
For I = 0 To oSelset.Count - 1
Debug.Print Replace(oSelset(I).ObjectName, "AcDb", "", 1, -1, vbTextCompare)
Next I
Debug.Print

'通过某点选择图元,同时满足过滤器原则
Call AppActivate(oAutoCAD.Caption)
Set oSelset = oDraw.SelectionSets.Add(SelName(8))
Dim TempPoint(0 To 2) As Double
TempPoint(0) = 10
TempPoint(1) = 10
TempPoint(2) = 0
oSelset.SelectAtPoint TempPoint, FilterType, FilterData
For I = 0 To oSelset.Count - 1
Debug.Print Replace(oSelset(I).ObjectName, "AcDb", "", 1, -1, vbTextCompare)
Next I
Debug.Print