VBAarrays提取数据

当“不是rng.Characters(iEnd,1).Font.Italic”中的“Not”被省略时,代码能够拉斜体和加下划线的单词,但是当我在代码中放置“Not”下划线,而不是斜体字,它不起作用。 我不确定为什么“不”不工作。 下面的图片是源表单和提取数据的新表单。 我能够使用代码得到下划线和斜体,但我join不,所以我可以得到下划线,但不斜体。 应该出来的数据是标记为1的图片中的第5行。

在这里输入图像说明

在这里输入图像说明

Sub extract() Dim dataRng As Range, cl As Range Dim marr As Variant Set dataRng = Worksheets("Sheet1").Range("C1:C10") With Worksheets("Sheet2") For Each cl In dataRng marr = GetUnderlines(cl) If IsArray(marr) Then .Cells(.Rows.Count, 4).End(xlUp).Offset(1).Resize(UBound(marr) + 1) = Application.Transpose(marr) Next End With End Sub Function GetUnderlines(rng As Range) As Variant Dim strng As String Dim iEnd As Long, iIni As Long, strngLen As Long strngLen = Len(rng.Value2) iIni = 1 Do While iEnd <= strngLen Do While rng.Characters(iEnd, 1).Font.Underline And Not rng.Characters(iEnd, 1).Font.Italic If iEnd = strngLen Then Exit Do iEnd = iEnd + 1 Loop If iEnd > iIni Then strng = strng & Mid(rng.Value2, iIni, iEnd - iIni) & "|" iEnd = iEnd + 1 iIni = iEnd Loop If strng <> "" Then GetUnderlines = Split(Left(strng, Len(strng) - 1), "|") End Function 

.Font.Underline不返回Boolean(True/False) ;)它返回一个Long

如果你添加一个Watch你可以看到它自己。

在这里输入图像说明

改变你的代码

 Do While rng.Characters(iEnd, 1).Font.Underline = xlUnderlineStyleSingle _ And Not rng.Characters(iEnd, 1).Font.Italic 

当条件改变时:

下划线不是boolean

  Do While (rng.Characters(iEnd, 1).Font.Underline = -4142 Or _ (rng.Characters(iEnd, 1).Font.Underline = 2 And _ Not rng.Characters(iEnd, 1).Font.Italic)) 

您的代码正在截断最后一个字符。

 Function GetUnderlines(rng As Range) As Variant Dim strng As String Dim iEnd As Long, iIni As Long, strngLen As Long strngLen = Len(rng.Value2) iIni = 1 Do While iEnd <= strngLen Do While rng.Characters(iEnd, 1).Font.Underline = xlUnderlineStyleSingle And Not rng.Characters(iEnd, 1).Font.Italic And rng.Characters(iEnd, 1).Text <> " " iEnd = iEnd + 1 If iEnd > strngLen Then Exit Do Loop If iEnd > iIni Then strng = strng & Mid(rng.Value2, iIni, iEnd - iIni) & "|" End If iEnd = iEnd + 1 iIni = iEnd Loop If strng <> "" Then GetUnderlines = Split(Left(strng, Len(strng) - 1), "|") End Function