ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3342|回复: 12

[求助] 请教如何通过代码实现单词音标按音节多少排序

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-4-8 07:45 | 显示全部楼层 |阅读模式
想要实现对音标音节进行排序,请教如何通过VBA代码实现单词音标所在段落(音标后面也可能会有中文意思的情况)进行排序?重音在前面的排在前面,重音在后面的排在后面。将双音节重音符号ˈ在前的段落放在前面,双音节重音符号ˈ在后(即重音符号在分割符号“•”后)的段落放在后面。
将三音节重音符号ˈ在前的段落放在前面,三音节重音符号ˈ在中(即重音符号在第1个分割符号“•”后)的段落放在其次,三音节重音符号ˈ在后(即重音符号在第2个分割符号“•”后)的段落放在最后。
四个音节,五个音节……以此类推。
感觉可以根据重音符号与分割符号“•”的位置对每种情况进行分类。

音节归类.rar

7.57 KB, 下载次数: 30

TA的精华主题

TA的得分主题

发表于 2018-4-8 13:56 | 显示全部楼层
本帖最后由 duquancai 于 2018-4-8 14:04 编辑

排序不是重点,原来你也提过这个问题,我原来也说过重点在于:从文档中怎么区分开  重音、双音节重音、三音节重音???只要区分开来了,排序就简单了!
比如 这个是什么音节?怎么断定它归类到“三音节的”?判断的标准是什么?同为“三音节”的又如何区分前后关系?,一句话怎么区分开,这才是重点!!!

111.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-4-8 16:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
duquancai 发表于 2018-4-8 13:56
排序不是重点,原来你也提过这个问题,我原来也说过重点在于:从文档中怎么区分开  重音、双音节重音、三音 ...

感谢duquancai兄的关注!
1、区分音节数量的依据是分割符(中间点),如果是单音节,则没有分割符,如果是双音节,则有一个分割符(中间点),如果是三音节,则有两个分割符(中间点),如果是四音节,则有三个分割符(中间点)。
2、判断同类音节的依据:
单音节:无重音符号,也无分割符号;
双音节:有重音符号,如果重音符号(即音标上方的一小竖符号)在第一个分割符前,则属于重音在前(第一个音节);如果重音符号(即音标上方的一小竖符号)在第一个分割符后,则属于重音在后(重音在第二个音节);
三音节:有重音符号,如果重音符号(即音标上方的一小竖符号)在第一个分割符前,则属于重音在前(第一个音节);如果重音符号(即音标上方的一小竖符号)在第二个分割符前,则属于重音在中(重音在第二个音节);如果重音符号(即音标上方的一小竖符号)在第二个分割符后,则属于重音在后(重音在第三个音节);
四音节:有重音符号,如果重音符号(即音标上方的一小竖符号)在第一个分割符前,则属于重音在前(第一个音节);如果重音符号(即音标上方的一小竖符号)在第二个分割符前,则属于重音在第二个音节);如果重音符号(即音标上方的一小竖符号)在第三个分割符前,则属于重音在第三个音节;如果重音符号(即音标上方的一小竖符号)在第三个分割符后,则属于重音在第四个音节;
以此类推
各段落按上述方式进行排序,烦请duquancai兄帮帮忙。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-4-12 06:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
duquancai 发表于 2018-4-8 13:56
排序不是重点,原来你也提过这个问题,我原来也说过重点在于:从文档中怎么区分开  重音、双音节重音、三音 ...

上图,能否请杜老师帮忙解决?
1.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-4-14 14:13 | 显示全部楼层
duquancai 发表于 2018-4-8 13:56
排序不是重点,原来你也提过这个问题,我原来也说过重点在于:从文档中怎么区分开  重音、双音节重音、三音 ...

期待杜老师帮忙解决……

TA的精华主题

TA的得分主题

发表于 2018-4-14 14:31 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
tangqingfu 发表于 2018-4-14 14:13
期待杜老师帮忙解决……

不是不帮你,可能花时间非常多,代码量很大!应该很少会有人帮你写这个代码,还是那句话:花费时间太多!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-4-14 15:09 | 显示全部楼层
duquancai 发表于 2018-4-14 14:31
不是不帮你,可能花时间非常多,代码量很大!应该很少会有人帮你写这个代码,还是那句话:花费时间太多!

好像是不好解决。
谢谢杜老师!如果有时间,还请杜老师能帮帮忙。

TA的精华主题

TA的得分主题

发表于 2018-4-14 15:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 413191246se 于 2018-4-14 15:26 编辑

唐兄:我建议你提供更具体的带有重音符号的模拟附件,并说明要达成的目标(杜先生 没时间,我有时间,看看能否帮到你,但不保证能成功)。刚才我试着做了一个代码,每个段落包括多少个"a",再排序,就是循环遍历段落即可(目前我还找不到那个分隔符·大圆点,如果你能替换,最好把它替换成小撇儿')。

TA的精华主题

TA的得分主题

发表于 2018-4-15 10:01 | 显示全部楼层
本帖最后由 duquancai 于 2018-4-15 14:20 编辑
tangqingfu 发表于 2018-4-14 15:09
好像是不好解决。
谢谢杜老师!如果有时间,还请杜老师能帮帮忙。

承蒙多次邀请!亦或今天周末有点时间,写了一下代码,也没时间逐字逐句斟酌!仅供一个思路!
目前代码:对“单音节、双音节、三音节、四音节”进行了排序!更多的“五音节、六音节......”,可扩展。
  1. Sub test()
  2.     Dim S As Range, p As Paragraph, nDoc As Document
  3.     Dim reg As Object, d As Object, mt, sr$, k, mySortKey$(), myK
  4.     Set S = IIf(Selection.Type = wdSelectionIP, ActiveDocument.Content, Selection.Range)
  5.     If S = ActiveDocument.Content Then
  6.         AB = MsgBox("要进行全文排序吗?", vbYesNoCancel + vbQuestion, "全文处理判断")
  7.         If AB <> vbYes Then Exit Sub
  8.     End If
  9.     Set reg = CreateObject("VBScript.Regexp")
  10.     reg.Global = True: reg.Pattern = "\u2022\u02c8?"
  11.     Set d = CreateObject("Scripting.Dictionary")
  12.     For Each p In S.Paragraphs
  13.         n = n + 1
  14.         If f(p.Range.Text, "/[^/一-﨩]+/") Then
  15.             Select Case reg.Execute(p.Range.Text).Count
  16.             Case Is = 0 '单音节
  17.                 d("A") = d("A") & "," & n
  18.             Case Is = 1 '双音节
  19.                 sr = reg.Execute(p.Range.Text)(0).Value
  20.                 If Not f(sr, "\u02c8") Then
  21.                     d("B") = d("B") & "," & n
  22.                 Else
  23.                     d("BA") = d("BA") & "," & n
  24.                 End If
  25.             Case Is = 2 '三音节
  26.                 Set mt = reg.Execute(p.Range.Text)
  27.                 For i = 1 To mt.Count
  28.                     If f(mt(i - 1).Value, "\u02c8") Then Exit For
  29.                 Next
  30.                 Select Case i
  31.                 Case Is = 3
  32.                     d("C") = d("C") & "," & n
  33.                 Case Is = 1
  34.                     d("CA") = d("CA") & "," & n
  35.                 Case Is = 2
  36.                     d("CB") = d("CB") & "," & n
  37.                 End Select
  38.             Case Is = 3 '四音节
  39.                 Set mt = reg.Execute(p.Range.Text)
  40.                 For i = 1 To mt.Count
  41.                     If f(mt(i - 1).Value, "\u02c8") Then Exit For
  42.                 Next
  43.                 Select Case i
  44.                 Case Is = 4
  45.                     d("D") = d("D") & "," & n
  46.                 Case Is = 1
  47.                     d("DA") = d("DA") & "," & n
  48.                 Case Is = 2
  49.                     d("DB") = d("DB") & "," & n
  50.                 Case Is = 3
  51.                     d("DC") = d("DC") & "," & n
  52.                 End Select
  53.             End Select
  54.         End If
  55.     Next
  56.     k = d.keys: ReDim mySortKey(1 To d.Count)
  57.     For i = 0 To UBound(k)
  58.         mySortKey(i + 1) = k(i)
  59.     Next
  60.     WordBasic.SortArray mySortKey()
  61.     Set nDoc = Documents.Add
  62.     For Each myK In mySortKey
  63.         For Each t In Split(Mid(d(myK), 2), ",")
  64.             With nDoc.Bookmarks("\EndOfDoc").Range
  65.                 .FormattedText = S.Paragraphs(t).Range.FormattedText
  66.             End With
  67.         Next
  68.     Next
  69. End Sub
  70. Function f(ByVal sr As String, ByVal r As String) As Boolean
  71.     Dim reg As Object
  72.     Set reg = CreateObject("VBScript.Regexp")
  73.     reg.Pattern = r
  74.     If reg.test(sr) Then f = True
  75. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-4-15 14:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
杜先生/老师 出手了,太好了!就是又是正则,又是书签,实在看不懂。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-12 04:06 , Processed in 0.025203 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表