-
Notifications
You must be signed in to change notification settings - Fork 0
/
文字處理.bas
3345 lines (3246 loc) · 126 KB
/
文字處理.bas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Attribute VB_Name = "文字處理"
Option Explicit
Dim rst As Recordset, d As Object
Dim db As Database 'set db=CurrentDb _
只能在已開啟之Access中參照一次 , 二次以上的參照 _
,須以Set db = DBEngine.Workspaces(0).OpenDatabase _
("d:\千慮一得齋\書籍資料\詞頻.mdb")!的形式參照! _
參考: _
Dim dbsCurrent As Database, dbsContacts As Database'由 CurrentDb 的線上說明複製 _
Set dbsCurrent = CurrentDb _
Set dbsContacts = DBEngine.Workspaces(0).OpenDatabase("Contacts.mdb")
Function isNum(x As String) As Boolean
If Len(x) > 1 Then Exit Function
x = StrConv(x, vbNarrow)
If x Like "[0-9]" Then isNum = True
End Function
Function isLetter(x As String) As Boolean
If Len(x) > 1 Then Exit Function
x = StrConv(x, vbNarrow)
If x Like "[a-z]" Then isLetter = True
End Function
Sub 字頻() '2002/11/10要Sub才能在Word中執行!
On Error GoTo 錯誤處理
Dim ch, wrong As Long
'Dim chct As Long
Dim StTime As Date, EndTime As Date
'Dim x As Long, firstword As String '亂碼檢查!2002/11/13
Options.SaveInterval = 0 '取消自動儲存
Set d = CreateObject("access.application")
d.UserControl = True
d.OpenCurrentDatabase "d:\千慮一得齋\書籍資料\詞頻.mdb", False
d.docmd.SelectObject blog.myaccess.acTable, "字頻表", True
'd.Visible = True '檢查用
Set db = d.CurrentDb '一定要加〝d〞!!寫成以下亦可!
'以上可併成下二式即可!但不會顯示在營幕上,只能作幕後計算用!(見OpenCurrentDatabase的線上說明)
'Set db = d.DBEngine.OpenDatabase("d:\千慮一得齋\書籍資料\詞頻.mdb")
'Set db = d.DBEngine.Workspaces(0).OpenDatabase("d:\千慮一得齋\書籍資料\詞頻.mdb")
Set rst = db.OpenRecordset("字頻表", dbOpenDynaset)
If rst.RecordCount > 0 Then '要獲得全部的筆數須用MoveLast但此只需判斷有沒有原先的記錄即可!
'rst打開以後只會取得第一筆記錄!
' db.Execute "DELETE 字頻表.* FROM 字頻表"
db.Execute "DELETE * FROM 字頻表"
End If
StTime = Time
With ActiveDocument
For Each ch In .Characters '有亂碼字時ch會傳回"?"變成了運算用符號
wrong = wrong + 1 '檢視用!
' If wrong = 373 Then MsgBox "Check!!" '檢查用!
If wrong Mod 27250 = 0 Then 'If wrong Mod 29688 = 0 Then '到29688時會產生OLE沒有回應的錯誤,故在此歇會兒
MsgBox "因系統負荷達到極限,請務必切換至Access打開資料表後關閉,再回來按下確定按鈕繼續!!" _
, vbExclamation, "★系統重要資訊★"
' ElseIf wrong = 49761 Then
' MsgBox "請檢查!!"
End If
' If wrong Mod 1000 = 0 Then Debug.Print wrong
' Debug.Print ch & vbCr & "--------"
'換行字元、復位字元不計!
' If Right(ch, 1) <> Chr(10) Or Left(ch, 1) <> Chr(13) Then
Select Case Asc(ch)
Case Is <> 13, 10
With rst
11 .FindFirst "字彙 like '" & ch & "'"
12 If .NoMatch Then
.AddNew
rst("字彙") = ch
rst("次數") = 1
rst("Asc") = Asc(ch)
rst("AscW") = AscW(ch)
' On Error GoTo 次數
.Update
Else '當有亂碼字時,會成為比較運算元"?"(Asc(ch)=63),則可能在文件中第一次出現的字會誤增次數
'此外如"鶴"字等(在Word中插入→符號內最後一些)字,亦會與同形字同字元碼(Asc), _
但在符號表中卻有不同位置,代表不同字!在統計時,系統亦會誤算在一起! _
這點還須要克服!2002/11/13測試時,有時又會分開!(但Asc則相同!)
' If .AbsolutePosition < 1 And ch Like "?" And Not rst("字彙") = "?" Then
' 'If x = 1 Then MsgBox "有亂碼字,次數將加入第一個出現的字中!!"
' MsgBox "有亂碼字,次數將加入第一個出現的字中!!"
' AppActivate "Microsoft Word"
' Selection.Collapse
' Selection.SetRange wrong + ActiveDocument.Paragraphs.Count / 2, wrong + 1 '將該亂碼字選取
' x = x + 1
' End If
.Edit
rst("次數") = rst("次數") + 1
.Update
End If
End With
End Select
' chct = .Characters.Count
' chct = Selection.StoryLength
' instr(1+
' .Select
retry: Next ch
' rst.Requery
' rst.MoveFirst
' If x > 0 Then
' firstword = "◎◎亂碼字加入第一字:「" & rst("字彙") & "」中共有" & x & "次!!"
' Else
' firstword = "★放心吧!亂碼字亦統計正確!!★"
' End If
EndTime = Time
AppActivate "Microsoft word"
MsgBox "統計完成!!" & vbCr & "(※共執行了" & wrong & "次的檢查※)" _
& vbCr & "※耗時:" & Format(EndTime - StTime, "n分s秒") & "※" _
& vbCr & "字元數=" & .Characters.Count & vbCr '_
' & firstword
' MsgBox "統計完成!!" & vbCr & "(※共執行了" & wrong & "次的檢查※)" _
' & vbCr & "※耗時:" & DateDiff("n", StTime, EndTime) & "分鐘※" _
' & vbCr & "字元數=" & .Characters.Count
End With
If MsgBox("要即刻檢視結果嗎?", vbYesNo + vbQuestion) = vbYes Then
' Set d = GetObject("d:\千慮一得齋\書籍資料\詞頻.mdb")
AppActivate "Microsoft access"
End If
d.docmd.OpenTable "字頻表", , d.acReadOnly
d.docmd.Maximize
rst.Close: db.Close: Set d = Nothing
Options.SaveInterval = 10 '恢復自動儲存
End '用Exit Sub無法每次關閉Access
錯誤處理:
Select Case Err.Number
Case Is = 91, 3078 '參照不到DataBase內物件時
MsgBox "請再按一次!", vbCritical
'access.Application.Quit
d.Quit
End
' d.CurrentDb.Close
' Set db = DBEngine.Workspaces(0).OpenDatabase("d:\千慮一得齋\書籍資料\詞頻.mdb")
'' Debug.Print Err.Description '檢查用!
' Resume
' Case Is = 3163 '換行字元、復位字元不計!
' If Right(ch, 1) = Chr(10) Then
' ch = Left(ch, Len(ch) - 1)
' ElseIf Left(ch, 1) = Chr(13) Then
' ch = Right(ch, Len(ch) - 1) '或If Asc(ch)=13
' End If
' Resume 11
Case Is = 93 '為[]等運算式特殊字元所設之比較式
rst.FindFirst "asc(字彙) = " & Asc(ch)
Resume 12
' Case Is = -2147023170
' MsgBox Err.Number & ":" & Err.Description
' MsgBox Err.LastDllError & "." & Err.Source
' Set d = CreateObject("access.application")
' d.OpenCurrentDatabase "d:\千慮一得齋\書籍資料\詞頻.mdb", False
' d.UserControl = True
' Resume
' Case Is = 462 '"遠端伺服器不存在或無法使用"
' 'd.OpenCurrentDatabase "d:\千慮一得齋\書籍資料\詞頻.mdb", False
'' Set d = GetObject("d:\千慮一得齋\書籍資料\詞頻.mdb")
' Set db = d.CurrentDb
' Set rst = db.OpenRecordset("詞頻表", dbOpenDynaset)
' Resume
Case Else
MsgBox Err.Number & ":" & Err.Description, vbExclamation
Resume
End Select
End Sub
Sub 詞頻() '2002/11/10
On Error GoTo 錯誤處理
Dim Wd, wrong As Long
Dim wrongmark As Integer ', wdct As Long
Dim StTime As Date, EndTime As Date
Dim hfspace As Long
Options.SaveInterval = 0 '取消自動儲存
Set d = CreateObject("access.application")
d.UserControl = True '如果為False則db.close會關閉資料庫!
'd.UserControl = False
d.OpenCurrentDatabase "d:\千慮一得齋\書籍資料\詞頻.mdb", False
d.docmd.SelectObject d.acTable, "詞頻表", True
'd.Visible = True '檢查用UserControl=True則有此反會致誤!
Set db = d.CurrentDb
Set rst = db.OpenRecordset("詞頻表", dbOpenDynaset)
If rst.RecordCount > 0 Then db.Execute "DELETE * FROM 詞頻表"
StTime = Time
With ActiveDocument
For Each Wd In .words
wrong = wrong + 1 '檢視用!
' If wrong Mod 1000 = 0 Then Debug.Print wrong
' Debug.Print wd & vbCr & "--------"
If Len(Wd) > 1 And Right(Wd, 1) = " " Then
hfspace = hfspace + 1 '計次
GoTo retry '字串右邊是半形空格時,AccessUpdate時會銷去,且於詞彙亦無意意,故不計!
End If
rst.FindFirst "詞彙 like '" & Wd & "'"
If rst.NoMatch Then
rst.AddNew
rst("詞彙") = Wd
' On Error GoTo 次數
rst.Update
Else
rst.Edit
rst("次數") = rst("次數") + 1
rst.Update
End If
' wrong = 1
' wdct = .Words.Count
' wdct = Selection.StoryLength
' instr(1+
' .Select
retry: Next Wd
End With
EndTime = Time
AppActivate "Microsoft word"
MsgBox "統計完成!!" & vbCr & "(※共執行了" & wrong & "次的檢查※)" _
& "詞彙右邊半形空格凡" & hfspace & "次,忽略不計!" _
& vbCr & "※耗時:" & Format(EndTime - StTime, "n分s秒") & "※"
If MsgBox("要即刻檢視結果嗎?", vbYesNo + vbQuestion) = vbYes Then
' Set d = GetObject("d:\千慮一得齋\書籍資料\詞頻.mdb")
AppActivate "Microsoft access"
End If
d.docmd.OpenTable "詞頻表", , d.acReadOnly
d.docmd.Maximize
rst.Close: db.Close: Set d = Nothing
Options.SaveInterval = 10 '恢復自動儲存
End
錯誤處理:
Select Case Err.Number '主索引值重複
Case Is = 91, 3078
MsgBox "請再按一次!", vbCritical
'access.Application.Quit
d.Quit
End
Case Else
MsgBox Err.Number & ":" & Err.Description, vbExclamation
Resume
End Select
'次數:
' wrongmark = Err.Number
'' Err.Description = wd
' If wrongmark = 3022 Then '重複了
'' wrong = wrong + 1
'' rst.Seek "=", "詞彙"
' rst.FindFirst "詞彙 like '" & wd & "'"
' rst.Edit
' rst("次數") = rst("次數") + 1
' rst.Update
' Resume retry
' Else
' MsgBox "有錯誤,請檢查!!" & Err.Description, vbExclamation
' End If
End Sub
Sub 進階詞頻() '2002/11/10要Sub才能在Word中執行!'2005/4/21此法在跑大檔案時太沒效率了!!跑了3天3夜300頁的文件檔取1-3字詞跑不完!
On Error GoTo 錯誤處理
Dim wrong As Long, phra As Long, phras As String, phralh As Byte
Dim StTime As Date, EndTime As Date
Dim hfspace As Long
Dim length As Byte 'As String
Dim Dw As String, dwL As Long
length = InputBox("請指定分析詞彙之上限,最多五個字", , "5")
If length = "" Or Not IsNumeric(length) Then End
If CByte(length) < 1 Or CByte(length) > 5 Then End
Options.SaveInterval = 0 '取消自動儲存
StTime = Time
Set d = CreateObject("access.application")
'或Set d = CreateObject("Access.Application.9")
d.UserControl = True
d.OpenCurrentDatabase "d:\千慮一得齋\書籍資料\詞頻.mdb", False
d.docmd.SelectObject d.acTable, "詞頻表", True
'd.Visible = True '檢查用
Set db = d.CurrentDb
Set rst = db.OpenRecordset("詞頻表", dbOpenDynaset)
If rst.RecordCount > 0 Then '要獲得全部的筆數須用MoveLast但此只需判斷有沒有原先的記錄即可!
'rst打開以後只會取得第一筆記錄!
' db.Execute "DELETE 字頻表.* FROM 字頻表"
db.Execute "DELETE * FROM 詞頻表"
End If
'With ActiveDocument
With ActiveDocument
Dw = .Content '文件內容
dwL = Len(Dw) '文件長度
.Close
End With
For phralh = 1 To length 'CByte(length)
' For phralh = 1 To 5 '暫定最長為5個字構成的詞(仍可改作變數)
For phra = 1 To dwL '.Characters.Count
Select Case phralh
Case Is = 1
If Err.LastDllError <> 0 Then
MsgBox Err.LastDllError & ":" & Err.Description & "Err.Number:" & Err.Number
GoTo 錯誤處理
End If
' phras = .Characters(phra)'此法太慢!
phras = Mid(Dw, phra, 1)
Case Is = 2
If Err.LastDllError <> 0 Then
MsgBox Err.LastDllError & ":" & Err.Description & "Err.Number:" & Err.Number
GoTo 錯誤處理
End If
' If phra + 1 <= .Characters.Count Then _
phras = .Characters(phra) & .Characters(phra + 1)
If phra + 1 <= dwL Then phras = Mid(Dw, phra, 2)
Case Is = 3
If Err.LastDllError <> 0 Then
MsgBox Err.LastDllError & ":" & Err.Description & "Err.Number:" & Err.Number
GoTo 錯誤處理
End If
' If phra + 2 <= .Characters.Count Then _
phras = .Characters(phra) & .Characters(phra + 1) & _
.Characters(phra + 2)
If phra + 2 <= dwL Then phras = Mid(Dw, phra, 3)
Case Is = 4
On Error GoTo 錯誤處理
If Err.LastDllError <> 0 Then
MsgBox Err.LastDllError & ":" & Err.Description & "Err.Number:" & Err.Number
GoTo 錯誤處理
End If
' If phra + 3 <= .Characters.Count Then _
phras = .Characters(phra) & .Characters(phra + 1) & _
.Characters(phra + 2) & .Characters(phra + 3)
If phra + 3 <= dwL Then phras = Mid(Dw, phra, 3)
Case Is = 5
On Error GoTo 錯誤處理
If Err.LastDllError <> 0 Then
MsgBox Err.LastDllError & ":" & Err.Description & "Err.Number:" & Err.Number
GoTo 錯誤處理
End If
' If phra + 4 <= .Characters.Count Then _
phras = .Characters(phra) & .Characters(phra + 1) & _
.Characters(phra + 2) & .Characters(phra + 3) & _
.Characters(phra + 4)
If phra + 4 <= dwL Then phras = Mid(Dw, phra, 3)
End Select
If Len(phras) > 1 And Right(phras, 1) = " " Then
hfspace = hfspace + 1 '計次
GoTo 11 '字串右邊是半形空格時,AccessUpdate時會銷去,且於詞彙亦無意意,故不計!
End If
'直接進入下一個字串比對
wrong = wrong + 1 '檢視用!
If wrong Mod 29688 = 0 Then '到29688時會產生OLE沒有回應的錯誤,故在此歇會兒
DoEvents 'MsgBox "請檢查!!"
' ElseIf wrong = 49761 Then
' MsgBox "請檢查!!"
End If
' if rst Set rst = CurrentDb.OpenRecordset("SELECT 詞頻表.* FROM 詞頻表 WHERE (((詞頻表.詞彙) like '" & phras & "'));")
With rst
' If .RecordCount = 0 Then
.FindFirst "詞彙 like '" & phras & "'"
If .NoMatch Then
' .MoveLast
.AddNew
rst("詞彙") = phras
' rst("次數") = 1'預設值已為1
On Error GoTo 錯誤處理
.Update 'dbUpdateBatch, True
Else
1 .Edit
rst("次數") = rst("次數") + 1
.Update
End If
' .Close
End With
11 Next phra
2 Next phralh
EndTime = Time
AppActivate "Microsoft word"
MsgBox "統計完成!!" & vbCr & "(※共執行了" & wrong & "次的檢查※)" _
& "詞彙右邊半形空格凡" & hfspace & "次,忽略不計!" _
& vbCr & "※耗時:" & Format(EndTime - StTime, "n分s秒") & "※" _
& vbCr & "字元數=" & dwL '.Characters.Count
'End With
'd.Visible = True
If MsgBox("要即刻檢視結果嗎?", vbYesNo + vbQuestion) = vbYes Then
' Set d = GetObject("d:\千慮一得齋\書籍資料\詞頻.mdb")
AppActivate "Microsoft access"
End If
d.docmd.OpenTable "詞頻表", , d.acReadOnly
d.docmd.Maximize
rst.Close: db.Close: Set d = Nothing
Options.SaveInterval = 10 '恢復自動儲存
End '用Exit Sub無法每次關閉Access'2002/11/15
錯誤處理:
Select Case Err.Number '主索引值重複
Case Is = 3022
rst.Requery
rst.FindFirst "詞彙 like '" & Trim(phras) & "'"
GoTo 1
Case Is = 5941 '集合中的成員不存在(指超過文件長度!)
GoTo 2
Case Is = 91, 3078
MsgBox "請再按一次!", vbCritical
'access.Application.Quit
d.Quit
End
Case Else
MsgBox Err.Number & ":" & Err.Description, vbExclamation
Resume
End Select
End Sub
Sub 進階詞頻1() '2002/11/15要Sub才能在Word中執行!
On Error GoTo 錯誤處理
Dim wrong As Long, phra As Long, phras As String, phralh As Byte
Dim StTime As Date, EndTime As Date
Dim hfspace As Long
Dim length As String
Dim i As Byte, j As Byte
length = InputBox("請指定分析詞彙之上限,最多255個字", , "5")
If length = "" Or Not IsNumeric(length) Then End
If CByte(length) < 1 Or CByte(length) > 255 Then End
Options.SaveInterval = 0 '取消自動儲存
StTime = Time
Set d = CreateObject("access.application")
'或Set d = CreateObject("Access.Application.9")
d.UserControl = True
d.OpenCurrentDatabase "d:\千慮一得齋\書籍資料\詞頻.mdb", False
d.docmd.SelectObject d.acTable, "詞頻表", True
'd.Visible = True '檢查用
Set db = d.CurrentDb
Set rst = db.OpenRecordset("詞頻表", dbOpenDynaset)
If rst.RecordCount > 0 Then '要獲得全部的筆數須用MoveLast但此只需判斷有沒有原先的記錄即可!
'rst打開以後只會取得第一筆記錄!
' db.Execute "DELETE 字頻表.* FROM 字頻表"
db.Execute "DELETE * FROM 詞頻表"
End If
j = CByte(length)
With ActiveDocument
For phralh = 1 To j
' 原暫定最長為5個字構成的詞,今改作變數j,則限於Byte大小耳!
For phra = 1 To .Characters.Count
If phra + (phralh - 1) <= .Characters.Count Then
phras = ""
For i = 0 To phralh - 1
phras = phras & .Characters(phra + i)
Next i
End If
If Len(phras) > 1 And Right(phras, 1) = " " Then
hfspace = hfspace + 1 '計次
GoTo 11 '字串右邊是半形空格時,AccessUpdate時會銷去,且於詞彙亦無意意,故不計!
End If
'直接進入下一個字串比對
wrong = wrong + 1 '檢視用!
If wrong Mod 29688 = 0 Then '到29688時會產生OLE沒有回應的錯誤,故在此歇會兒
MsgBox "請檢查!!"
' ElseIf wrong = 49761 Then
' MsgBox "請檢查!!"
End If
With rst
.FindFirst "詞彙 like '" & phras & "'"
If .NoMatch Then
' .MoveLast
.AddNew
rst("詞彙") = phras
rst("次數") = 1
On Error GoTo 錯誤處理
.Update 'dbUpdateBatch, True
Else
1 .Edit
rst("次數") = rst("次數") + 1
.Update
End If
End With
11 Next phra
2 Next phralh
EndTime = Time
AppActivate "Microsoft word"
MsgBox "統計完成!!" & vbCr & "(※共執行了" & wrong & "次的檢查※)" _
& "詞彙右邊半形空格凡" & hfspace & "次,忽略不計!" _
& vbCr & "※耗時:" & Format(EndTime - StTime, "n分s秒") & "※" _
& vbCr & "字元數=" & .Characters.Count
End With
'd.Visible = True
If MsgBox("要即刻檢視結果嗎?", vbYesNo + vbQuestion) = vbYes Then
' Set d = GetObject("d:\千慮一得齋\書籍資料\詞頻.mdb")
AppActivate "Microsoft access"
End If
d.docmd.OpenTable "詞頻表", , d.acReadOnly
d.docmd.Maximize
rst.Close: db.Close: Set d = Nothing
Options.SaveInterval = 10 '恢復自動儲存
End '用Exit Sub無法每次關閉Access
錯誤處理:
Select Case Err.Number '主索引值重複
Case Is = 3022
rst.Requery
rst.FindFirst "詞彙 like '" & Trim(phras) & "'"
GoTo 1
Case Is = 5941 '集合中的成員不存在(指超過文件長度!)
GoTo 2
Case Is = 91, 3078
MsgBox "請再按一次!", vbCritical
'access.Application.Quit
d.Quit
End
Case Else
MsgBox Err.Number & ":" & Err.Description, vbExclamation
Resume
End Select
End Sub
Sub 指定字數詞頻() '2002/11/11
On Error GoTo 錯誤處理
Dim wrong As Long, phra As Long, phras As String, phralh As String
Dim StTime As Date, EndTime As Date
Dim hfspace As Long
phralh = InputBox("請用阿拉伯數字指定詞的組成字數,最多字數為「11」!", "指定詞彙字數", "2")
If phralh = "" Or Not IsNumeric(phralh) Then Exit Sub
If CByte(phralh) > 11 Or CByte(phralh) < 1 Then Exit Sub
Options.SaveInterval = 0 '取消自動儲存
Set d = CreateObject("access.application")
d.UserControl = True
d.OpenCurrentDatabase "d:\千慮一得齋\書籍資料\詞頻.mdb", False
d.docmd.SelectObject d.acTable, "詞頻表", True
'd.Visible = True '檢查用
Set db = d.CurrentDb
Set rst = db.OpenRecordset("詞頻表", dbOpenDynaset)
If rst.RecordCount > 0 Then '要獲得全部的筆數須用MoveLast但此只需判斷有沒有原先的記錄即可!
'rst打開以後只會取得第一筆記錄!
' db.Execute "DELETE 字頻表.* FROM 字頻表"
db.Execute "DELETE * FROM 詞頻表"
End If
StTime = Time
With ActiveDocument
For phra = 1 To .Characters.Count
Select Case CByte(phralh)
Case Is = 1
phras = .Characters(phra)
Case Is = 2
If phra + 1 <= .Characters.Count Then _
phras = .Characters(phra) & .Characters(phra + 1)
Case Is = 3
If phra + 2 <= .Characters.Count Then _
phras = .Characters(phra) & .Characters(phra + 1) & _
.Characters(phra + 2)
Case Is = 4
If phra + 3 <= .Characters.Count Then _
phras = .Characters(phra) & .Characters(phra + 1) & _
.Characters(phra + 2) & .Characters(phra + 3)
Case Is = 5
If phra + 4 <= .Characters.Count Then _
phras = .Characters(phra) & .Characters(phra + 1) & _
.Characters(phra + 2) & .Characters(phra + 3) & _
.Characters(phra + 4)
Case Is = 6
If phra + 5 <= .Characters.Count Then _
phras = .Characters(phra) & .Characters(phra + 1) & _
.Characters(phra + 2) & .Characters(phra + 3) & _
.Characters(phra + 4) & .Characters(phra + 5)
Case Is = 7
If phra + 6 <= .Characters.Count Then _
phras = .Characters(phra) & .Characters(phra + 1) & _
.Characters(phra + 2) & .Characters(phra + 3) & _
.Characters(phra + 4) & .Characters(phra + 5) & _
.Characters(phra + 6)
Case Is = 8
If phra + 7 <= .Characters.Count Then _
phras = .Characters(phra) & .Characters(phra + 1) & _
.Characters(phra + 2) & .Characters(phra + 3) & _
.Characters(phra + 4) & .Characters(phra + 5) & _
.Characters(phra + 6) & .Characters(phra + 7)
Case Is = 9
If phra + 8 <= .Characters.Count Then _
phras = .Characters(phra) & .Characters(phra + 1) & _
.Characters(phra + 2) & .Characters(phra + 3) & _
.Characters(phra + 4) & .Characters(phra + 5) & _
.Characters(phra + 6) & .Characters(phra + 7) & _
.Characters(phra + 8)
Case Is = 10
If phra + 9 <= .Characters.Count Then _
phras = .Characters(phra) & .Characters(phra + 1) & _
.Characters(phra + 2) & .Characters(phra + 3) & _
.Characters(phra + 4) & .Characters(phra + 5) & _
.Characters(phra + 6) & .Characters(phra + 7) & _
.Characters(phra + 8) & .Characters(phra + 9)
Case Is = 11
If phra + 10 <= .Characters.Count Then _
phras = .Characters(phra) & .Characters(phra + 1) & _
.Characters(phra + 2) & .Characters(phra + 3) & _
.Characters(phra + 4) & .Characters(phra + 5) & _
.Characters(phra + 6) & .Characters(phra + 7) & _
.Characters(phra + 8) & .Characters(phra + 9) & _
.Characters(phra + 10)
End Select
If Len(phras) > 1 And Right(phras, 1) = " " Then
hfspace = hfspace + 1 '計次
GoTo 11 '字串右邊是半形空格時,AccessUpdate時會銷去,且於詞彙亦無意意,故不計!
End If
'直接進入下一個字串比對
wrong = wrong + 1 '檢視用!
' If wrong Mod 29688 = 0 Then '到29688時會產生OLE沒有回應的錯誤,故在此歇會兒
' MsgBox "請檢查!!"
'' ElseIf wrong = 49761 Then
'' MsgBox "請檢查!!"
' End If
With rst
.FindFirst "詞彙 like '" & phras & "'"
If .NoMatch Then
.AddNew
rst("詞彙") = phras
' rst("次數") = 1'預設值已定為1
.Update 'dbUpdateBatch, True
Else
.Edit
rst("次數") = rst("次數") + 1
.Update
End If
End With
11 Next phra
EndTime = Time
AppActivate "Microsoft word"
MsgBox "統計完成!!" & vbCr & "(※共執行了" & wrong & "次的檢查※)" _
& "詞彙右邊半形空格凡" & hfspace & "次,忽略不計!" _
& vbCr & "※耗時:" & Format(EndTime - StTime, "n分s秒") & "※" _
& vbCr & "字元數=" & .Characters.Count
End With
If MsgBox("要即刻檢視結果嗎?", vbYesNo + vbQuestion) = vbYes Then
' Set d = GetObject("d:\千慮一得齋\書籍資料\詞頻.mdb")
AppActivate "Microsoft access"
d.docmd.OpenTable "詞頻表", , d.acReadOnly
d.docmd.Maximize
End If
d.docmd.OpenTable "詞頻表", , d.acReadOnly
d.docmd.Maximize
rst.Close: db.Close: Set d = Nothing
Options.SaveInterval = 10 '恢復自動儲存
End '用Exit Sub無法每次關閉Access
錯誤處理:
Select Case Err.Number '主索引值重複
Case Is = 91, 3078
MsgBox "請再按一次!", vbCritical
'access.Application.Quit
d.Quit
End
Case Else
MsgBox Err.Number & ":" & Err.Description, vbExclamation
Resume
End Select
End Sub
Sub 指定11字數詞頻() '2002/11/15'以此為例,可作為預先限定字數的各個程序(本例為11個字的查詢)
On Error GoTo 錯誤處理
Dim wrong As Long, phra As Long, phras As String, phralh As String
Dim StTime As Date, EndTime As Date
Dim hfspace As Long
'phralh = InputBox("請用阿拉伯數字指定詞的組成字數,最多字數為「11」!", "指定詞彙字數", "2")
'If phralh = "" Or Not IsNumeric(phralh) Then Exit Sub
'If CByte(phralh) > 11 Or CByte(phralh) < 1 Then Exit Sub
Options.SaveInterval = 0 '取消自動儲存
Set d = CreateObject("access.application")
d.UserControl = True
d.OpenCurrentDatabase "d:\千慮一得齋\書籍資料\詞頻.mdb", False
d.docmd.SelectObject d.acTable, "詞頻表", True
'd.Visible = True '檢查用
Set db = d.CurrentDb
Set rst = db.OpenRecordset("詞頻表", dbOpenDynaset)
If rst.RecordCount > 0 Then '要獲得全部的筆數須用MoveLast但此只需判斷有沒有原先的記錄即可!
'rst打開以後只會取得第一筆記錄!
' db.Execute "DELETE 字頻表.* FROM 字頻表"
db.Execute "DELETE * FROM 詞頻表"
End If
StTime = Time
With ActiveDocument
For phra = 1 To .Characters.Count
If phra + 10 <= .Characters.Count Then _
phras = .Characters(phra) & .Characters(phra + 1) & _
.Characters(phra + 2) & .Characters(phra + 3) & _
.Characters(phra + 4) & .Characters(phra + 5) & _
.Characters(phra + 6) & .Characters(phra + 7) & _
.Characters(phra + 8) & .Characters(phra + 9) & _
.Characters(phra + 10)
If Len(phras) > 1 And Right(phras, 1) = " " Then
hfspace = hfspace + 1 '計次
GoTo 11 '字串右邊是半形空格時,AccessUpdate時會銷去,且於詞彙亦無意意,故不計!
End If
'直接進入下一個字串比對
wrong = wrong + 1 '檢視用!
' If wrong Mod 29688 = 0 Then '到29688時會產生OLE沒有回應的錯誤,故在此歇會兒
' MsgBox "請檢查!!"
'' ElseIf wrong = 49761 Then
'' MsgBox "請檢查!!"
' End If
With rst
.FindFirst "詞彙 like '" & phras & "'"
If .NoMatch Then
.AddNew
rst("詞彙") = phras
' rst("次數") = 1'預設值已定為1
.Update 'dbUpdateBatch, True
Else
.Edit
rst("次數") = rst("次數") + 1
.Update
End If
End With
11 Next phra
EndTime = Time
AppActivate "Microsoft word"
MsgBox "統計完成!!" & vbCr & "(※共執行了" & wrong & "次的檢查※)" _
& "詞彙右邊半形空格凡" & hfspace & "次,忽略不計!" _
& vbCr & "※耗時:" & Format(EndTime - StTime, "n分s秒") & "※" _
& vbCr & "字元數=" & .Characters.Count
End With
If MsgBox("要即刻檢視結果嗎?", vbYesNo + vbQuestion) = vbYes Then
' Set d = GetObject("d:\千慮一得齋\書籍資料\詞頻.mdb")
AppActivate "Microsoft access"
d.docmd.OpenTable "詞頻表", , d.acReadOnly
d.docmd.Maximize
End If
d.docmd.OpenTable "詞頻表", , d.acReadOnly
d.docmd.Maximize
rst.Close: db.Close: Set d = Nothing
Options.SaveInterval = 10 '恢復自動儲存
End '用Exit Sub無法每次關閉Access
錯誤處理:
Select Case Err.Number '主索引值重複
Case Is = 91, 3078
MsgBox "請再按一次!", vbCritical
'access.Application.Quit
d.Quit
End
Case Else
MsgBox Err.Number & ":" & Err.Description, vbExclamation
Resume
End Select
End Sub
Sub 指定10字數詞頻() '2002/11/15
On Error GoTo 錯誤處理
Dim wrong As Long, phra As Long, phras As String, phralh As String
Dim StTime As Date, EndTime As Date
Dim hfspace As Long
Options.SaveInterval = 0 '取消自動儲存
Set d = CreateObject("access.application")
d.UserControl = True
d.OpenCurrentDatabase "d:\千慮一得齋\書籍資料\詞頻.mdb", False
d.docmd.SelectObject d.acTable, "詞頻表", True
'd.Visible = True '檢查用
Set db = d.CurrentDb
Set rst = db.OpenRecordset("詞頻表", dbOpenDynaset)
If rst.RecordCount > 0 Then '要獲得全部的筆數須用MoveLast但此只需判斷有沒有原先的記錄即可!
'rst打開以後只會取得第一筆記錄!
' db.Execute "DELETE 字頻表.* FROM 字頻表"
db.Execute "DELETE * FROM 詞頻表"
End If
StTime = Time
With ActiveDocument
For phra = 1 To .Characters.Count
If phra + 9 <= .Characters.Count Then _
phras = .Characters(phra) & .Characters(phra + 1) & _
.Characters(phra + 2) & .Characters(phra + 3) & _
.Characters(phra + 4) & .Characters(phra + 5) & _
.Characters(phra + 6) & .Characters(phra + 7) & _
.Characters(phra + 8) & .Characters(phra + 9)
If Len(phras) > 1 And Right(phras, 1) = " " Then
hfspace = hfspace + 1 '計次
GoTo 11 '字串右邊是半形空格時,AccessUpdate時會銷去,且於詞彙亦無意意,故不計!
End If
'直接進入下一個字串比對
wrong = wrong + 1 '檢視用!
' If wrong Mod 29688 = 0 Then '到29688時會產生OLE沒有回應的錯誤,故在此歇會兒
' MsgBox "請檢查!!"
'' ElseIf wrong = 49761 Then
'' MsgBox "請檢查!!"
' End If
With rst
.FindFirst "詞彙 like '" & phras & "'"
If .NoMatch Then
.AddNew
rst("詞彙") = phras
' rst("次數") = 1'預設值已定為1
.Update 'dbUpdateBatch, True
Else
.Edit
rst("次數") = rst("次數") + 1
.Update
End If
End With
11 Next phra
EndTime = Time
AppActivate "Microsoft word"
MsgBox "統計完成!!" & vbCr & "(※共執行了" & wrong & "次的檢查※)" _
& "詞彙右邊半形空格凡" & hfspace & "次,忽略不計!" _
& vbCr & "※耗時:" & Format(EndTime - StTime, "n分s秒") & "※" _
& vbCr & "字元數=" & .Characters.Count
End With
If MsgBox("要即刻檢視結果嗎?", vbYesNo + vbQuestion) = vbYes Then
' Set d = GetObject("d:\千慮一得齋\書籍資料\詞頻.mdb")
AppActivate "Microsoft access"
d.docmd.OpenTable "詞頻表", , d.acReadOnly
d.docmd.Maximize
End If
d.docmd.OpenTable "詞頻表", , d.acReadOnly
d.docmd.Maximize
rst.Close: db.Close: Set d = Nothing
Options.SaveInterval = 10 '恢復自動儲存
End '用Exit Sub無法每次關閉Access
錯誤處理:
Select Case Err.Number '主索引值重複
Case Is = 91, 3078
MsgBox "請再按一次!", vbCritical
'access.Application.Quit
d.Quit
End
Case Else
MsgBox Err.Number & ":" & Err.Description, vbExclamation
Resume
End Select
End Sub
Sub 指定9字數詞頻() '2002/11/15
On Error GoTo 錯誤處理
Dim wrong As Long, phra As Long, phras As String, phralh As String
Dim StTime As Date, EndTime As Date
Dim hfspace As Long
Options.SaveInterval = 0 '取消自動儲存
Set d = CreateObject("access.application")
d.UserControl = True
d.OpenCurrentDatabase "d:\千慮一得齋\書籍資料\詞頻.mdb", False
d.docmd.SelectObject d.acTable, "詞頻表", True
'd.Visible = True '檢查用
Set db = d.CurrentDb
Set rst = db.OpenRecordset("詞頻表", dbOpenDynaset)
If rst.RecordCount > 0 Then '要獲得全部的筆數須用MoveLast但此只需判斷有沒有原先的記錄即可!
'rst打開以後只會取得第一筆記錄!
' db.Execute "DELETE 字頻表.* FROM 字頻表"
db.Execute "DELETE * FROM 詞頻表"
End If
StTime = Time
With ActiveDocument
For phra = 1 To .Characters.Count
If phra + 8 <= .Characters.Count Then _
phras = .Characters(phra) & .Characters(phra + 1) & _
.Characters(phra + 2) & .Characters(phra + 3) & _
.Characters(phra + 4) & .Characters(phra + 5) & _
.Characters(phra + 6) & .Characters(phra + 7) & _
.Characters(phra + 8)
If Len(phras) > 1 And Right(phras, 1) = " " Then
hfspace = hfspace + 1 '計次
GoTo 11 '字串右邊是半形空格時,AccessUpdate時會銷去,且於詞彙亦無意意,故不計!
End If
'直接進入下一個字串比對
wrong = wrong + 1 '檢視用!
' If wrong Mod 29688 = 0 Then '到29688時會產生OLE沒有回應的錯誤,故在此歇會兒
' MsgBox "請檢查!!"
'' ElseIf wrong = 49761 Then
'' MsgBox "請檢查!!"
' End If
With rst
.FindFirst "詞彙 like '" & phras & "'"
If .NoMatch Then
.AddNew
rst("詞彙") = phras
' rst("次數") = 1'預設值已定為1
.Update 'dbUpdateBatch, True
Else
.Edit
rst("次數") = rst("次數") + 1
.Update
End If
End With
11 Next phra
EndTime = Time
AppActivate "Microsoft word"
MsgBox "統計完成!!" & vbCr & "(※共執行了" & wrong & "次的檢查※)" _
& "詞彙右邊半形空格凡" & hfspace & "次,忽略不計!" _
& vbCr & "※耗時:" & Format(EndTime - StTime, "n分s秒") & "※" _
& vbCr & "字元數=" & .Characters.Count
End With
If MsgBox("要即刻檢視結果嗎?", vbYesNo + vbQuestion) = vbYes Then
' Set d = GetObject("d:\千慮一得齋\書籍資料\詞頻.mdb")
AppActivate "Microsoft access"
d.docmd.OpenTable "詞頻表", , d.acReadOnly
d.docmd.Maximize
End If
d.docmd.OpenTable "詞頻表", , d.acReadOnly
d.docmd.Maximize
rst.Close: db.Close: Set d = Nothing
Options.SaveInterval = 10 '恢復自動儲存
End '用Exit Sub無法每次關閉Access
錯誤處理:
Select Case Err.Number '主索引值重複
Case Is = 91, 3078
MsgBox "請再按一次!", vbCritical
'access.Application.Quit
d.Quit
End
Case Else
MsgBox Err.Number & ":" & Err.Description, vbExclamation
Resume
End Select
End Sub
Sub 指定8字數詞頻() '2002/11/15
On Error GoTo 錯誤處理
Dim wrong As Long, phra As Long, phras As String, phralh As String
Dim StTime As Date, EndTime As Date
Dim hfspace As Long
Options.SaveInterval = 0 '取消自動儲存
Set d = CreateObject("access.application")
d.UserControl = True
d.OpenCurrentDatabase "d:\千慮一得齋\書籍資料\詞頻.mdb", False
d.docmd.SelectObject d.acTable, "詞頻表", True
'd.Visible = True '檢查用
Set db = d.CurrentDb
Set rst = db.OpenRecordset("詞頻表", dbOpenDynaset)
If rst.RecordCount > 0 Then '要獲得全部的筆數須用MoveLast但此只需判斷有沒有原先的記錄即可!
'rst打開以後只會取得第一筆記錄!
' db.Execute "DELETE 字頻表.* FROM 字頻表"
db.Execute "DELETE * FROM 詞頻表"
End If
StTime = Time
With ActiveDocument
For phra = 1 To .Characters.Count
If phra + 7 <= .Characters.Count Then _
phras = .Characters(phra) & .Characters(phra + 1) & _
.Characters(phra + 2) & .Characters(phra + 3) & _
.Characters(phra + 4) & .Characters(phra + 5) & _
.Characters(phra + 6) & .Characters(phra + 7)
If Len(phras) > 1 And Right(phras, 1) = " " Then
hfspace = hfspace + 1 '計次
GoTo 11 '字串右邊是半形空格時,AccessUpdate時會銷去,且於詞彙亦無意意,故不計!
End If
'直接進入下一個字串比對
wrong = wrong + 1 '檢視用!
' If wrong Mod 29688 = 0 Then '到29688時會產生OLE沒有回應的錯誤,故在此歇會兒
' MsgBox "請檢查!!"
'' ElseIf wrong = 49761 Then
'' MsgBox "請檢查!!"
' End If
With rst
.FindFirst "詞彙 like '" & phras & "'"
If .NoMatch Then
.AddNew
rst("詞彙") = phras
' rst("次數") = 1'預設值已定為1
.Update 'dbUpdateBatch, True
Else
.Edit
rst("次數") = rst("次數") + 1
.Update
End If
End With
11 Next phra
EndTime = Time
AppActivate "Microsoft word"
MsgBox "統計完成!!" & vbCr & "(※共執行了" & wrong & "次的檢查※)" _
& "詞彙右邊半形空格凡" & hfspace & "次,忽略不計!" _
& vbCr & "※耗時:" & Format(EndTime - StTime, "n分s秒") & "※" _
& vbCr & "字元數=" & .Characters.Count
End With
If MsgBox("要即刻檢視結果嗎?", vbYesNo + vbQuestion) = vbYes Then
' Set d = GetObject("d:\千慮一得齋\書籍資料\詞頻.mdb")
AppActivate "Microsoft access"
d.docmd.OpenTable "詞頻表", , d.acReadOnly
d.docmd.Maximize
End If
d.docmd.OpenTable "詞頻表", , d.acReadOnly
d.docmd.Maximize
rst.Close: db.Close: Set d = Nothing
Options.SaveInterval = 10 '恢復自動儲存
End '用Exit Sub無法每次關閉Access
錯誤處理:
Select Case Err.Number '主索引值重複
Case Is = 91, 3078
MsgBox "請再按一次!", vbCritical
'access.Application.Quit
d.Quit
End
Case Else
MsgBox Err.Number & ":" & Err.Description, vbExclamation
Resume
End Select
End Sub
Sub 指定6字數詞頻() '2002/11/15
On Error GoTo 錯誤處理
Dim wrong As Long, phra As Long, phras As String, phralh As String
Dim StTime As Date, EndTime As Date
Dim hfspace As Long
Options.SaveInterval = 0 '取消自動儲存
Set d = CreateObject("access.application")
d.UserControl = True
d.OpenCurrentDatabase "d:\千慮一得齋\書籍資料\詞頻.mdb", False
d.docmd.SelectObject d.acTable, "詞頻表", True
'd.Visible = True '檢查用
Set db = d.CurrentDb
Set rst = db.OpenRecordset("詞頻表", dbOpenDynaset)
If rst.RecordCount > 0 Then '要獲得全部的筆數須用MoveLast但此只需判斷有沒有原先的記錄即可!
'rst打開以後只會取得第一筆記錄!
' db.Execute "DELETE 字頻表.* FROM 字頻表"
db.Execute "DELETE * FROM 詞頻表"
End If
StTime = Time
With ActiveDocument
For phra = 1 To .Characters.Count
If phra + 5 <= .Characters.Count Then _
phras = .Characters(phra) & .Characters(phra + 1) & _
.Characters(phra + 2) & .Characters(phra + 3) & _
.Characters(phra + 4) & .Characters(phra + 5)
If Len(phras) > 1 And Right(phras, 1) = " " Then
hfspace = hfspace + 1 '計次
GoTo 11 '字串右邊是半形空格時,AccessUpdate時會銷去,且於詞彙亦無意意,故不計!
End If
'直接進入下一個字串比對
wrong = wrong + 1 '檢視用!
' If wrong Mod 29688 = 0 Then '到29688時會產生OLE沒有回應的錯誤,故在此歇會兒
' MsgBox "請檢查!!"
'' ElseIf wrong = 49761 Then
'' MsgBox "請檢查!!"
' End If