2

名前、日付、および非数値データを含む MSWord のテーブルがあります。このデータを抽出して、ユーザーが [名前を付けて保存] をクリックしたときに、提案されたファイル名がピリオドで区切られた特定の順序でデータを配置するようにするマクロを書きたいと思います。

テーブルは次のようになります。

最初の列:

Date     04/10/13
Name 1   Arthur Z
Name 2   Bea Y
Title 1  Cars

2 列目:

Title 2  Boats
Company  Burger King
Color    Red
Name 3   Caroline X

ファイル名は次の形式にする必要があります。

Burger King.Red.Y.Bea.04-10-13.Arthur Z.(extension)

私が持っているコード:

Sub FileSaveAs()
   ActiveDocument.Fields.Update
   ActiveDocument.Fields.Update

   'Updated twice because some of the fields that need 
   'to be updated rely on fields below it and since it 
   'doesn't take too long I didn't bother figuring out 
   'how to make it update backwards--but if anyone knows 
   'how, please lmk
    Dim r As Range
    Set r = ActiveDocument.Range
    Dim fld As Field
    Dim iCnt As Integer
    For Each fld In ActiveDocument.Fields
        'All this field and highlight stuff is to edit the 
        'document down--I have all this done
        If fld.Type = wdFieldFormTextInput Then iCnt = iCnt + 1
        Next
        If iCnt >= 1 Then
        Dim Response As VbMsgBoxResult
            Response = MsgBox("Delete notes and shading?", vbYesNo + vbQuestion)
              If Response = vbYes Then
                    With r.Find
                    .Highlight = True
                    .Forward = True
                    While .Execute
                    r.Delete
                    Wend
                    End With
        For Each fld In ActiveDocument.Fields
        fld.Select
            If fld.Type = wdFieldFormTextInput Then
            fld.Unlink
            End If
            Next
            With Dialogs(wdDialogFileSaveAs)
            .Name = "Burger King.Red.Y.Bea.04-10-13.Arthur Z.docm"
            .Show
            End With
            EndUndoSaver
            Exit Sub
    ElseIf Response = vbNo Then
    With Dialogs(wdDialogFileSaveAs)
    .Name = "Burger King.Red.Y.Bea.04-10-13.Arthur Z.docm"
    .Show
    End With
    End If
    EndUndoSaver
    Exit Sub
ElseIf iCnt = 0 Then
With Dialogs(wdDialogFileSaveAs)
.Name = "Burger King.Red.Y.Bea.04-10-13.Arthur Z.docm"
.Show
End With
End If
Set fld = Nothing
End Sub
4

1 に答える 1

2

ファイル名を作成する 2 つの関数を次に示します。テーブルにデータを指定すると、GetFileName は必要な文字列を返します。

Public Function GetFileName(tbl As Table)

    Dim aReturn(1 To 7) As String
    Dim vaName2 As Variant

    aReturn(1) = CleanString(tbl.Cell(2, 2).Range.Text)
    aReturn(2) = CleanString(tbl.Cell(3, 2).Range.Text)
    vaName2 = Split(tbl.Cell(3, 1).Range.Text, Space(1))
    On Error Resume Next
        aReturn(3) = CleanString(vaName2(1))
    On Error GoTo 0
    aReturn(4) = CleanString(vaName2(0))
    aReturn(5) = Format(CleanString(tbl.Cell(1, 1).Range.Text), "mm-dd-yy")
    aReturn(6) = CleanString(tbl.Cell(2, 1).Range.Text)
    aReturn(7) = "txt"

    GetFileName = Join(aReturn, ".")

End Function

Public Function CleanString(ByVal sText As String)

    CleanString = Replace(Replace(sText, Chr$(7), vbNullString), vbCr, vbNullString)

End Function

テーブルからテキストを取り出すためのより良い方法があるかもしれませんが、私が持っているのはそれだけです。あなたのテーブルで、あなたは得る

?getfilename(thisdocument.Tables(1))
Burger King.Red.Y.Bea.04-10-13.Arthur Z.txt

どのテーブルを使用すればよいかわかりませんが、知っていると思います。結果を変数に格納し、その変数がハードコーディングされている場所で使用するだけです。

コードで使用するには

上記のコードを標準モジュールに貼り付けます。あなたの質問からは、ファイル名を作成するために必要な情報がどのテーブルに含まれているかわかりません。そのため、この例のドキュメントの最初のテーブルであると想定します。ファイル名を保持する変数を宣言します。

Dim sFileName As String

ファイル名が必要になる前のコードのどこかで、ファイル名を生成し、変数に保存します。

sFileName = GetFileName(ActiveDocument.Tables(1))

次に、名前がハードコーディングされている場所で、変数を使用します。

With Dialogs(wdDialogFileSaveAs)
   .Name = sFileName
于 2013-04-11T13:36:11.077 に答える