成吉思汗西征之四路围攻

1219年秋,蒙古大军进军到花剌子模边疆后,兵分四路先扫清外围,然后重点进攻新都撒马尔罕:第一路,由察合台、窝阔台率领,进攻讹答剌;第二路术赤(成吉思汗长子)率师攻取锡尔河畔诸城;第三军由阿剌黑率领,攻取忽毡(今土库曼斯坦阿什哈巴德)和别纳客忒(今乌兹别克斯坦塔什干南);第四路,由成吉思汗与托雷(成吉思汗四子)取中路,进攻不花剌城。花喇子模新都撒马尔罕在不花剌城以东,旧都玉龙杰赤城在不花剌城西北。摩诃末·苏丹驻扎在新都,母后秃儿罕哈墩驻旧都。成吉思汗首站任务是攻取讹答剌城等边界城市,然主攻不花剌城,切断新旧二都之间的联系,使其首尾不能相顾。

1219年9月,察合台、窝阔台的一路军开始攻打讹答剌城,征伐讹答剌城是蒙古军队和花喇子模军队的序幕之战,它的胜败对于双方的都有着具大的战略意义。

讹答剌城(位于哈萨克斯坦南哈萨克斯坦州奇姆肯特市阿雷思河和锡尔河交汇处)是花剌子模王国东方重镇。城墙和防御工事极为坚固,守军达4万人并集中储备了大量的战略物资。守将便是错杀蒙古商队的罪魁祸首亦纳勒术;副将是哈剌察,亦纳勒术心里清楚这场战争因自己而挑起,所以率领部众死守城池。

这场城池攻坚战非常惨烈,亦纳勒术抵档住了蒙古大军多次进攻,但毕竟已成瓮中之鳖在抵抗了5个月后,终于开始失去了信心、军民斗志开始涣散。副将哈尔察提出突围的意见,但是亦纳勒术清楚自己的处境成吉思汗是不会饶过自己只能决战到底,便放弃了突围的意见。

哈剌察见状决定自己率领1万骑兵突围,但是刚从苏菲哈纳门冲出便被蒙古大军活捉,蒙军乘机从苏菲哈纳门攻近城中与讹答剌城军民展开了巷战,1个月后讹答剌城被攻陷,守将亦纳勒术被活捉。

成吉思汗为了给死去的商队报仇,将融化的银水注入了他的眼睛和双耳,亦纳勒术惨死在刑场也算是死得其所吧。

第二路军,术赤率部沿锡尔河左岸进发,最先来到了昔格纳黑城(其遗址现名为苏纳克库尔干,在今哈萨克斯坦图门阿鲁克由站以北),术赤派一名叫哈散哈只的穆斯林去城中劝降,但是,城中百姓不听还将其打死。于是,术赤开始全面进攻,连续进攻七日攻陷昔格纳黑城,进城后杀死了所有居民。

而后,术赤来到毡的城。毡的城守将忽都鲁汗见蒙古军队兵临城下后却连夜弃城逃跑,经过沙漠地带,跑到玉龙杰赤去了。术赤见状仍然先采取了招降策略,毡的城居民最初还以坚守为主,但当蒙古军队成功占领城墙后却没有向蒙军进攻,由于他们没有抵抗,术赤赦免了他们,并委任了一个名叫阿里-火者的人为毡的城长官,管理城中军民。

第三路大军在阿剌黑率领下先攻下了别纳克忒城之后于1220年三月抵达了锡尔河畔的忽毡城(今塔吉克斯坦列尼纳巴德城,中亚古城之一。),忽毡城的守将是花剌子模著名的将领贴木儿灭里,他亲帅数千名精兵守护城池。忽毡城处在锡尔河中央,城堡高大、坚固,而且所处位置正好超出蒙古大军的弓箭和弩炮的射程之外。蒙军将领哈撒儿调来5万战俘从12公里外的山地运来石头填入锡尔河,企图逐步靠入城堡。贴木儿灭里造了十二艘密封的战船,船上蒙上厚厚的湿毡,外涂一层揉有醋的粘土,上面留有射箭口。这样无论蒙古军无论是用弓箭还是火攻都失去了作用,一次次进攻失利。

此时,术赤率领第三军一部及时赶到锡尔河两岸开始布置兵力,调来被俘的工匠连夜打造巨型弩炮和搭建浮桥,每个桥头以重兵把守,妄图将贴木儿灭里困死在锡尔河中。连续数月的围困也让贴木儿灭里感到了疲惫,再蒙军接下来的进攻中开始势渐不支。最后贴木儿灭里成功率领剩下的部众成功突围。

贴木儿灭里在忽毡城的英勇抵抗,是成吉思汗西征以来碰到的第一个顽强的将领,贴木儿灭里以1000多人抵挡住了多于自己数倍的蒙古大军的数次进攻,这说明花喇子模的军队中是不缺乏英雄气概的将领。

1220年三月,成吉思汗和四子拖雷所率领的第四路军从讹答剌城,经进昔格纳黑城和纳尔城,来到不花剌(今乌兹别克斯坦的布哈剌)城下。不花剌位于阿姆河东岸,位于花剌子模故都玉龙杰赤和新都撒马尔罕之间,是河中与波斯东西交通咽喉,是除撒马尔罕外最重要的城市,同是也是穆斯林世界的最大城市之一。街道四通八达,充足的水源和蜚声世界的手工艺制品给这里带来了富饶金额繁荣的景象。

成吉思汗大军赶到时,不花剌城由3万突厥人组成的雇佣军守护,最高长官是花喇子模著名将领怯失力汗。当怯失力汗拒绝投降后,蒙古军便发起了猛烈的进攻,城中的雇佣军将领乘夜率军突围逃出。蒙古军顺势攻入不花剌城,守将怯失力汗自杀殉国。但城中内堡中有骑兵400人仍然坚守不降,时常夜袭蒙古军队。成吉思汗在城堡周围架起投石器,向堡里投入巨堡石,打开缺口后,蒙古军冲入内堡,堡内军民无一幸免,全部斩杀。内堡肃清后,成吉思汗下令把城墙推到,把居民赶到城外的山坡上,然后放蒙古军队再次入城洗劫,城中青壮年被编入军队为随军进攻撒马尔罕。

NotePad 函数系列之二

Public Sub TampNotePad(ByVal sTxtFile As String, Optional ByVal bTrimRow As Variant = True) ‘对文本文件消除空行, bTrimRow 为真, 则行 ” ” 视为空行 “”
On Error Resume Next
Dim I As Integer, J As Integer
Dim Lines() As String
Dim LineContent As String
Dim iLineCount As Integer
Dim TxtFileNumber As Integer
TxtFileNumber = FreeFile
If Not FileExist(sTxtFile) Then Exit Sub
Open sTxtFile For Input As TxtFileNumber
Do While Not EOF(TxtFileNumber) ‘把文本读至数组
Line Input #TxtFileNumber, LineContent
iLineCount = iLineCount + 1
ReDim Preserve Lines(1 To iLineCount)
Lines(iLineCount) = LineContent
Loop
Close TxtFileNumber
Open sTxtFile For Output As TxtFileNumber
For I = 1 To iLineCount ‘把数组写入文本
If bTrimRow Then Lines(I) = Trim(Lines(I))
If Not Lines(I) = “” Then Print #TxtFileNumber, Lines(I)
Next I
Close TxtFileNumber
If Err.Number <> 0 Then Err.Clear
On Error GoTo 0
End Sub


Public Sub TrimNotePad(ByVal sTxtFile As String, Optional ByVal bTrimRow As Variant = True) ‘对文本文件消除前后空行, 中间空行不管, bTrimRow 为真, 则行 ” ” 视为空行 “”
On Error Resume Next
Dim I As Integer, J As Integer
Dim Lines() As String
Dim LineContent As String
Dim iLineCount As Integer
Dim TxtFileNumber As Integer
TxtFileNumber = FreeFile
If Not FileExist(sTxtFile) Then Exit Sub
Open sTxtFile For Input As TxtFileNumber
Do While Not EOF(TxtFileNumber) ‘把文本读至数组
Line Input #TxtFileNumber, LineContent
iLineCount = iLineCount + 1
ReDim Preserve Lines(1 To iLineCount)
Lines(iLineCount) = LineContent
Loop
Close TxtFileNumber
Dim iBegin As Integer, iEnd As Integer
For I = 1 To iLineCount
If bTrimRow Then Lines(I) = Trim(Lines(I))
If Not Lines(I) = “” Then
iBegin = I
Exit For
End If
Next I
For I = iLineCount To 1 Step -1
If bTrimRow Then Lines(I) = Trim(Lines(I))
If Not Lines(I) = “” Then
iEnd = I
Exit For
End If
Next I
Open sTxtFile For Output As TxtFileNumber
For I = iBegin To iEnd ‘把数组写入文本
Print #TxtFileNumber, Lines(I)
Next I
Close TxtFileNumber
If Err.Number <> 0 Then Err.Clear
On Error GoTo 0
End Sub


Public Sub CleanNotePad(ByVal sTxtFile As String) ‘对文本文件消除重复行
On Error Resume Next
Dim I As Integer, J As Integer
Dim Lines() As String
Dim LineContent As String
Dim iLineCount As Integer
Dim TxtFileNumber As Integer
TxtFileNumber = FreeFile
If Not FileExist(sTxtFile) Then Exit Sub
Open sTxtFile For Input As TxtFileNumber
Do While Not EOF(TxtFileNumber) ‘把文本读至数组
Line Input #TxtFileNumber, LineContent
iLineCount = iLineCount + 1
ReDim Preserve Lines(1 To iLineCount)
Lines(iLineCount) = LineContent
Loop
Close TxtFileNumber
Call CleanUpArray(Lines) ‘去除重复元素
iLineCount = UBound(Lines) – LBound(Lines) + 1
Open sTxtFile For Output As TxtFileNumber
For I = 1 To iLineCount
Print #TxtFileNumber, Lines(I)
Next I
Close TxtFileNumber
If Err.Number <> 0 Then Err.Clear
On Error GoTo 0
End Sub


Public Sub SortNotePad(ByVal sTxtFile As String, ByVal bAscending As Boolean) ‘对文本文件按行排序
On Error Resume Next
Dim I As Integer, J As Integer
Dim Lines() As String
Dim LineContent As String
Dim iLineCount As Integer
Dim TxtFileNumber As Integer
TxtFileNumber = FreeFile
If Not FileExist(sTxtFile) Then Exit Sub
Open sTxtFile For Input As TxtFileNumber
Do While Not EOF(TxtFileNumber) ‘把文本读至数组
Line Input #TxtFileNumber, LineContent
iLineCount = iLineCount + 1
ReDim Preserve Lines(1 To iLineCount)
Lines(iLineCount) = LineContent
Loop
Close TxtFileNumber
If iLineCount = 0 Then Exit Sub ‘LBound 会出错
Dim iBest As Integer
Dim sBest As String
For I = 1 To iLineCount – 1 ‘对数组进行有序处理
iBest = I
sBest = Lines(I)
For J = I + 1 To iLineCount
If StrComp(Lines(J), sBest, vbTextCompare) < 0 Then sBest = Lines(J) iBest = J End If Next J Lines(iBest) = Lines(I) Lines(I) = sBest Next I Open sTxtFile For Output As TxtFileNumber If bAscending = True Then ‘把数组写入文本 ‘Ascending order For I = 1 To iLineCount Print #TxtFileNumber, Lines(I) Next I Else ‘Descending order For I = iLineCount To 1 Step -1 Print #TxtFileNumber, Lines(I) Next I End If Close TxtFileNumber If Err.Number <> 0 Then Err.Clear
On Error GoTo 0
End Sub


Public Sub ClearNotePad(ByVal sTxtFile As String) ‘保留文本文件但清空其内容
On Error Resume Next
Dim I As Integer, J As Integer
Dim Lines() As String
Dim TxtFileNumber As Integer
TxtFileNumber = FreeFile
Open sTxtFile For Output As TxtFileNumber
For I = LBound(Lines) To UBound(Lines) ‘把数组写入文本
Print #TxtFileNumber, Lines(I)
Next I
Close TxtFileNumber
If Err.Number <> 0 Then Err.Clear
On Error GoTo 0
End Sub

雅阁架空线路辅助设计(WCAD)教学视频——移动杆塔

本教学视频的关键步骤提示如下:

1、激活线路图形文件(dwg),并进入移动杆塔页面;

2、点击进入调整,在线路图形文件(dwg)作图区域移动某一基或多基杆塔,即可看到移动后的效果;

3、点击结束调整。

成吉思汗西征之起因

公元1218年,维持了仅94年的西辽国被蒙古大军所灭。至此成吉思汗的蒙古帝国的疆域已经扩展到东至日本海,西至额尔齐斯河(额尔齐斯河为鄂毕河最大的支流,流经中国、哈萨克斯坦、俄罗斯的国际河流)、北至巴儿忽真河流域(位于贝加尔湖东南部)、南至黄河的广大地区。其中西辽的灭亡为蒙古帝国正式打开了通往中亚的大门,同时也接触了一个新的世界文化——阿拉伯·波斯文化。此时,成吉思汗的蒙古帝国已同中亚强国摩诃末·苏丹的花剌子模帝国相邻而居了。

花剌子模,位于阿姆河下游、咸海南岸的一个中亚古国。在古代中国文献中被称为“呼似密”,“火寻”,至13世纪始称为“花剌子模”和“回回国”。现今为乌兹别克斯坦、哈萨克斯坦和土库曼斯坦的一部分。今天乌兹别克斯坦共和国还有一个花剌子模州,可以说是这个古老帝国的最后延续。

早在公元1215年到1216年,成吉思汗在中都(今北京)停留期间,花剌子模王摩诃末听到东方蒙古的崛起,已占领金国大半疆土时,他决定会会这位东方的征服者。他派遣以巴哈·阿丁·剌吉为首的花剌子模使节团,来到中都了解真实的蒙古帝国的情况。成吉思汗友好的态度接待了这批使者,并表示希望两国友好相处,从新开通商路进行贸易往来,花剌子模同意了友好通商的建议。1216年,成吉思汗派三名使者和商队回访花剌子模国。这三名使者是从居住在蒙古的花剌子模人中精心挑选出来的。1218年春,花剌子模国王摩诃末在布哈拉接见了蒙古使者,同意成吉思汗的提议,双方缔结了和平通商协定。

同年成吉思汗决定派遣派出由450人组成的大商队,用500峰骆驼驮着金、银、丝绸、驼毛织品、海狸皮、貂皮等贵重商品再次出使花剌子模。这次商队的领路人仍然是从蒙古的穆斯林中挑选,其中成吉思汗还派了一位名叫兀忽纳的蒙古人作为他的私人代表随商队前往。商队行至锡尔河上游的讹答剌城(位于哈萨克斯坦南哈萨克斯坦州奇姆肯特市阿雷思河和锡尔河交汇处)后,讹答剌城守将亦纳勒术·海尔罕(根据费志尼《世界征服者史》记载,亦纳勒术是花剌子模国王摩诃末的母后秃儿罕哈敦的族人,认为他可能是摩诃末的异母弟,其突厥名字为牙罕脱黑迪,意为“大象降生”。被册封为“海尔罕”)见财起意私自将商队扣留,并派人报摩诃末说,商队中有成吉思汗的密探。摩诃末在没有弄清事情真相的情况下,便下令亦纳勒术处决商队成员,并没收其全部财物。其中只有一人(一说是骆驼夫)从牢里逃出,得以幸免,向成吉思汗报告了商队被害经过。

成吉思汗闻之大怒,但是面对强大的花剌子模帝国还是采取了先礼后兵的策略,再次派遣由一个名为伊本巴合剌的西域商人和两名蒙古随从组成的使者团前去花剌子模向摩诃末询问商人被杀真相,如果愿意引渡凶手亦纳勒术·海尔罕,蒙古仍然愿意与花剌子模帝国和平相处。但是,摩诃末不但拒绝交出凶手,还当场杀死特使伊本巴合剌,并剃掉了两名蒙古副使的胡须,然后放他们回国面见成吉思汗。

亦纳勒术·海尔罕的贪婪和卑劣,摩诃末·苏丹的包庇和纵容,这一切激怒了成吉思汗。敌对形式已无法挽回,两大强国之间的战争序幕已经拉开了……

蒙古使臣被害后,成吉思汗觉察到两国关系已无法用和平方式解决,决定亲率大军向花剌子模问罪,令其弟斡赤斤哈撒儿留守蒙古。1219年6月,成吉思汗亲率蒙古大军远征花剌子模,从克鲁伦河畔出发,越阿尔泰山至也儿的石河(额尔齐斯河)畔度夏。术赤、察合台、窝阔台、托雷及大将速不台、哲别、大断事官失吉忽图忽等随行。畏吾儿(回鹘人)、合剌鲁(属突厥语系,以海押立为中心统治着伊犁和博尔塔拉地区,臣属于西辽。)皆出兵,惟西夏拒绝出兵。总计兵力10至15万,成吉思汗对外号称60大军(魏源《蒙兀儿史记》)。出征花剌子模国,要翻越险峻的天山,经伊犁河谷进入中亚。1219年秋,西征军经过不剌城(今新疆博罗市)、赛里木湖、通过铁木儿忏察(亦称松关,今名果子沟) 越过阿剌岭(天山北山麓)出峡,到达阿里麻里城(新疆伊犁霍城阿力麻里县境内),西行渡伊犁河,经海押立(今哈萨克塔尔迪库尔干与伊犁一带)向花剌子模挺进。在行军途中遇到最困难的隘口便是铁木儿忏察。蒙古大军通过时,成吉思汗次子察合台理石开道,并且砍木修桥,共修筑48座,桥的宽度可容两辆车并行,如今尚存32座桥遗迹。

成吉思汗在行军所遇到的城市早已被蒙军在攻打乃蛮部和西辽的战争中征服,所以一路上除了客服自然条件所导致的困难外一路上没有遇到敌人的反抗,所以9月份就到达了花剌子模的边界。

面对蒙古大军的威逼,花剌子模国王摩诃末·苏丹将军队分散部署在锡尔河和费尔干纳要隘和河中各城池练成一线进行战略阻击。他把近四十万骑军和30万步兵多数留在了河中(撒马尔罕地区),两万人留给了讹答剌城的亦纳勒术·海尔罕,11万留给了长子扎兰丁驻守新都撒马尔罕,其余兵力悉数驻扎在其他城池。这种分兵御敌的战略使得花喇子模虽总兵力多于蒙古大军,但是分散兵力后实力处于劣势。

NotePad 函数系列之一

Public Function FindNotePadText(ByVal sTxtFile As String, ByVal sData As String) As Boolean
FindNotePadText = False
On Error Resume Next
Dim TxtFileNumber As Integer
Dim LineContent As String
TxtFileNumber = FreeFile
If Not FileExist(sTxtFile) Then Exit Function
Open sTxtFile For Input As TxtFileNumber
Do While Not EOF(TxtFileNumber) ‘把文本读至数组
Line Input #TxtFileNumber, LineContent
If InStr(1, LineContent, sData, vbTextCompare) > 0 Then
FindNotePadText = True
Exit Do
End If
Loop
Close TxtFileNumber
If Err.Number <> 0 Then Err.Clear
On Error GoTo 0
End Function


Public Function GetNotePadRowNo(ByVal sTxtFile As String, ByVal sData As String, Optional ByVal bFirst As Boolean = False) As Integer
‘sData 出现在 sTxtFile 的行号,无 sData 为 0,bFirst = True 取第一次,bFirst = False 取最后一次
On Error Resume Next
GetNotePadRowNo = 0
If Not FileExist(sTxtFile) Then Exit Function
Dim TxtFileNumber As Integer
Dim LineContent As String
Dim LineArray() As Integer
Dim LineCount As Integer
Dim LineNumber As Integer
LineCount = 0
LineNumber = 0
TxtFileNumber = FreeFile
Open sTxtFile For Input As TxtFileNumber
Do While Not EOF(TxtFileNumber) ‘读文本
Line Input #TxtFileNumber, LineContent
LineNumber = LineNumber + 1
If InStr(1, LineContent, sData, vbTextCompare) > 0 Then ‘出现
LineCount = LineCount + 1
ReDim Preserve LineArray(1 To LineCount)
LineArray(LineCount) = LineNumber
End If
Loop
Close TxtFileNumber
If IsEmptyArray(LineArray) Then Exit Function ‘0
If bFirst Then
GetNotePadRowNo = LineArray(LBound(LineArray))
Else
GetNotePadRowNo = LineArray(UBound(LineArray))
End If
If Err.Number <> 0 Then Err.Clear
On Error GoTo 0
End Function


Public Sub ReplaceNotePadText(ByVal sTxtFile As String, ByVal sOld As String, ByVal sNew As String)
On Error Resume Next
Dim I As Integer, J As Integer
Dim Lines() As String
Dim LineContent As String
Dim iLineCount As Integer
Dim TxtFileNumber As Integer
TxtFileNumber = FreeFile
If Not FileExist(sTxtFile) Then Exit Sub
Open sTxtFile For Input As TxtFileNumber
Do While Not EOF(TxtFileNumber) ‘把文本读至数组
Line Input #TxtFileNumber, LineContent
LineContent = Replace(LineContent, sOld, sNew, 1, -1, vbTextCompare)
iLineCount = iLineCount + 1
ReDim Preserve Lines(1 To iLineCount)
Lines(iLineCount) = LineContent
Loop
Close TxtFileNumber
If iLineCount = 0 Then Exit Sub ‘LBound 会出错
Open sTxtFile For Output As TxtFileNumber
For I = 1 To iLineCount
Print #TxtFileNumber, Lines(I)
Next I
Close TxtFileNumber
If Err.Number <> 0 Then Err.Clear
On Error GoTo 0
End Sub


Public Sub TurnNotePadCursor(ByVal sTxtFile As String, ByVal iRow As Integer, Optional ByVal iColumn As Integer = 1, Optional bOpen As Boolean = False) ‘把文本文件光标移到某行某列
On Error Resume Next
Dim I As Integer, J As Integer
Dim oShell As Object
Set oShell = CreateObject(“WScript.Shell”)
If bOpen Then
‘新打开文件
Dim lPid As Long
lPid = Shell(“notepad.exe ” & sTxtFile, vbNormalFocus)
AppActivate (lPid)
Else
‘须紧跟 OpenFile 之后,以保证 sTxtFile 为当前窗体
‘Debug.Print sTxtFile
‘Debug.Print GetShortName(sTxtFile)
For I = 1 To GetNotePadRowCount(sTxtFile, False)
DoEvents
oShell.SendKeys “{UP}” ‘回到首行
Next I
For J = 1 To GetNotePadColumnCount(sTxtFile, False)
DoEvents
oShell.SendKeys “{LEFT}” ‘回到首列
Next J
End If
For I = 1 To iRow – 1
oShell.SendKeys “{DOWN}”
Next I
For J = 1 To iColumn – 1
oShell.SendKeys “{RIGHT}”
Next J
ERR_NORUNNING:
If Err.Number <> 0 Then Err.Clear
On Error GoTo 0
End Sub


Public Function GetNotePadRowCount(ByVal sTxtFile As String, Optional ByVal bTrimRow As Variant = True) As Integer ‘获取 txt 文件行数, bTrimRow 为真, 则空行 “” 及空格行 ” ” 不计
On Error Resume Next
GetNotePadRowCount = 0
Dim TxtFileNumber As String
TxtFileNumber = FreeFile
If bTrimRow Then
Dim LineContent As String
Open sTxtFile For Input As TxtFileNumber
Do While Not EOF(TxtFileNumber) ‘把文本读至数组
Line Input #TxtFileNumber, LineContent
LineContent = Trim(LineContent)
If Not LineContent = “” Then GetNotePadRowCount = GetNotePadRowCount + 1
Loop
Close TxtFileNumber
Else
Open sTxtFile For Binary As #TxtFileNumber
GetNotePadRowCount = UBound(Split(Input(LOF(1), #1), vbCrLf)) + 1
Close #TxtFileNumber
End If
If Err.Number <> 0 Then Err.Clear
On Error GoTo 0
End Function


Public Function GetNotePadColumnCount(ByVal sTxtFile As String, Optional ByVal bTrimRow As Variant = True) As Integer ‘获取 txt 文件列数(最大列数)), bTrimRow 为真, 则每行两端的 ” ” 不计
On Error Resume Next
Dim I As Integer, J As Integer
GetNotePadColumnCount = 0
Dim LineContent As String
Dim TxtFileNumber As Integer
TxtFileNumber = FreeFile
If Not FileExist(sTxtFile) Then Exit Function
Open sTxtFile For Input As TxtFileNumber
Do While Not EOF(TxtFileNumber)
Line Input #TxtFileNumber, LineContent
If bTrimRow Then LineContent = Trim(LineContent)
If Len(LineContent) > GetNotePadColumnCount Then GetNotePadColumnCount = Len(LineContent)
Loop
Close TxtFileNumber
If Err.Number <> 0 Then Err.Clear
On Error GoTo 0
End Function
Public Function GetNotePadColumnCountAtRow(ByVal sTxtFile As String, ByVal iRow As Integer, Optional ByVal bTrimRow As Variant = True) As Integer ‘获取 txt 文件某行列数, bTrimRow 为真, 则行两端的 ” ” 不计
On Error Resume Next
Dim I As Integer, J As Integer
GetNotePadColumnCountAtRow = 0
Dim LineContent As String
Dim TxtFileNumber As Integer
Dim iCount As Integer
TxtFileNumber = FreeFile
If Not FileExist(sTxtFile) Then Exit Function
Open sTxtFile For Input As TxtFileNumber
Do While Not EOF(TxtFileNumber)
Line Input #TxtFileNumber, LineContent
iCount = iCount + 1
If bTrimRow Then LineContent = Trim(LineContent)
If iCount = iRow Then
GetNotePadColumnCountAtRow = Len(LineContent)
Exit Do
End If
Loop
Close TxtFileNumber
If Err.Number <> 0 Then Err.Clear
On Error GoTo 0
End Function


Public Function GetNotePadRowText(ByVal sTxtFile As String, ByVal iLineNumber As Integer) As String ‘获取 txt 文件某行内容
On Error Resume Next
Dim I As Integer, J As Integer
GetNotePadRowText = “”
If iLineNumber > GetNotePadRowCount(sTxtFile, False) Then Exit Function
Dim oFSO As Object, oFile As Object, oStream As Object
Set oFSO = CreateObject(“Scripting.FileSystemObject”)
Set oFile = oFSO.GetFile(sTxtFile)
Set oStream = oFile.OpenAsTextStream(1, 0)
‘ 读取指定行
For I = 1 To iLineNumber
GetNotePadRowText = oStream.ReadLine
Next
oStream.Close
Set oStream = Nothing
Set oFile = Nothing
Set oFSO = Nothing
If Err.Number <> 0 Then Err.Clear
On Error GoTo 0
End Function