Страницы: 1
RSS
Ошибка при замене имени у неименованной ячейки
 
Есть вот такой код - заменяет часть имени ячейки на другую в выделенном диапазоне:
Код
Private Sub CommandButton1_Click()

Dim codename1 As String
Dim codename2 As String
Dim znach As String
Dim CodeRange As Range

codename1 = CodeInValue
codename2 = CodeOutValue
 
   For Each CodeRange In Selection
      If InStr(CodeRange.Name.Name, codename1) <> 0 Then
      CodeRange.Name.Name = Replace(CodeRange.Name.Name, codename1, codename2)
         
      End If   
   Next
End Sub

Проблема в том, что если выделенная ячейка еще не именована, то вываливается с ошибкой.
И второй вопрос - можно ли сделать тоже самое но во всем файле, а не в выделенном диапазоне?  
 
Здравсвуйте.
Цитата
Дмитрий написал:
не в выделенном диапазоне

Код
For Each CodeRange in ActiveSheet.UsedRange' или 
For Each CodeRange in Range("A1:J100")

Вот нашёл тему с именованными диапазонами: ссылка.
P.S. Выделите ваш код и нажмите на кнопку <...>, ваш код приобретет нормалный вид.

Изменено: DANIKOLA - 04.06.2020 07:58:21
 
Здравствуйте !

Used Range не подходит так как именованный ячейки могут быть не заполненными и они не попадут в диапазон.
Указание конкретного диапазона тоже не подходит так как необходимо имен в выделенном диапазоне.
Тут возможно я не корректно задал вопрос, необходимо не использовать InStr для ячеек которые не имеют имя.
А вот как это проверить?
Решил таким способом.
Код
Private Sub CommandButton1_Click()

Dim codename1 As String
Dim codename2 As String
Dim CodeRange As Range


codename1 = CodeInValue
codename2 = CodeOutValue

   On Error Resume Next
   For Each CodeRange In Selection

      If InStr(CodeRange.Name.Name, codename1) <> 0 Then
      
      'Range(CodeRange.Address).Name = Replace(Range(CodeRange.Address).Name, codename1, codename2)
      CodeRange.Name.Name = Replace(CodeRange.Name.Name, codename1, codename2)
         
      End If
      
   Next
End Sub
Но теперь тогда второй вопрос: можно ли сделать тоже самое но во всем файле, а не в выделенном диапазоне?
Например вместо In Selection указать WorkBook, но так не работает.
Код
Private Sub CommandButton1_Click()

Dim codename1 As String
Dim codename2 As String
Dim CodeRange As Range


codename1 = CodeInValue
codename2 = CodeOutValue

   On Error Resume Next
   For Each CodeRange In WorkBook

      If InStr(CodeRange.Name.Name, codename1) <> 0 Then
      
      'Range(CodeRange.Address).Name = Replace(Range(CodeRange.Address).Name, codename1, codename2)
      CodeRange.Name.Name = Replace(CodeRange.Name.Name, codename1, codename2)
         
      End If
      
   Next
End Sub
 
Объект "Range" есть только на листе, а не в книге.
 
Цитата
RAN написал:
Объект "Range" есть только на листе, а не в книге.
Да это я уже понял, но как пробежать всю книгу?
 
Цитата
Дмитрий написал:
но как пробежать всю книгу?
Вы не раскрываете задачу полностью. Пробежали. Дальше что? Надо получить выделенный диапазона на каждом листе свой или один для всех, предварительно выделенный на активном? Это разные вещи. Чтобы пройтись по выделению всех листов, можно использовать такой код:
Код
Sub GetAllSheetsSelection()
    Dim ws As Worksheet
    For Each ws In ActiveWorkbook.Worksheets
        ws.Select
        MsgBox Selection.Address
    Next
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
Вы не раскрываете задачу полностью.
Видать не правильно задал вопрос.

Задача таже - необходимо во всей книге заменить часть имени ячейки на другую часть.
Например есть ячейки (200 ячеек) с именами fg_1_year ......... fg_200_year (меняется только номер), необходимо во всех именах заменить например fg на fg1, т.е. должно стать 200 ячеек с именами fg1_1_year ......... fg1_200_year.

Именованные ячейки могут стоять на любом листе в любом месте книги.

С выделенным диапазоном работает код ниже. Как сделать тоже самое для всей книге
Код
Private Sub CommandButton1_Click() 
Dim codename1 As String
Dim codename2 As String
Dim CodeRange As Range
 
 
codename1 = CodeInValue
codename2 = CodeOutValue
 
   On Error Resume Next
   For Each CodeRange In Selection
 
      If InStr(CodeRange.Name.Name, codename1) <> 0 Then
       
        CodeRange.Name.Name = Replace(CodeRange.Name.Name, codename1, codename2)
          
      End If
       
   Next
End Sub
Изменено: Дмитрий - 04.06.2020 19:04:16
 
Можно так:
Код
Option Explicit

' Меняет в именах активной книги sFrom на sTo
Sub ChangeNames(ByVal sFrom As String, sTo As String)
   Dim n As Name, i As Long
   For Each n In ActiveWorkbook.Names
     If InStr(1, n.Name, sFrom, vbTextCompare) > 0 Then
       n.Name = Replace(n.Name, sFrom, sTo)
       i = i + 1
     End If
   Next n
   MsgBox "Заменено имен: " & i
End Sub

Sub Test()
  ChangeNames "fg_", "fg1_"
End Sub
Владимир
Страницы: 1
Наверх