2013-04-10 2 views
2

У меня есть таблица в MSWord, которая содержит имена, дату и нечисловые данные. Я хотел бы написать макрос, который извлекает эти данные и делает так, что когда пользователь нажимает кнопку «Сохранить как», предлагаемое имя файла упорядочивает данные в определенном порядке, разделенные точками.VBA для создания save-as filename из данных в документе

Вот что таблица выглядит следующим образом:

Первая колонка:

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

Вторая колонка:

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 
+1

Именно в этой части этого вы столкнулись с проблемой? Вы вообще знаете какой-либо VBA? Если да, что вы пробовали до сих пор? –

+0

Я делаю, но недостаточно, чтобы получить конкретное имя файла. До сих пор я достаточно закодирован, чтобы заставить его работать так, что когда я нажимаю «Сохранить как», я могу сделать предлагаемое имя файла любым текстом, который я хочу, в макросе, например «CRAZY.doc». Я пытаюсь выяснить, как получить макрос для настройки предложенного имени файла с помощью таблицы. – user2259920

+1

Честно говоря, это относительно легко. Покажите код, который будет проще ... –

ответ

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)) 

Затем, везде, где у вас есть имя hardcoded, используйте переменную.

With Dialogs(wdDialogFileSaveAs) 
    .Name = sFileName 
+0

Большое вам спасибо за это! Боюсь, я не могу понять, как включить его в свой код - как мне это сделать? Извините за дальнейшие вопросы. – user2259920

+0

Я добавил к дну пример. –

+0

Официально работает. Удивительно. Огромное спасибо. Отлично. – user2259920