字符串函数系列之一

Public Function SelName(ByVal iNumber As Integer) As String ‘生成 iNumber 位数的字符串
Dim I As Integer, J As Integer
Dim ReservedArray As Variant
ReservedArray = Array(“MANUALLY”, “SUPPORT”, “OHTLLINE”, “ACAD”, “WCAD”)
ERR_AVOID:
SelName = “”
Randomize
For I = 1 To iNumber
SelName = SelName & Chr((64 + Int((26 * Rnd) + 1)))
Next I
If IsInArray(SelName, ReservedArray) Then GoTo ERR_AVOID
End Function

Public Function CountStr(ByVal bOverlapable As Boolean, ByVal sMom As String, ByVal sSon As String) As Integer ‘sSon 在 sMom 中出现的次数
CountStr = 0
Do While InStr(1, sMom, sSon, vbTextCompare) > 0
CountStr = CountStr + 1
If bOverlapable Then ‘允许重复计数,如 nnn 中含两个 nn
sMom = Right(sMom, Len(sMom) – InStr(1, sMom, sSon, vbTextCompare))
Else ‘不允许重复计数,如 nnn 中含一个 nn
sMom = Right(sMom, Len(sMom) – InStr(1, sMom, sSon, vbTextCompare) – (Len(sSon) – 1))
End If
Loop
End Function

Public Function ExtractDivide(ByVal sLetter As String, ByVal sData As String, ByVal iOrder As Integer) As String ‘读出由 sLetter 分割的第 IOrder 节子字符串
ExtractDivide = “”
If sData = “” Then Exit Function
If iOrder < 1 Then Exit Function If iOrder > CountStr(False, sData, sLetter) + 1 Then Exit Function
sData = Trim(sData)
Dim TempArray As Variant
TempArray = Split(sData, sLetter, -1, vbTextCompare)
ExtractDivide = TempArray(iOrder – 1)
ExtractDivide = Trim(ExtractDivide)
End Function

Public Function CutLeft(ByVal sOriginal As String, ByVal sCut As String) As String ‘去掉左侧字符 sCut 一次(如果有)
CutLeft = LTrim(sOriginal)
If InStr(1, sOriginal, sCut, vbTextCompare) = 1 Then CutLeft = Right(sOriginal, Len(sOriginal) – Len(sCut))
End Function

Public Function CutRight(ByVal sOriginal As String, ByVal sCut As String) As String ‘去掉右侧字符 sCut 一次(如果有)
CutRight = RTrim(sOriginal)
If CutRight = “” Then Exit Function
If InStrRev(sOriginal, sCut, -1, vbTextCompare) = Len(sOriginal) – Len(sCut) + 1 Then CutRight = Left(sOriginal, Len(sOriginal) – Len(sCut))
End Function

Public Function CutTerminal(ByVal sOriginal As String, ByVal sCut As String) As String ‘去掉两端字符 sCut 一次(如果有)
CutTerminal = Trim(sOriginal)
CutTerminal = CutLeft(CutTerminal, sCut)
CutTerminal = CutRight(CutTerminal, sCut)
End Function

Public Function PurgeLeft(ByVal sOriginal As String, ByVal sPurge As String) As String ‘去掉左侧字符 sPurge(所有)
sOriginal = LTrim(sOriginal)
If sPurge = vbCr Or sPurge = vbLf Or sPurge = vbCrLf Then
Do While Asc(Left(sOriginal, Len(sPurge))) = Asc(sPurge)
sOriginal = Right(sOriginal, Len(sOriginal) – Len(sPurge))
sOriginal = LTrim(sOriginal)
Loop
Else
Do While InStr(1, sOriginal, sPurge, vbTextCompare) = 1 And Len(sOriginal) – Len(sPurge) > -1
sOriginal = Right(sOriginal, Len(sOriginal) – Len(sPurge))
sOriginal = LTrim(sOriginal)
Loop
End If
PurgeLeft = sOriginal
End Function

Public Function PurgeRight(ByVal sOriginal As String, ByVal sPurge As String) As String ‘去掉右侧字符 sPurge(所有)
sOriginal = RTrim(sOriginal)
If sPurge = vbCr Or sPurge = vbLf Or sPurge = vbCrLf Then
Do While Asc(Right(sOriginal, Len(sPurge))) = Asc(sPurge)
sOriginal = Left(sOriginal, Len(sOriginal) – Len(sPurge))
sOriginal = RTrim(sOriginal)
Loop
Else
Do While InStrRev(sOriginal, sPurge, -1, vbTextCompare) = Len(sOriginal) – Len(sPurge) + 1 And Len(sOriginal) – Len(sPurge) > -1
sOriginal = Left(sOriginal, Len(sOriginal) – Len(sPurge))
sOriginal = RTrim(sOriginal)
Loop
End If
PurgeRight = sOriginal
End Function

Public Function PurgeTerminal(ByVal sOriginal As String, ByVal sPurge As String) As String ‘去掉两端字符 sPurge(所有)
sOriginal = PurgeLeft(sOriginal, sPurge)
sOriginal = PurgeRight(sOriginal, sPurge)
PurgeTerminal = sOriginal
End Function

Public Function GetAPIString(ByVal sAPI As String) As String ‘字符包装,用于处理 API 返回字符
On Error Resume Next
Dim iZeroPos As Integer
iZeroPos = InStr(sAPI, Chr$(0))
If iZeroPos > 0 Then
GetAPIString = Left$(sAPI, iZeroPos – 1)
Else
GetAPIString = sAPI
End If
On Error GoTo 0
End Function

数组函数系列之一

Public Function IsInArray(ByVal sData As String, ByVal vData As Variant) As Boolean ‘某字符串是否在某一维数组中
IsInArray = False
If Not IsArray(vData) Then Exit Function
If IsEmptyArray(vData) Then Exit Function
Dim I As Integer
For I = LBound(vData) To UBound(vData)
If sData = vData(I) Then IsInArray = True
Next I
End Function

Public Function IsEmptyArray(ByVal sArray As Variant) As Boolean ‘判断一维数组为空或者尚未初始化
‘类似 Dim TestArray(0 To 2) As String,一经申明,各元素即被赋 “” 值,IsEmptyArray 为 False;
‘类似 Dim TestArray() As String,虽经申明,仍为空数组,IsEmptyArray 为 True。
Dim I As Integer, J As Integer
On Error GoTo ERR_EMPTY
I = UBound(sArray) ‘试错
If LBound(sArray) > UBound(sArray) Then GoTo ERR_EMPTY
IsEmptyArray = False
On Error GoTo 0
Exit Function
ERR_EMPTY:
IsEmptyArray = True
On Error GoTo 0
End Function

Public Function IndexInArray(ByVal sData As String, ByVal vData As Variant) As Integer ‘某数值在某一维数组中的位次(以最小号为准, 不存在则为 -1)
Dim I As Integer, J As Integer
IndexInArray = -1
If Not IsArray(vData) Then Exit Function
If IsEmptyArray(vData) Then Exit Function
For I = LBound(vData) To UBound(vData)
If LCase(sData) = LCase(vData(I)) Then
IndexInArray = I
Exit For
End If
Next I
End Function

Public Sub CleanUpArray(vData As Variant) ‘剔除数组中的重复数据
If Not IsArray(vData) Then Exit Sub ‘数组判断
If IsEmptyArray(vData) Then Exit Sub
Dim LO, HI As Integer ‘上下界
LO = LBound(vData)
HI = UBound(vData)
Dim I, J, KCount As Integer
KCount = 0 ‘计数器
Dim DupeIndex() As String ‘重复数据的序号组成的数组,记后不记前
For I = HI To LO Step -1
For J = I – 1 To LO Step -1
If vData(I) = vData(J) Then
KCount = KCount + 1
ReDim Preserve DupeIndex(1 To KCount) As String
DupeIndex(KCount) = CStr(I)
Exit For
End If
Next J
Next I
If KCount > 0 Then ‘有重复
Dim iCount As Integer
iCount = LO – 1 ‘计数器
Dim TempArray() As String
For I = LO To HI
If Not IsInArray(CStr(I), DupeIndex()) Then ‘首次出现或未重复的数据
iCount = iCount + 1
ReDim Preserve TempArray(LO To iCount) As String
TempArray(iCount) = vData(I)
End If
Next I
ReDim vData(LO To iCount) ‘ As String ‘重新赋值并返回
For I = LO To iCount
vData(I) = TempArray(I)
Next I
Else
‘无重复,不处理
End If
Erase DupeIndex
End Sub

施华洛世奇

在奥地利西部蒂罗尔州, 有一个名叫瓦腾斯的小镇,这里地处偏僻的阿尔卑斯山下,常住居民不过数千人,每天却有成千上万的游客蜂拥而至。

在山麓间,远远便能看到一个造型奇特的阿尔卑斯山巨人,两只镶嵌了宝石的眼睛在阳光下闪闪夺目。这个巨人正是大名鼎鼎的奥地利水晶品牌施华洛世奇在1995年百年华诞之际,依山而建的“施华洛世奇水晶世界”。其总部和水晶世界博物馆也坐落于此。

作为全球首屈一指的水晶品牌,施华洛世奇2017年销售额达到42亿美元。目前在全球约170个国家开设了2680 间分店,员工人数超过2.6万人。历经五代,这家建立超过百年的古老而神秘的公司仍保持着家族经营方式,独揽与水晶切割有关的专利,把水晶制作工艺作为商业秘密代代相传。

如今,人们络绎不绝来到瓦腾斯小镇,为的不仅是一饱眼福参观名师之手设计而成的各种流光溢彩的水晶作品,更是来探寻这个家族背后隐藏的保存了一百多年的水晶秘密。

发明自动水晶切割机

在瓦腾斯小镇,你能看到最华贵的水晶墙、各式光怪陆离的玻璃和水晶艺术品和栩栩如生的水晶雕像。但如果想要到不远处的水晶工厂参观,工作人员则会礼貌地拒绝你。他们会告诉你,施华洛世奇水晶制作过程不向外人开放。

从创始人丹尼尔·施华洛世奇开始,水晶制作工艺的不断创新便成为这个品牌发展的不竭动力。

1862年,丹尼尔出生在前奥匈帝国版图内的波西米亚(今捷克境内),那里是世界玻璃和水晶手工制造的发源地。丹尼尔的父母曾在那里经营着一间水晶切割小作坊。从小他便跟随父亲学习宝石打磨,用于装饰胸针、发针、发梳等饰物。

1883年,丹尼尔接手家族生意,成立了一家珠宝公司,专营宝石切割打磨。彼时,西门子在1866年发明了世界上第一台直流电动机;爱迪生在1879年发明了电灯。这场电气革命给了丹尼尔灵感,他决心发明一台自动水晶切割机。

经过九年反复的实验,1892年,第一台可以完美切割水晶的自动切割机问世。与当时的手工技术相比,这台机器的切割速度更快,精准度更高,能将水晶巧妙地打磨出数十个切面,对光线有极好的折射能力。丹尼尔带领水晶制造业进入了一个新时代。

为了保证自己发明的技术和机器不被同行窃取,丹尼尔一方面对技术申请了专利;另一方面,丹尼尔背井离乡从波希米亚迁至奥地利,与魏斯、考斯曼两个合伙人建立起施华洛世奇公司,开始生产水晶。

丹尼尔把厂址选在阿尔卑斯山奥地利一侧的瓦腾斯。这里不仅有足够的水源带动水晶加工机器运转,也远离他们的竞争对手,可以避免别人偷取他们的技术和设计。此外,这里交通便利,方便抵达水晶制品需求量极大的时尚之都巴黎。

至此,丹尼尔一手打造的施华洛世奇水晶帝国雏形初现。

缔造水晶帝国

丹尼尔是一个有野心的人,面对水晶有限的存量,如何能够不断扩大自己的事业是个难题。善于创新的丹尼尔产生了制造人造水晶的念头。

1908年,丹尼尔和他的三个儿子开始试制人造水晶。他们花3年时间设计制作了融化炉。从1913年起,施华洛世奇开始大规模生产无瑕疵人造水晶石,这些水晶及宝石产品很快受到了市场的热烈追捧。

创新是施华洛世奇面对困境时绝处逢生的密钥。在一战期间,战乱频仍、经济动荡,面对缺少机械设备和原材料的窘境,施华洛世奇开始生产自己的水晶打磨工具。几年后,为响应市场需求,施华洛世奇又建立了自己的高档玻璃工厂。

20世纪20年代,欧美时尚界开始流行装饰着珍珠和水晶的裙装。丹尼尔从中看到了新商机。1931年,施华洛世奇发明了一种大受时尚界欢迎的饰带,上面缀满漂亮的碎水晶,可以直接缝在衣服或鞋子上。施华洛世奇的水晶由此成了抢手货,在香奈儿、GUCCI、迪奥等顶级时尚品牌以及电影公司和众多好莱坞明星之间左右逢源。

此后,施华洛世奇声名鹊起,公司的产品线不断地延伸到各行业:时装、鞋帽、手表、首饰等。他的长子威廉·施华洛世奇甚至将产品延伸至望远镜。而像纽约大都会剧院、巴黎凡尔赛宫这样的世界级殿堂的水晶吊灯都是来自施华洛世奇出品的“STRASS”。

1956年,为施华洛世奇贡献了一生的丹尼尔去世,但施华洛世奇的创新脚步并未停止。20世纪80年代,施华洛世奇首间专卖店开设,并以创新别致的首饰和仿水晶塑像风靡全球。其每年推出的限量版圣诞挂饰,亦会在全球收藏家中掀起一股新热潮。

目前,施华洛世奇在奥地利、印度、泰国、越南、塞尔维亚和美国都有生产基地,而中国则是其最大的市场。

奥地利的洛克菲勒

施华洛世奇家族的成功,一方面得益于创新,更离不开传承。

施华洛世奇一直采用家族经营模式。创始人丹尼尔去世后,他身后留下了一个庞大的家族。目前,施华洛世奇已经传了5代,家族的成员已超过150人。

虽然这家企业中的家族股东超过60位,但据穆迪的分析公司Bureau van Dijk数据分析显示,家族中的最大股东为掌控了家族事业35年的第四代传人葛诺·朗恩斯·施华洛世奇。根据彭博亿万富翁指数显示,葛诺控股的股份价值约13亿美元。

葛诺于2002年把接力棒传到了第5代成员的手中,如今家族中有28人在公司内从事高级管理工作,并由5人构成公司的最高决策和管理层。葛诺的儿子马可思·朗恩斯·施华洛世奇负责水晶业务。

近些年来,相比于其主要竞争对手,未能跟上电商趋势的施华洛世奇的业绩显得有些逊色。在接受彭博社采访时,负责集团公关、设计服务的娜佳·施华洛世奇表示,伴随着亚马逊和阿里巴巴等电商巨头的崛起,升级数字战略显得尤其重要,而首次公开募股(IPO)有助于集团在北美市场和数字渠道的扩张。不过,她也坦承,IPO目前对家族成员来说并非热门话题。

此外,这一被《福布斯》杂志誉为奥地利的“洛克菲勒”的家族,面对全球化带来的财富和声誉,现在更加注重于企业形象的维护。除了完善职工福利设施之外,还把大量资金投入环保节能、艺术文化上的项目。

2011年,施华洛世奇选用了天鹅作为公司的标识。在希腊、罗马、印度和德国的神话故事里,天鹅象征着纯洁、力量和神圣不可侵犯。如今,在第五代家族成员的带领下,这只优雅的“天鹅”正在靠着不断的传承和坚持大胆创新向远空飞翔。

Microsoft Excel 填充单元格

Dim oExcel As Object
Call BindExcel(True)

Dim oBook As Object
Dim oSheet As Object
Set oBook = oExcel.ActiveWorkBook
Set oSheet = oBook.ActiveSheet

oSheet.Cells(1, 1) = “1001”
oSheet.Cells(1, 2) = “1003”
oSheet.Cells(1, 3) = “1005”
oSheet.Cells(1, 4) = “1010”
oSheet.Cells(1, 5) = “1040”
oSheet.Cells(2, 1) = “属性
oSheet.Cells(2, 2) = “PROFILE”
oSheet.Cells(2, 3) = “467”
oSheet.Cells(3, 4) = “26.3333,236.0000,0.0000|26.3333,268.0000,0.0000” ‘两组坐标值
oSheet.Cells(3, 5) = “6885.44

Microsoft Excel 基本操作

‘绑定 Microsoft Excel
Dim oExcel As Object ‘Microsoft Excel Application 本身
Call BindExcel(True)
Dim oBook As Object ‘Microsoft Excel 多工作薄之一
Dim oSheet As Object ‘工作薄的工作表之一

‘打开并绑定文件 D:/Test.xls
Set oBook = oExcel.Application.WorkBooks.Open(“D:/Test.xls”)

‘绑定已经打开文件 Demo.xls
Set oBook = oExcel.WorkBooks.Item(“Demo.xls”)

‘新建文件并绑定
Set oBook = oExcel.WorkBooks.Add

‘绑定已经打开的当前文件
Set oBook = oExcel.ActiveWorkBook

绑定已有工作表 Sheet1
Set oSheet = oBook.Sheets(“Sheet1”)

‘新建工作表并绑定
Set oSheet = oBook.Worksheets.Add
oSheet.Name = “New Sheet”

‘绑定已经打开的当前工作表
Set oSheet = oBook.ActiveSheet

‘另存文件并指定格式
oBook.SaveAs “D:/TestBack.xls”, FileFormat:=18 ‘Excel Format

‘退出 Microsoft Excel 并释放资源
oExcel.Quit
Set oExcel = Nothing
Set oBook = Nothing
Set oSheet = Nothing