1

ユーザーが Excel 内でタスク リストを作成し、ユーザーが作成したタスク テキストを、事前に作成された Word ドキュメント内の 2 番目のヘッダー テキスト (ヘッダー 2) と比較できるようにするプロジェクトを作成しています。2 番目のヘッダー テキストを取得して配列に保存し、次にユーザー タスク リストを取得して配列内に保存することができます。次に、関数を使用して、プログラム内のタスク テキスト (2 番目のヘッダー) がユーザー タスク リスト内にあるかどうかを確認します。

    If IsError(Application.Match(ProgArray(x), TaskArray, 0)) Then
        'Find within word document and highlight red
    End if

私が得ている問題は、何らかの理由で、組み込みのウ​​ォッチ画面デバッガーがそうでないと言っているにもかかわらず、Word ドキュメント内のテキストが Excel シート内のまったく同じテキストと一致しないため、常にエラーが返されることです。

最初に、テキスト比較ソフトウェアを使用して、Word のヘッダーのテキストが実際には余分な行をコピーした可能性があることを確認しました。説明の写真:例はこちら

しかし、その後、トリミングして、ヘッダー テキストに vbNewLine があるかどうかを確認しようとしました

    If Right$(StrFound, 2) = vbCrLf Or Right$(StrFound, 2) = vbNewLine Then

また、この if ステートメントがトリガーされなかったため、役に立ちませんでした。

私の質問は、単語文書からテキストを取得することで、私が見逃している隠された価値を引き出すこともできますか?もしそうなら、これを回避する方法はありますか? テキストの壁に感謝し、申し訳ありません。

最後に、ここに私の完全なコードがあります:

'Sub CheckHeader()
Dim blnFound As Boolean
Dim StrFound As String
Dim x As Integer, y As Integer, z As Integer
Dim TaskTotal As Integer
Dim ProgArray(149) As String
Dim TaskArray() As String
Dim NotInArray() As String
Dim NotInProg() As String
Dim appWd As Object
Dim TaskSheet As Worksheet

Set appWd = GetObject(, "Word.Application")
Set wdFind = appWd.Selection.Find
Set TaskSheet = Sheets("Task List")

'Get Task List from Excel
TaskTotal = TaskSheet.Cells(TaskSheet.Rows.Count, 1).End(xlUp).Row - 1
ReDim TaskArray(TaskTotal) As String
ReDim NotInProg(TaskTotal) As String
ReDim NotInArray(TaskTotal) As String

'Get User task list into an array to compare - 0 to 0 is for testing
For x = 0 To 0 'TaskTotal - 1
    TaskArray(x) = TaskSheet.Cells(2 + x, 5).Value '+ " (" & TaskSheet.Cells(2 + x, 1).Value + " " _
        & TaskSheet.Cells(2 + x, 3).Value + ": " & TaskSheet.Cells(2 + x, 4).Value + ")"
Next x

x = 0
y = 0
'Find all instances of Headings
With ActiveDocument.Range.Find
    '.Text = "Test"
    .Style = "Heading 2"

    Do
        blnFound = .Execute
        If blnFound Then
            'MsgBox .Parent.Text
            StrFound = .Parent.Text
            'StrFound = Right(StrFound, InStr(StrFound, ")") + 1)
            StrFound = CStr(StrFound)
            TaskSheet.Cells(2 + x, 120).Value = StrFound
            'At first I thought it was also saving a new line but I couldn't get rid of it
            If Right$(StrFound, 2) = vbCrLf Or Right$(StrFound, 2) = vbNewLine Then
            z = 1
            End If
            ProgArray(x) = TaskSheet.Cells(2 + x, 120)
            'StrFound
            x = x + 1
        Else
            Exit Do
        End If
    Loop
    End With

       'Compare if List is in Program
     For x = 0 To 149
    If x < TaskTotal - 1 Then
        If IsError(Application.Match(TaskArray(x), ProgArray, 0)) Then
            NotInProg(y) = TaskArray(x)
            y = y + 1
        End If
    End If

    'If the header is not within the user created task list then run this case
    If IsError(Application.Match(ProgArray(x), TaskArray, 0)) Then
        'used for debugging, for some reason the header text is larger than the user text
        MsgBox StrComp(ProgArray(x), TaskArray(x))

        NotInArray(z) = ProgArray(x)
        SearchName = NotInArray(z)
        'Increase element
        z = z + 1
        'Check Program and highlight to show that what is in the program is not in the user task list
        With wdFind
            .Text = SearchName
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Execute
        End With
        If wdFind.Found Then
            'MsgBox " Found it"
            appWd.Selection.Range.HighlightColorIndex = wdRed
        Else
            MsgBox ProgArray(x) + " is not in TaskList"
        End If
    Else
        'Otherwise it is in the program and if it was red, unhighlight the text
        SearchName = TaskArray(x)
        With wdFind
            .Text = SearchName
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Execute
        End With
        If wdFind.Found Then
            'MsgBox " Found it"
            appWd.Selection.Range.HighlightColorIndex = wdNoHighlight

            ' For not in task Selection.Range.HighlightColorIndex = wdRed

            ' For not in prog Selection.Range.HighlightColorIndex = wdYellow
        Else
            MsgBox TaskArray(x) + " is not here"
        End If
    End If

     'Lastly Check for Ordering

     Next x

     End Sub'
4

1 に答える 1

5

コード内に 2 つの問題があり、それらの解決策は次のとおりです。

  1. 新しい段落記号を切り取るには、次のように切り取る必要があります。

    .Parent.SetRange .Parent.Start, .Parent.End - 1
    

    直前に置く必要があるもの:

    StrFound = .Parent.Text
    
  2. .Parent.MoveEndさらに、 の直後に追加x=x+1しますdo...loop

于 2013-04-09T05:25:19.977 に答える