Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Microsoft Office (Word, Excel, Outlook и т.д.) (http://forum.oszone.net/forumdisplay.php?f=115)
-   -   как пакетно назначить имена для клеток excel? (http://forum.oszone.net/showthread.php?t=225826)

Pozia 21-01-2012 00:18 1840835

как пакетно назначить имена для клеток excel?
 
Мне нужно определенному диапазону клеток размером 50 столбцов на 2000 строк присвоить произвольные имена. Как это можно сделать? Может кто скриптом VBA подсобит?

okshef 21-01-2012 01:03 1840854

Поясните:
Цитата:

Цитата Pozia
определенному диапазону »

единственное число
Цитата:

Цитата Pozia
произвольные имена »

множественное....
Идею (цель) - подробнее

Pozia 21-01-2012 01:17 1840861

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

В нете нашел вот такой скрипт:
HTML код:

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 1840925

Попробуйте убрать привязку к конкретной версии и обращаться по VersionIndependentProgID:
Код:

Set objExcel = GetObject(, "Excel.Application")
либо указать ProgID, соответствующий Вашей версии Microsoft Office.

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

Pozia 21-01-2012 11:51 1840995

Цитата:

Цитата Iska
Попробуйте убрать привязку к конкретной версии и обращаться по VersionIndependentProgID:
Код:
Set objExcel = GetObject(, "Excel.Application") »

после этого у меня появилась другая ошибка:
Код:

Run-time error '438': Object doesn't support this property or method

Iska 21-01-2012 21:08 1841375

Pozia, как я уже писал:
Цитата:

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

У Вас, насколько я понимаю, Microsoft Office 2010. Посему: опишите подробно, как Вы назначаете имя отдельной ячейке в Excel, как вставляете связь на эту ячейку в Microsoft Word. Если у меня сие получится воспроизвести — двинемся дальше, если нет — я отойду в сторону.

Pozia 22-01-2012 00:27 1841509

Цитата:

Цитата Iska
У Вас, насколько я понимаю, Microsoft Office 2010 »

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

Iska 23-01-2012 00:58 1842349

Цитата:

Цитата Pozia
Выбираем Неформатированный текст, жмем Ок. Все. »

У меня как раз с этим проблема:
Цитата:

Не удается получить данные для связи Excel.Sheet.8
про которую я и писал выше.

читать дальше »
Была. Главное — правильно сформулировать запрос на английском языке. После этого была быстро найдена следующая статья базы знаний: Description of the Excel 2003 hotfix package: April 8, 2008, описывающая данную проблему буквально, а также дающая хотфикс для её устранения.


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 1842455

Iska, Спасибо. Буду пробовать днем. А что значит
Цитата:

Цитата Iska
потребуется задать ссылку на «Microsoft Excel Object Library». »

?

Iska 23-01-2012 11:12 1842525

Цитата:

Цитата Pozia
А что значит… »

См. выше:
Цитата:

Цитата Pozia
В нете нашел вот такой скрипт:
Код:


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

»


Pozia 23-01-2012 14:55 1842659

Iska, не могу найти у себя в 2010 русском. Не могли бы вы подсказать в какой хоть области это должно быть?

Iska 23-01-2012 15:01 1842661

У Вас Visual Basic Editor:



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

Pozia 23-01-2012 23:11 1842998

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

okshef 23-01-2012 23:36 1843018

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

Selection.PasteSpecial
и всё заработает

Pozia 23-01-2012 23:56 1843036

Цитата:

Цитата okshef
и всё заработает »

почти заработал. Имя присваивает клетке. В ворд ничего не вставляется (. Прикрепил сейчас как надо

okshef 24-01-2012 00:08 1843043

Pozia, подождите Iska, а то я не совсем в теме

Iska 24-01-2012 04:29 1843125

Цитата:

Цитата Pozia
Iska, у меня в 2010 есть только Microsoft Office 14.0 Object Library. Это то, что нужно? »

Да.
читать дальше »
Соответствие версий Microsoft Office их торговым наименованиям можно посмотреть, например, здесь: Microsoft Office - Wikipedia, the free encyclopedia; в Вашем случае, соответственно, будет:
Цитата:

Microsoft Office 2010
Microsoft Office 2010 (Office 14.0) was finalized …


Цитата:

Цитата Pozia
Если да, то все равно ошибка, как на фото. »

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

Суть вот в чём: код, приведённый в #8 нужно вставлять в проект того документа Microsoft Word, с которым мы работаем. Туда же добавлять и ссылку на «Microsoft Excel Object Library». Потом, когда всё заработает, можно будет подумать и о переносе кода в отдельный шаблон, ежели данный код Вам окажется потребен не только для одного документа.

Цитата:

Цитата Pozia
И еще, я попутал. Нужно вставлять не "Неформатированный текст", а "Текст в формате RTF". Можно это в скрипте исправить? »

Попробуйте заменить в вышеприведённом коде:
Код:

            Selection.PasteSpecial , True, , , wdPasteText
на:
Код:

            Selection.PasteSpecial , True, , , wdPasteRTF

Pozia 24-01-2012 09:29 1843192

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

Iska 24-01-2012 11:08 1843232

Механизм там такой:

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

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

Цитата:

Цитата Pozia
У вас есть такие подвисания? »

Нет, не наблюдалось.

Pozia 24-01-2012 11:52 1843254

да. Нужно чтобы использовалось текущее имя при его наличие у клетки

Iska 25-01-2012 17:28 1844314

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 = Excel.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
           
            If Not RangeHasName(objExcel.Selection) Then
                .Worksheet.Names.Add strNewName, "=" & .Address(, , Excel.xlR1C1, True)
            End If
           
            .Copy
           
            Selection.PasteSpecial , True, , , wdPasteRTF
           
            .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

Function RangeHasName(objRange As Excel.Range) As Boolean
  On Error Resume Next
 
  RangeHasName = Len(objRange.Name.Name) <> 0
End Function



Цитата:

Цитата Pozia
… при его наличие у клетки »

Будет работать с любыми диапазонами (не только состоящими из одной клетки).

Pozia 25-01-2012 22:39 1844499

Цитата:

Цитата Iska
Будет работать с любыми диапазонами (не только состоящими из одной клетки). »

работает. только вот если диапазон выбираю то имена не присваиваются клеткам при вставке. Это можно поправить?

Iska 26-01-2012 01:36 1844605

Pozia, у меня присваивается. Описывайте подробно пример, а я попробую воспроизвести у себя.

Pozia 26-01-2012 07:48 1844665

Iska, разобрался, присваивает. Просто думал что каждой ячейке в выбранном диапазоне будет присвоено имя, что предпочтительнее для меня. Так можно сделать?

Iska 26-01-2012 16:19 1844963

Цитата:

Цитата Pozia
…что каждой ячейке в выбранном диапазоне будет присвоено имя, что предпочтительнее для меня. Так можно сделать? »

А смысл?

Pozia 26-01-2012 18:12 1845046

Цитата:

Цитата Iska
А смысл? »

для меня есть:
1. Решается вопрос, который звучит в шапке изначально. Это позволит в дальнейшем работать быстрее без скрипта там где его нет.
2. Постоянно сделав одну связь на какую то клетку, я затем в ворде просто ее копирую в другие нужные места, и связи вешаются. Если я скопирую диапазон ячеек с одним общим именем, то потом из него я не смогу копировать нужные мне ячейки в другие места документа ворд, связь повесится не верно.

Поэтому, если это возможно сделать, буду признателен. В любом случае, еще раз огромное спасибо.

Iska, правильно ли я исправил кусок кода для более наглядности:
Код:

            Do
                strNewName = "i" & CStr(i) & "i"
                If Not NameExists(.Worksheet, strNewName) Then


Iska 26-01-2012 19:34 1845105

Цитата:

Цитата Pozia
1. Решается вопрос, который звучит в шапке изначально. Это позволит в дальнейшем работать быстрее без скрипта там где его нет. »

Вставьте в проект рабочей книги и выполните:
Код:

Option Explicit

Sub SetNames()
    Dim objWorksheet As Worksheet
    Dim objCell As Range
    Dim i As Long
   
    Set objWorksheet = Selection.Worksheet
   
    If objWorksheet.Type = xlWorksheet Then
        i = 1
       
        For Each objCell In Selection
            objWorksheet.Names.Add "_" & CStr(i), "=" & objCell.Address(, , xlR1C1, True)
           
            i = i + 1
        Next
    End If
   
    Set objWorksheet = Nothing
End Sub

Решите вопрос, который звучит в шапке изначально.

Цитата:

Цитата Pozia
Если я скопирую диапазон ячеек с одним общим именем, то потом из него я не смогу копировать нужные мне ячейки в другие места документа ворд, связь повесится не верно. »

Данное утверждение неверно. Сможете.

Цитата:

Цитата Pozia
Iska, правильно ли я исправил кусок кода для более наглядности: »

Вы получите имена вида: «i1i», «i2i», «i3i» и т.д.

Pozia 26-01-2012 21:25 1845165

Цитата:

Цитата Iska
Решите вопрос, который звучит в шапке изначально. »

скрипт хитрый оказался ). Он забирает имена у клеток ранее названных. То есть если уже есть имена _1, _2, _3... и я выбираю другой диапазон задать имена, то он стирает имена на прежних клетках, и дает их новым клеткам. Можно ли это исправить?

Pozia 26-01-2012 22:25 1845208

Iska, начал активно пользоваться скриптом и заметил, что часто вылетает ошибка как скрине. Отчего?

Iska 27-01-2012 03:26 1845347

Цитата:

Цитата Pozia
Он забирает имена у клеток ранее названных. »

Он тупо назначает имена, начиная с «_1», на адреса ячеек.

Цитата:

Цитата Pozia
Можно ли это исправить? »

Исправить-то можно. Я ориентировался на:
Цитата:

Цитата Pozia
вопрос, который звучит в шапке изначально.
Цитата:

Цитата Pozia
нужно определенному диапазону клеток размером 50 столбцов на 2000 строк присвоить произвольные имена. »

»

Я рассчитывал именно на то, что сие будет однократным действием.

Я понимаю, Вы никак не хотите манипулировать целыми диапазонами, а в обязательном порядке давать имена исключительно отдельным ячейкам (хотя я не вижу в этом требовании никакой необходимости). Впрочем, дело Ваше, пусть будет так, пробуйте:
читать дальше »
Код:

Option Explicit

Sub CopyFromExcel()
    Dim objExcel As Excel.Application
    Dim objWorksheet As Excel.Worksheet
    Dim objCell As Excel.Range
   
    Dim strNewName As String
    Dim i As Long
   
   
    Set objExcel = GetObject(, "Excel.Application")
    Set objWorksheet = objExcel.Selection.Worksheet
   
    If objWorksheet.Type = Excel.xlWorksheet Then
        i = objWorksheet.Names.Count
           
        For Each objCell In objExcel.Selection
            If Not RangeHasName(objCell) Then
                Do
                    strNewName = "_" & CStr(i)
                   
                    i = i + 1
                   
                    If Not NameExists(objWorksheet, strNewName) Then
                        Exit Do
                    End If
                Loop
               
                objWorksheet.Names.Add strNewName, "=" & objCell.Address(, , Excel.xlR1C1, True)
            End If
        Next
       
        objExcel.Selection.Copy
       
        Selection.PasteSpecial , True, , , wdPasteRTF
       
        objExcel.CutCopyMode = False
    End If
   
    Set objWorksheet = Nothing
    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

Function RangeHasName(objRange As Excel.Range) As Boolean
  On Error Resume Next
 
  RangeHasName = Len(objRange.Name.Name) <> 0
End Function



Цитата:

Цитата Pozia
Iska, начал активно пользоваться скриптом и заметил, что часто вылетает ошибка как скрине. Отчего? »

Опишите условия, при которых сие происходит.

Pozia 27-01-2012 13:45 1845563

Цитата:

Цитата Iska
Я рассчитывал именно на то, что сие будет однократным действием. »

не. ну смотрите. Сделаю я один раз. А эксель мой еще не финишный. Все время модифицирую, и вот попробую задать новые имена и он мне как наворотит, что я фик разгребусь :) .
Цитата:

Цитата Iska
хотя я не вижу в этом требовании никакой необходимости »

необходимость лишь в моей специфики рабочего файла эксель, не более.
Цитата:

Цитата Iska
Опишите условия, при которых сие происходит. »

видимо сам виноват. тестировал какие то скрипты скачанные из нета, и в результате офис навернулся. Удалить смог только какой то спец утилитой. Зато теперь поставить не могу. Сменю винду, опробую приведенный вами скрипт. Спасибо.

Iska 27-01-2012 16:36 1845698

Цитата:

Цитата Pozia
Сменю винду, опробую приведенный вами скрипт. »

Сочувствую. Ждём-с.

Pozia 29-01-2012 21:36 1847156

Iska, По поводу глюков в работе скрипта - все Ок после смены винды.
Цитата:

Цитата Iska
пробуйте: »

то же все классно.
Хотелось бы еще попросить Вас (простите за наглость) подкорректировать скрипт из вашего поста 27, чтоб он имена не удалял у ранее названных клеток. Простое присвоение имен клеткам как я сейчас понимаю мне тоже нужно. У меня есть еще связь между моим главным расчетным файлом эксель и файлами эксель "посредниками" между расчетным файлом эксель и SolidWorks, где тоже нужна твердая связь. И вот здесь пакетное именование клеток очень было бы кстати, чтоб потом просто вешать связи между файлами эксель.

PS Не подскажете ли, как в ворд на скрипт задать горячую клавишу. В эксель это без проблем, в ворд приходится хитрить - включать запись макроса, дам задавать сочетание клавиш, а потом под записанный макрос подсовывать свой.

Iska 03-02-2012 15:35 1850948

Цитата:

Цитата Pozia
Хотелось бы еще попросить Вас подкорректировать скрипт из вашего поста 27, чтоб он имена не удалял у ранее названных клеток. »

Пробуйте (код для модуля рабочей книги):
читать дальше »
Код:

Option Explicit

Sub SetNames()
    Dim objWorksheet As Worksheet
    Dim objCell As Range
   
    Dim strNewName As String
    Dim i As Long
   
   
    Set objWorksheet = Selection.Worksheet
   
    If objWorksheet.Type = xlWorksheet Then
        i = objWorksheet.Names.Count
           
        For Each objCell In Selection
            If Not RangeHasName(objCell) Then
                Do
                    strNewName = "_" & CStr(i)
                   
                    i = i + 1
                   
                    If Not NameExists(objWorksheet, strNewName) Then
                        Exit Do
                    End If
                Loop
               
                objWorksheet.Names.Add strNewName, "=" & objCell.Address(, , xlR1C1, True)
            End If
        Next
    End If
   
    Set objWorksheet = 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

Function RangeHasName(objRange As Excel.Range) As Boolean
  On Error Resume Next
 
  RangeHasName = Len(objRange.Name.Name) <> 0
End Function



Цитата:

Цитата Pozia
PS Не подскажете ли, как в ворд на скрипт задать горячую клавишу. »

Не подскажу, по той простой причине, что у Вас Office 2010, а у меня Office 2003. Но можете попробовать самостоятельно согласно статье: Настройка сочетаний клавиш - Word - Office.com, выбрав в поле «Категории» категорию «Макросы», а в поле «Макросы» — Ваш макрос.

Цитата:

Цитата Pozia
в ворд приходится хитрить - включать запись макроса, дам задавать сочетание клавиш, а потом под записанный макрос подсовывать свой. »

Сие излишне.

Pozia 03-02-2012 21:58 1851242

Iska, спасибо, все отлично работает. повесил за эти дни около 3000 связей на имена клеток, красота.... )

Iska 04-02-2012 10:28 1851511

Рад стараться :)! Тем паче, что и я кое-что узнал для себя нового:
Цитата:

Цитата Pozia
Если из эксель скопировать клетку и вставить ее через специальную вставку в ворд - получится связь. Изменив значение клетки в эксель - меняется значение в ворд. Так вот если клетку в эксель куда то перенести - связь теряется. Если клетке эксель предварительно дать имя, и затем сделать связь, то так связь ворд эксель не потеряется, так как ворд будет ссылаться не на координату а на имя клетки, которое является уникальным для листа. »


Pozia 01-03-2012 23:58 1870478

Iska, очень нужна ваша неотложная помощь. Имеется большой файл экселя. Навесил кучу связей вашим скриптом. И ща заметил, что на один из листов экселя связи ворда ссылаются не на имена ячеек, а на координаты их. Почему то скрипт упорно не делает связи на имена ячеек именно на одном листе. Прикрепляю этот лист. Помогите пожалуйста разобраться.

Iska, методом тыка установил, что виной является буква "C" первая в названии листа. Почему так?

Iska 02-03-2012 02:19 1870550

Цитата:

Цитата Pozia
Iska, методом тыка установил, что виной является буква "C" первая в названии листа. Почему так? »

Не подтверждаю. Как Вы сделали такой вывод?

Цитата:

Цитата Pozia
Прикрепляю этот лист. »

Мне сложно что-либо сказать по одному листу.

Pozia 02-03-2012 09:16 1870620

Iska, это косяк не скрипта, а как минимум офиса 2010. создал только что новый документ, добавил к имени любого листа английскую букву С, задал имя для любой ячейки на этом листе и связь в ворд повесилась на координату, а не на имя. убираю букву С с названия, и связь вешается успешно

Iska 02-03-2012 10:45 1870701

Pozia, воспроизводится ли сие поведение «вручную»?

Pozia 02-03-2012 11:18 1870746

Iska, да. Именно вручную последне сказаное и делал. Есть ли такое в 2003?

Pozia 22-12-2012 20:16 2051135

Iska, очень хочу вас попросить о помощи еще одной модификации вашего скрипта. В ходе работы пришел к тому, что иногда требуется назначить определенное имя клетки. Могли бы вы поправить скрипт так, чтобы при его запуске в эксель выскакивало окошко куда бы я мог ввести имя (в виде набора цифр) и которое применится к клетке с добавлением сначала и конца имени символа "_"? То есть ввожу 1234, а имя клетки получу _1234_. Спасибо еще раз за помощь, ваши скрипты подарили мне много сна ночью )))

Iska 23-12-2012 09:18 2051429

Pozia, у нас присваивается набор имён всем ячейкам в выделении, а не одно имя. Что будем делать?

Pozia 23-12-2012 13:23 2051568

Iska, мне нужно присваивать вручную имя только одной клетке. а если случайно выделю несколько клеток и запущу макрос то пусть просто выскакивает ошибка, если можно.

Iska 23-12-2012 15:10 2051618

Pozia, зачем Вам тогда макрос? Для создания одного имени используйте имеющиеся средства:


Pozia 23-12-2012 16:05 2051658

Iska, это я знаю. только в этом случае дается имя относительно всего документа, а мне нужно относительно листа

okshef 23-12-2012 16:18 2051664

Цитата:

Цитата Pozia
а если случайно выделю несколько клеток »

Код:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Rows.Count > 1 Or Target.Columns.Count > 1 Then MsgBox "Выбрано более 1 ячейки": Exit Sub
..........
Ваш код
..........
End Sub


Pozia 23-12-2012 18:11 2051734

Цитата:

Цитата okshef
Ваш код »

а какой код сюда вставлять?

okshef 23-12-2012 20:54 2051842

Например, вызов процедуры, которую вам дал Iska

Pozia 23-12-2012 21:06 2051859

okshef, спасибо. попробую как до компа доберусь

Pozia 24-12-2012 11:01 2052297

okshef, Iska, ничего не вышло. сделал буквально, как сказал okshef, то есть вот так:

Код:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Rows.Count > 1 Or Target.Columns.Count > 1 Then MsgBox "Âûáðàíî áîëåå 1 ÿ÷åéêè": Exit Sub
Option Explicit
Sub SetNames2()
    Dim objWorksheet As Worksheet
    Dim objCell As Range
    Dim strNewName As String
    Dim i As Long
    Set objWorksheet = Selection.Worksheet
    If objWorksheet.Type = xlWorksheet Then
        i = objWorksheet.Names.Count
        For Each objCell In Selection
            If Not RangeHasName(objCell) Then
                Do
                    strNewName = "_" & CStr(i)
                    i = i + 1
                    If Not NameExists(objWorksheet, strNewName) Then
                        Exit Do
                    End If
                Loop
                objWorksheet.Names.Add strNewName, "=" & objCell.Address(, , xlR1C1, True)
            End If
        Next
    End If
    Set objWorksheet = 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
Function RangeHasName(objRange As Excel.Range) As Boolean
  On Error Resume Next
  RangeHasName = Len(objRange.Name.Name) <> 0
End Function
End Function

и в ответ получил при запуске Ambiguous name detected: Worksheet_SelectionChange

Pozia 24-12-2012 11:59 2052335

Подскажите пожалуйста еще как подсчитать количество именованных клеток на листе. Пробовал так: СЧЁТЕСЛИ(A1:AF828;"_*") но не выходит. Вот
здесь, пункт D есть какой то кусок кода для этого, но не пойму как его применить. Просто так не запускается

Iska 24-12-2012 13:03 2052387

Цитата:

Цитата Pozia
как подсчитать количество именованных клеток на листе. »

Количество имён: «ActiveSheet.Names.Count» и «ActiveWorkbook.Names.Count». Понятие «клетки» в Excel не используется. Назначить имя можно только диапазону (пусть даже и состоящему из одной ячейки, потому что ячейка — это тоже диапазон).

Цитата:

Цитата Pozia
Вот здесь, пункт D есть какой то кусок кода для этого, но не пойму как его применить. »

Всё там верно. Вставить код в модуль в процедуру или функцию и запустить её на исполнение.

Pozia 24-12-2012 13:28 2052412

Iska, я совсем чайник в этом (. Могли бы вы привести весь код как надо?

Pozia 24-12-2012 16:48 2052561

Iska, по поводу количества мне тут помогли. Поможете на счет поста 42 ?

Iska 24-12-2012 17:50 2052605

Постараюсь.

Pozia 17-01-2013 21:26 2069124

Iska, заметил, что код в посте 34 начинает именовать ячейки, начиная с последнего максимального имени. Но если я удалил ранее созданные имена ячеек, то все равно имя присваивается с конца. То есть имею имена _1_, _2_, _10_, _11_, _12_, и в этом случае при запуске макроса присваивается следующее имя имя _13_ а не _3_. Можно ли это учесть? Спасибо

Iska 18-01-2013 03:58 2069259

Pozia, время нужно выделить потребное. Пока его нет. Я помню и про предыдущее.

Pozia 03-09-2013 21:04 2212196

Iska, доброго вечера. Может у Вас появилась минутка для помощи, случайно? :sorry:

Iska 04-09-2013 16:58 2212702

Pozia, надо вспоминать ;).


Время: 20:41.

Время: 20:41.
© OSzone.net 2001-