Показать полную графическую версию : как пакетно назначить имена для клеток excel?
Мне нужно определенному диапазону клеток размером 50 столбцов на 2000 строк присвоить произвольные имена. Как это можно сделать? Может кто скриптом VBA подсобит?
Поясните:определенному диапазону »
единственное число
произвольные имена »
множественное....
Идею (цель) - подробнее
Если из эксель скопировать клетку и вставить ее через специальную вставку в ворд - получится связь. Изменив значение клетки в эксель - меняется значение в ворд. Так вот если клетку в эксель куда то перенести - связь теряется. Если клетке эксель предварительно дать имя, и затем сделать связь, то так связь ворд эксель не потеряется, так как ворд будет ссылаться не на координату а на имя клетки, которое является уникальным для листа.
Далее. У меня есть файл эксель с большими расчетами, состоящий примерно из 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. Вот если бы его починить, и дописать возможность автоматического присваивания произвольного имени клетке эксель при создании связи ворд эксель - это было бы самым шикарным вариантом... Такое можно осуществить?
Попробуйте убрать привязку к конкретной версии и обращаться по VersionIndependentProgID:
Set objExcel = GetObject(, "Excel.Application")
либо указать ProgID, соответствующий Вашей версии Microsoft Office.
P.S. У меня не получилось вставить связь, когда ячейке Excel присвоено имя (Microsoft Office 2003).
Попробуйте убрать привязку к конкретной версии и обращаться по VersionIndependentProgID:
Код:
Set objExcel = GetObject(, "Excel.Application") »
после этого у меня появилась другая ошибка:
Run-time error '438': Object doesn't support this property or method
Pozia, как я уже писал:
P.S. У меня не получилось вставить связь, когда ячейке Excel присвоено имя (Microsoft Office 2003). »
У Вас, насколько я понимаю, Microsoft Office 2010. Посему: опишите подробно, как Вы назначаете имя отдельной ячейке в Excel, как вставляете связь на эту ячейку в Microsoft Word. Если у меня сие получится воспроизвести — двинемся дальше, если нет — я отойду в сторону.
У Вас, насколько я понимаю, Microsoft Office 2010 »
да. но и в 2003 все работает практически также. Описываю как сделать именно в 2003. Ставим курсор на любую клетку в эксель, в поле где показывается координата выбранной клетки (левы верхний угол) просто вписываем нужное имя и нажимаем ввод. Так назначается имя клетки. Далее вписываем что либо в выбранную клетку и копируем содержимое в буфер обмена. В ворд выбираем Правка -> Специальная вставка. В окошке ставим птичку связать. Выбираем Неформатированный текст, жмем Ок. Все. Теперь если мы изменим что то в клетке эксель, в ворде тоже произойдет изменение. И если клетку в эксель мы перенесем в другое место, ворд все равно ее найдет. Вот примерно это и нужно реализовать макросом. И желательно имя клетки давать случайное как я писал ранее в формате "_******", где * - цифра произвольная. Спасибо за помощь.
Выбираем Неформатированный текст, жмем Ок. Все. »
У меня как раз с этим проблема:
Не удается получить данные для связи 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».
Iska, Спасибо. Буду пробовать днем. А что значитпотребуется задать ссылку на «Microsoft Excel Object Library». »
?
А что значит… »
См. выше:
В нете нашел вот такой скрипт:
…
В пункте меню Tools -> References отметить Microsoft Excel Object Library
… »
Iska, не могу найти у себя в 2010 русском. Не могли бы вы подсказать в какой хоть области это должно быть?
У Вас Visual Basic Editor (http://msdn.microsoft.com/en-us/library/ee814737.aspx):
http://i.msdn.microsoft.com/dynimg/IC359397.jpg
выглядит иначе?
Iska, у меня в 2010 есть только Microsoft Office 14.0 Object Library. Это то, что нужно? Если да, то все равно ошибка, как на фото. Еще прикрепил свой персонал. Что может быть не так?
И еще, я попутал. Нужно вставлять не "Неформатированный текст", а "Текст в формате RTF". Можно это в скрипте исправить?
Pozia, зачем вы сделали вложение в формате .xlsb?
Ну в крайнем случае *.xla, чтобы 2003 мог понять
Во-вторых, уберите все лишнее и оставьте только
Selection.PasteSpecial
и всё заработает
и всё заработает »
почти заработал. Имя присваивает клетке. В ворд ничего не вставляется (. Прикрепил сейчас как надо
Pozia, подождите Iska, а то я не совсем в теме
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
Iska, прошу прощения за свою тупоголовость ). Получилось. Сейчас попробовал на работе в глючном 2007 офисе и портабельном 2010. Наблюдалась только подвисание эксель секунд на 40 при первых двух трех вставках. Затем вроде нормально. У вас есть такие подвисания? Если нет, значит мои офисы кривые.
В шаблоне тоже прекрасно заработал. Спасибо огромное! ) Ваш скрипт сбережет кучу драгоценного времени ).
И еще вопрос по работе скрипта. Если я несколько раз вставляю одну и ту же клетку, то скрипт в последующем это количество раз пропускает и называет клетку не по порядку. Можно ли как то это исправить?
Механизм там такой:
* имена назначаются уровня рабочего листа, а не рабочей книги;
* при повторном использовании того же диапазона просто назначается дополнительно ещё одно имя.
Можно попробовать тот же механизм с обработкой ошибок, что и в «NameExists()». Вам надо, чтобы, при наличии у выделенного диапазона имени, не задавалось новое имя, а использовалось уже существующее имя диапазона, так?
У вас есть такие подвисания? »
Нет, не наблюдалось.
да. Нужно чтобы использовалось текущее имя при его наличие у клетки
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2024, Jelsoft Enterprises Ltd.