Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2009, 08:12   #1
andreev
Новичок
Джуниор
 
Регистрация: 03.07.2009
Сообщений: 6
Стрелка имя файла из поля LINK

здравствуйте, уважаемые профи!
прошу помощи в следующем вопросе.
есть файл WORD со связями с Excel. ({ LINK Excel.Sheet.8 "E:\... })
Хотелось бы, чтобы при запуске макроса файл автоматически сохранялся с подставновкой значения одного из полей LINK в качестве имени файла
Соответственно, когда значение поля меняется (обновляется из источника Excel), то и файл сохранялся бы под другим именем.

заранее низкий поклон до земли-матушки )
andreev вне форума Ответить с цитированием
Старый 03.07.2009, 08:54   #2
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Проблем нет. Но какого именно поля Link? Сколько их всего в документе?
Пока что могу предложить такой вариант:
Код:
Sub SaveWithNameFromLinkField()
  Dim oFld As Field
  'Ищем среди полей документа поле Link со ссылкой на Excel
  For Each oFld In ActiveDocument.Fields
    If oFld.Type = 56 And InStr(oFld.Code.Text, "Excel.Sheet.8") <> 0 Then Exit For
  Next
  With oFld.Result
    'Если текст поля не совпадает с именем документа, то сохраняем документ под новым именем
    If .Text <> Mid(.Document.Name, 1, InStrRev(.Document.Name, ".") - 1) Then
      .Document.SaveAs .Text
    'Если совпадает, то просто сохраняем документ
    Else: .Document.Save
  End With
End Sub
Если нужно, то могу уточнить. Можно сохранить документ в ту же папку, откуда берется файл Excel для ссылки
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 03.07.2009 в 09:48.
viter.alex вне форума Ответить с цитированием
Старый 03.07.2009, 12:45   #3
andreev
Новичок
Джуниор
 
Регистрация: 03.07.2009
Сообщений: 6
По умолчанию

спасибо за ответ!

> Но какого именно поля Link?
{ LINK Excel.Sheet.8 "C:\\ТЕСТ.xls" ФОРМА!R5C2 \a \t \* MERGEFORMAT }

>Сколько их всего в документе?
около 1 200 (хотел сделать "слияние", но больше 255 полей не переваривает. пришлось ЛИНКами связывать)

у меня просьба: пожалуйста, уточните, где в макросе мне самому нужно внести изменения, чтобы все заработало (например, прописать код поля и т.д.), если это требуется, конечно

спасибо огромное!

Последний раз редактировалось andreev; 03.07.2009 в 12:52.
andreev вне форума Ответить с цитированием
Старый 03.07.2009, 12:59   #4
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от andreev Посмотреть сообщение
Сколько их всего в документе?
около 1 200 (хотел сделать "слияние", но больше 255 полей не переваривает. пришлось ЛИНКами связывать)
И из какого поля нужно брать значение? Кстати, я так и не понял, какой именно текст вам нужен: значение поля, или путь к файлу Excel, который прописан в коде поля?

Цитата:
Сообщение от andreev Посмотреть сообщение
…у меня просьба: пожалуйста, уточните, где в макросе мне самому нужно внести изменения, чтобы все заработало (например, прописать код поля и т.д.), если это требуется, конечно…
Ну Вам-то виднее, требуется или нет.

Такой код сделал я, чтобы извлечь путь к файлу из кода поля. Код можно поставить сразу после цикла, который ищет поле типа LINK,
Код:
  Dim nStart As Integer, nEnd As Integer
  Dim sPath As String
  With oFld.Code
    'Выделяем путь к файлу из строки кода поля
    nStart = InStr(.Text, """")
    nEnd = InStr(nStart + 1, .Text, """")
    sPath = Replace(Mid(.Text, nStart + 1, nEnd - nStart), "\\", "\")
    'Удаляем имя файла из пути
    sPath = Mid(sPath, 1, InStrRev(sPath, "\") )
  End With
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 03.07.2009 в 13:22.
viter.alex вне форума Ответить с цитированием
Старый 03.07.2009, 13:34   #5
andreev
Новичок
Джуниор
 
Регистрация: 03.07.2009
Сообщений: 6
По умолчанию

значение поля - в имя файла.
Т.к. при изменении значения в ячейке (ФОРМА!R5C2) источника данных (C:\\ТЕСТ.xls) меняется и значение поля в WORD - что и обуславливает необходимость сохранения файла под отдельным именем. (сам линк не меняется)

в данном случае поле, откуда нужно брать значение, имеет код:
{ LINK Excel.Sheet.8 "C:\\ТЕСТ.xls" ФОРМА!R5C2 \a \t \* MERGEFORMAT }

на всякий случай уточняю, что в документе присутствуют еще поля со связью, меняется ссылочная ячейка
C:\\ТЕСТ.xls" ФОРМА!R5C2

Последний раз редактировалось andreev; 03.07.2009 в 13:38.
andreev вне форума Ответить с цитированием
Старый 03.07.2009, 13:55   #6
andreev
Новичок
Джуниор
 
Регистрация: 03.07.2009
Сообщений: 6
По умолчанию

> Ну Вам-то виднее, требуется или нет.

ну вот как раз не особо-то и не виднее )))
я вот почитал форум. бывает так, что программист поможет, потратит время, напишет код. а у юзверя - не работает. и юзверь пишет опять, что, дескать, не работает... а программист ему: "дак воон в то поле надо было подставить вооон то значение! я же не знаю, как у тебя файл называется или из какой ячейки ты значение берешь!". Пригорюнится тут юзверь, посмотрит на код с языком заморским и заплачет горючими слезами...
andreev вне форума Ответить с цитированием
Старый 03.07.2009, 14:11   #7
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от andreev Посмотреть сообщение
…на всякий случай уточняю, что в документе присутствуют еще поля со связью, меняется ссылочная ячейка
C:\\ТЕСТ.xls" ФОРМА!R5C2
Т.е. нужно обязательно брать значение из поля, где есть ссылка на ячейку ФОРМА!R5C2?
Тогда самый первый мой код нужно изменить. Вместо
Код:
If oFld.Type = 56 And InStr(oFld.Code.Text, "Excel.Sheet.8") <> 0 Then Exit For
записать другое условие
Код:
If oFld.Type = 56 And InStr(oFld.Code.Text, "ФОРМА!R5C2") <> 0 Then Exit For
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 03.07.2009, 14:34   #8
andreev
Новичок
Джуниор
 
Регистрация: 03.07.2009
Сообщений: 6
По умолчанию

спасибо!
все поменял, подставил
думаю, последние штришки...

выдает ошибку Compile error: End With without With
andreev вне форума Ответить с цитированием
Старый 03.07.2009, 14:55   #9
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

У меня все работает. Скопируйте сюда код, который у Вас получился после Вашего редактирования. Думаю, что вы там лишнюю строчку удалили
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 03.07.2009, 14:56   #10
andreev
Новичок
Джуниор
 
Регистрация: 03.07.2009
Сообщений: 6
По умолчанию

о, подставил чисто интуитивно End If
все заработало!

дададададададададада! ура!

viter.alex спасибо ОГРОМНОЕ за время и терпение!
andreev вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
имя файла в Label1 )Игнат( Общие вопросы Delphi 5 26.06.2009 19:42
имя файла ? somwan Общие вопросы C/C++ 1 18.03.2009 17:46
Имя файла в ListBox Dr.Badnezz Общие вопросы Delphi 3 23.09.2008 17:56
Как в dbgrideh получить имя поля той колонки, по заголовку которой Вы щелкнули???? zimmion БД в Delphi 4 04.03.2008 15:02
можно ли узнать имя HTML-поля, кликнув на него? furstenberg Работа с сетью в Delphi 0 28.01.2008 16:49