1

NBSPS を検索して通常のスペースに置き換え、trim を使用してテキストの前後のスペースをクリーンアップすることにより、Microsoft Word の表から非改行スペースを削除するように設計された VBA スクリプトがあります。現状では、コードはテーブルの最初のセルをトリミングする以外はすべて機能します (ただし、最初のセルのスペースは置き換えられます)。MS Word でテーブル用のマクロをいくつか作成するので、これを引き起こす可能性のある Word/VBA に固有の動作があるかどうかを調べたいと思っていました。

Sub nbsbCleanupQuick()
' use find and replace to replace all nbsp in the table with regular spaces
' use trim to clean up unwanted spaces
' For some reason this macro will replace nbsp with regular spaces but will not trim in the first cell of a table

' vars for counting
Dim numRows, numCells As Integer
Dim rindex, cindex As Integer

'container for cell contents
Dim container As String

Selection.Tables(1).Select
numRows = Selection.Rows.Count

For rindex = 1 To numRows
numCells = Selection.Tables(1).Rows(rindex).Cells.Count
For cindex = 1 To numCells
    container = ""
    Selection.Tables(1).Rows(rindex).Cells(cindex).Range.Select
    With Selection.Find
        .Text = Chr(160)
        .Replacement.Text = Chr(32)
        .Execute Replace:=wdReplaceAll, Wrap:=wdFindContinue
    End With
    If (Len(Selection.Text) - 2 > 0) Then
        container = Left(Selection.Text, Len(Selection.Text) - 2)
    End If
    Selection.Text = Trim(container)
Next
Next

End Sub

どんな助けでも大歓迎です:)

4

1 に答える 1

1

あなたはより大きなプロジェクトの最初にいるので、コードをさらに変更してアドバイスをします。コード内の変更の理由を説明するいくつかのコメントとともに、以下の提案されたソリューションを参照してください。明らかに、これにより、質問で説明した問題が解決されます。

Sub nbsbCleanupQuick()
' use find and replace to replace all nbsp in the table with regular spaces
' use trim to clean up unwanted spaces
' For some reason this macro will replace nbsp with regular spaces but will not trim in the first cell of a table

' vars for counting
Dim numRows, numCells As Integer
Dim rindex, cindex As Integer

'container for cell contents
Dim container As String

Selection.Tables(1).Select
numRows = Selection.Rows.Count

'do replacement once, at the beginning
'it will be more efficient option
    ActiveDocument.Tables(1).Select
    With Selection.Find
        .Text = Chr(160)
        .Replacement.Text = Chr(32)
        .Execute Replace:=wdReplaceAll ', Wrap:=wdFindContinue
        'keep wrap parameter switch off to do replacement only within table 1
    End With

'to iterate through all cells in table use this kind of loop
Dim tblCell As Cell
For Each tblCell In ActiveDocument.Tables(1).Range.Cells

        'it's not necessary to select but I didn't want to
        'change your solution completly
        tblCell.Select

    'this check is easier to understand
    If (Len(Selection.Text) > 2) Then
        container = Left(Selection.Text, Len(Selection.Text) - 2)
    End If
    Selection.Text = Trim(container)

Next

End Sub
于 2013-08-30T15:36:34.873 に答える