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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.06.2016, 16:02   #21
linguist
Пользователь
 
Регистрация: 08.06.2016
Сообщений: 24
По умолчанию

Изначально не известно, сколько ячеек будет заполнено. Может быть так, что заменить пробелы нужно будет в одной ячейке, а может быть так, что в 500, но всегда в рамка одного столбца.
linguist вне форума Ответить с цитированием
Старый 28.06.2016, 16:32   #22
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цитата:
по-очереди обратится к конкретной ячейке конкретного столбца
(ко всем нужным ячейкам)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 28.06.2016, 16:59   #23
linguist
Пользователь
 
Регистрация: 08.06.2016
Сообщений: 24
По умолчанию

Экспериментальным путем я выяснил, что
Код:
Sub Заменить_пробелы_в_формулах()

        With Range("A1")
            For i = 1 To .Characters.Count
               With .Characters(Start:=i, Length:=1)
                   If (.Font.Color = 255 Or .Font.Color = 32768) And .Text = " " Then .Text = "_"
               End With
            Next
        End With
        
End Sub
Не работает, если в ячейке больше 255 символов. Это плохо, потому как символов может быть гораздо больше. Можно как-то обойти это ограничение?
linguist вне форума Ответить с цитированием
Старый 28.06.2016, 17:37   #24
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

А если заменить .Characters.Count на Len(.value)?
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 29.06.2016, 10:42   #25
linguist
Пользователь
 
Регистрация: 08.06.2016
Сообщений: 24
По умолчанию

Len(.Value) не помогло. Меняет только если 255 или меньше символов в ячейке.
linguist вне форума Ответить с цитированием
Старый 29.06.2016, 10:51   #26
linguist
Пользователь
 
Регистрация: 08.06.2016
Сообщений: 24
По умолчанию

Может как-то тип ячейки влияет?
linguist вне форума Ответить с цитированием
Старый 29.06.2016, 12:36   #27
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

да, когда символов больше 255 тип ячейки меняется, становится не текстовый, а (по всей видимости Memo) и свойство .Text становится read-only (точнее, в него записывать изменения можно, но это никак не влияет на содержимое).
Как с этим бороться не знаю!

ну, если Вам деваться некуда и нельзя текст разбить по 255 символов.
попробуйте такой макрос:
Код:
Sub Заменить_пробелы_в_формулах()
        Dim S As String, L As Long
        S = Range("A1").Text
        With Range("A1")
            L = .Characters.Count
            For i = 1 To .Characters.Count
               With .Characters(Start:=i, Length:=1)
                   If (.Font.Color = 255 Or .Font.Color = 32768) And .Text = " " Then
                     '.Text = "_"
                     S = Left(S, i - 1) & "_" & Right(S, L - i)
                   End If
               End With
            Next
        End With
          
        Range("A1").Copy Range("B1")
        Range("B1").Value = S
        For i = 1 To Range("A1").Characters.Count
               Range("B1").Characters(Start:=i, Length:=1).Font.Color = Range("A1").Characters(Start:=i, Length:=1).Font.Color
        Next
        
End Sub
Только он копирует (с заменой) содержимое из ячейки A1 в ячейку B1
Работает крайне медленно и печально!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.06.2016, 14:07   #28
linguist
Пользователь
 
Регистрация: 08.06.2016
Сообщений: 24
По умолчанию

Serge_Bliznykov, Спасибо.
Такой код действительно поможет.
Для моей задачи я буду делать так: по вашему коду копировать с заменой пробелов в другую ячейку, потом макросом опять копировать из новой ячейки в старую с заменой и удалением данных из новой ячейки. Это, конечно, будет долго, но для выполнения моей задачи подойдет и такой способ. Все быстрее, чем вручную.
linguist вне форума Ответить с цитированием
Старый 29.06.2016, 14:35   #29
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

пожалуйста.

Цитата:
потом макросом опять копировать из новой ячейки в старую с заменой и удалением данных из новой ячейки.
это несложно и можно дописать в конце данного макроса.

Цитата:
для выполнения моей задачи подойдет и такой способ. Все быстрее, чем вручную.
пожалуйста.
как вариант, можно (легко) проверить тип ячейки и, если он IsText - то выполнять предыдущий код (он намного проще и эффективней), а если не текст - тогда уж запускать эту нудятину, что я предложил.
Кроме того, я не теряю надежды, что в теме появится кто-то из профессионалов (а тут на форуме такие Гуру есть) и перепишет мой код так, чтобы он работал быстро и хорошо.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.06.2016, 16:33   #30
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

скопируйте все в программный модуль
Код:
Type SameChars
  b As Integer ' start pos.
  l As Integer ' length
  c As Long    ' color
  p As String  ' blank pos.
End Type


Sub Replace_(cl As Range)
  Const c1& = 255, c2& = 5287936
  Dim i%, j%, p%, n%, dAr() As SameChars
  ReDim dAr(0 To 100) As SameChars
  For i = 1 To cl.Characters.Count
    If dAr(n).c <> cl.Characters(i, 1).Font.Color Then
      dAr(n).l = i - dAr(n).b: n = n + 1: dAr(n).b = i: dAr(n).c = cl.Characters(i, 1).Font.Color
      If n = UBound(dAr) Then ReDim Preserve dAr(0 To UBound(dAr) * 2)
    End If
    If cl.Characters(i, 1).Text = " " Then
      If i > 1 And i < cl.Characters.Count Then
        If cl.Characters(i - 1, 1).Font.Color = dAr(n).c _
          And cl.Characters(i + 1, 1).Font.Color = dAr(n).c _
          And (dAr(n).c = c1 Or dAr(n).c = c2) Then
          dAr(n).p = dAr(n).p & " " & i
        End If
      End If
    End If
  Next
  dAr(n).l = i - dAr(n).b
  For i = 1 To n
    If dAr(i).c <> 0 And dAr(i).p <> "" Then
      For j = 1 To UBound(Split(dAr(i).p))
        p = Val(Split(dAr(i).p)(j))
        cl = Left(cl, p - 1) & "_" & Right(cl, Len(cl) - p)
      Next
    End If
  Next
  For i = 1 To n
    If dAr(i).c <> 0 Then cl.Characters(dAr(i).b, dAr(i).l).Font.Color = dAr(i).c
  Next
End Sub


Sub RunThis1() ' replace in A1
  Dim tm As Single
  tm = Timer
  Replace_ Cells(1, 1)
  MsgBox Timer - tm
End Sub


Sub RunThis2() ' replace in B6:B7
  Dim tm As Single, rg As Range
  tm = Timer
  For Each rg In Range("B6:B7")
    Replace_ rg
  Next
  MsgBox Timer - tm
End Sub
все работает удручающе медленного, но, видимо, это будет быстрее, чем править руками

Replace_ - собственно сама процедура замены
RunThis1, RunThis2 - примеры ее использования для одной ячейки или для диапазона ячеек
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск координат пикселя определенного цвета Yevgeniy_F C++ Builder 0 22.09.2013 10:30
присвоение линии определенного цвета Mehanizator Помощь студентам 2 19.08.2011 09:43
Количество пикселей определенного цвета zih Общие вопросы Delphi 4 20.10.2010 23:57
Подсчет ячеек определенного цвета в StringGrid Juliya_U Компоненты Delphi 4 22.04.2010 22:39