PDA

Показать полную графическую версию : как пакетно назначить имена для клеток excel?


Страниц : [1] 2 3

Pozia
21-01-2012, 00:18
Мне нужно определенному диапазону клеток размером 50 столбцов на 2000 строк присвоить произвольные имена. Как это можно сделать? Может кто скриптом VBA подсобит?

okshef
21-01-2012, 01:03
Поясните:определенному диапазону »
единственное число
произвольные имена »
множественное....
Идею (цель) - подробнее

Pozia
21-01-2012, 01:17
Если из эксель скопировать клетку и вставить ее через специальную вставку в ворд - получится связь. Изменив значение клетки в эксель - меняется значение в ворд. Так вот если клетку в эксель куда то перенести - связь теряется. Если клетке эксель предварительно дать имя, и затем сделать связь, то так связь ворд эксель не потеряется, так как ворд будет ссылаться не на координату а на имя клетки, которое является уникальным для листа.
Далее. У меня есть файл эксель с большими расчетами, состоящий примерно из 2000 строк и 50 столбцов. Вот для этого диапазона клеток мне нужно задать каждой клетке произвольное имя - допустим в формате "_******", где * - цифра произвольная. Вот это мне и нужно сделать.

В нете нашел вот такой скрипт:
Sub CopyFromExcel()
'Связывание таблиц Word и Excel по ячейкам. Необходимо выделить ячейки в Excel и
' соответствующиие им ячейки в Word
Dim objExcel, c, i
'Если ошибка - В пункте меню Tools -> References отметить
' Microsoft Excel Object Library
Set objExcel = GetObject(, "Excel.Application.11")
For Each c In Selection.Cells
i = i + 1
objExcel.Selection.Cells(i).Copy
c.Select
Selection.PasteExcelTable True, True, True
Next c
End Sub
который позволяет быстро скопировать клетку эксель в ворд создав связь. Работает так - выделяем клетку в ворд, выделяем в эксель, запускаем скрипт - ссылка готова. Но он почему то не работает. Выскакивает ошибка - Run-time error '429': ActiveX component can't create object. Вот если бы его починить, и дописать возможность автоматического присваивания произвольного имени клетке эксель при создании связи ворд эксель - это было бы самым шикарным вариантом... Такое можно осуществить?

Iska
21-01-2012, 07:58
Попробуйте убрать привязку к конкретной версии и обращаться по VersionIndependentProgID:
Set objExcel = GetObject(, "Excel.Application")
либо указать ProgID, соответствующий Вашей версии Microsoft Office.

P.S. У меня не получилось вставить связь, когда ячейке Excel присвоено имя (Microsoft Office 2003).

Pozia
21-01-2012, 11:51
Попробуйте убрать привязку к конкретной версии и обращаться по VersionIndependentProgID:
Код:
Set objExcel = GetObject(, "Excel.Application") »
после этого у меня появилась другая ошибка:
Run-time error '438': Object doesn't support this property or method

Iska
21-01-2012, 21:08
Pozia, как я уже писал:
P.S. У меня не получилось вставить связь, когда ячейке Excel присвоено имя (Microsoft Office 2003). »
У Вас, насколько я понимаю, Microsoft Office 2010. Посему: опишите подробно, как Вы назначаете имя отдельной ячейке в Excel, как вставляете связь на эту ячейку в Microsoft Word. Если у меня сие получится воспроизвести — двинемся дальше, если нет — я отойду в сторону.

Pozia
22-01-2012, 00:27
У Вас, насколько я понимаю, Microsoft Office 2010 »
да. но и в 2003 все работает практически также. Описываю как сделать именно в 2003. Ставим курсор на любую клетку в эксель, в поле где показывается координата выбранной клетки (левы верхний угол) просто вписываем нужное имя и нажимаем ввод. Так назначается имя клетки. Далее вписываем что либо в выбранную клетку и копируем содержимое в буфер обмена. В ворд выбираем Правка -> Специальная вставка. В окошке ставим птичку связать. Выбираем Неформатированный текст, жмем Ок. Все. Теперь если мы изменим что то в клетке эксель, в ворде тоже произойдет изменение. И если клетку в эксель мы перенесем в другое место, ворд все равно ее найдет. Вот примерно это и нужно реализовать макросом. И желательно имя клетки давать случайное как я писал ранее в формате "_******", где * - цифра произвольная. Спасибо за помощь.

Iska
23-01-2012, 00:58
Выбираем Неформатированный текст, жмем Ок. Все. »
У меня как раз с этим проблема:
Не удается получить данные для связи Excel.Sheet.8
про которую я и писал выше.

Была. Главное — правильно сформулировать запрос на английском языке. После этого была быстро найдена следующая статья базы знаний: Description of the Excel 2003 hotfix package: April 8, 2008 (http://support.microsoft.com/kb/951405), описывающая данную проблему буквально, а также дающая хотфикс для её устранения.

Pozia, попробуйте так:
Option Explicit

Sub CopyFromExcel()
Dim objExcel As Excel.Application
Dim strAddress As String
Dim strNewName As String

Dim i As Long

Set objExcel = GetObject(, "Excel.Application")

With objExcel.Selection
If .Worksheet.Type = xlWorksheet Then
i = .Worksheet.Names.Count + 1

Do
strNewName = "_" & CStr(i)

If Not NameExists(.Worksheet, strNewName) Then
Exit Do
Else
i = i + 1
End If
Loop

.Worksheet.Names.Add strNewName, "=" & .Address(, , xlR1C1, True)
.Copy

Selection.PasteSpecial , True, , , wdPasteText

.Application.CutCopyMode = False
End If
End With

Set objExcel = Nothing
End Sub

Function NameExists(objWorksheet As Excel.Worksheet, strName As String) As Boolean
On Error Resume Next

NameExists = Len(objWorksheet.Names(strName).Name) <> 0
End Function
Основной макрос — «CopyFromExcel()». Также потребуется задать ссылку на «Microsoft Excel Object Library».

Pozia
23-01-2012, 07:52
Iska, Спасибо. Буду пробовать днем. А что значитпотребуется задать ссылку на «Microsoft Excel Object Library». »
?

Iska
23-01-2012, 11:12
А что значит… »
См. выше:
В нете нашел вот такой скрипт:

В пункте меню Tools -> References отметить Microsoft Excel Object Library
… »

Pozia
23-01-2012, 14:55
Iska, не могу найти у себя в 2010 русском. Не могли бы вы подсказать в какой хоть области это должно быть?

Iska
23-01-2012, 15:01
У Вас Visual Basic Editor (http://msdn.microsoft.com/en-us/library/ee814737.aspx):

http://i.msdn.microsoft.com/dynimg/IC359397.jpg

выглядит иначе?

Pozia
23-01-2012, 23:11
Iska, у меня в 2010 есть только Microsoft Office 14.0 Object Library. Это то, что нужно? Если да, то все равно ошибка, как на фото. Еще прикрепил свой персонал. Что может быть не так?
И еще, я попутал. Нужно вставлять не "Неформатированный текст", а "Текст в формате RTF". Можно это в скрипте исправить?

okshef
23-01-2012, 23:36
Pozia, зачем вы сделали вложение в формате .xlsb?
Ну в крайнем случае *.xla, чтобы 2003 мог понять
Во-вторых, уберите все лишнее и оставьте только
Selection.PasteSpecial
и всё заработает

Pozia
23-01-2012, 23:56
и всё заработает »
почти заработал. Имя присваивает клетке. В ворд ничего не вставляется (. Прикрепил сейчас как надо

okshef
24-01-2012, 00:08
Pozia, подождите Iska, а то я не совсем в теме

Iska
24-01-2012, 04:29
Iska, у меня в 2010 есть только Microsoft Office 14.0 Object Library. Это то, что нужно? »
Да. Соответствие версий Microsoft Office их торговым наименованиям можно посмотреть, например, здесь: Microsoft Office - Wikipedia, the free encyclopedia (http://en.wikipedia.org/wiki/Microsoft_Office); в Вашем случае, соответственно, будет:
Microsoft Office 2010
Microsoft Office 2010 (Office 14.0) was finalized …

Если да, то все равно ошибка, как на фото. »
Мне следовало, пожалуй, вдумчивее подходить к подбору скриншота для иллюстрации. Вас это, очевидно, и ввело в заблуждение.

Суть вот в чём: код, приведённый в #8 (http://forum.oszone.net/post-1842349.html#post1842349) нужно вставлять в проект того документа Microsoft Word, с которым мы работаем. Туда же добавлять и ссылку на «Microsoft Excel Object Library». Потом, когда всё заработает, можно будет подумать и о переносе кода в отдельный шаблон, ежели данный код Вам окажется потребен не только для одного документа.

И еще, я попутал. Нужно вставлять не "Неформатированный текст", а "Текст в формате RTF". Можно это в скрипте исправить? »
Попробуйте заменить в вышеприведённом коде:
Selection.PasteSpecial , True, , , wdPasteText
на:
Selection.PasteSpecial , True, , , wdPasteRTF

Pozia
24-01-2012, 09:29
Iska, прошу прощения за свою тупоголовость ). Получилось. Сейчас попробовал на работе в глючном 2007 офисе и портабельном 2010. Наблюдалась только подвисание эксель секунд на 40 при первых двух трех вставках. Затем вроде нормально. У вас есть такие подвисания? Если нет, значит мои офисы кривые.
В шаблоне тоже прекрасно заработал. Спасибо огромное! ) Ваш скрипт сбережет кучу драгоценного времени ).
И еще вопрос по работе скрипта. Если я несколько раз вставляю одну и ту же клетку, то скрипт в последующем это количество раз пропускает и называет клетку не по порядку. Можно ли как то это исправить?

Iska
24-01-2012, 11:08
Механизм там такой:

* имена назначаются уровня рабочего листа, а не рабочей книги;
* при повторном использовании того же диапазона просто назначается дополнительно ещё одно имя.

Можно попробовать тот же механизм с обработкой ошибок, что и в «NameExists()». Вам надо, чтобы, при наличии у выделенного диапазона имени, не задавалось новое имя, а использовалось уже существующее имя диапазона, так?

У вас есть такие подвисания? »
Нет, не наблюдалось.

Pozia
24-01-2012, 11:52
да. Нужно чтобы использовалось текущее имя при его наличие у клетки




© OSzone.net 2001-2012