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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2013, 11:31   #1
Puffi.Muffi
Пользователь
 
Регистрация: 18.06.2013
Сообщений: 57
По умолчанию FindFormat

Всем привет!

Подскажите, пожалуйста, как записать макрос:

Необходимо найти все ячейки на листе определенного формата, например

Application.FindFormat.NumberFormat = "#,##0.00;#,##0.00-"
Application.FindFormat.Font.FontSty le = "Полужирный"

выделить их, и вставить в определенный диапазон.


Пробовала записать макрос проделав вручную операции в книги (excel2010) (разработчик -> записать макрос):

- Ctrl+F
- Options
- Format
- задаю необходимый мне формат
- Find all
- Ctrl + A
- активирую лист в котором работаю
- Ctrl + C
- и вставляю значения куда необходимо

Однако, повторить записанный макрос с необходимым результатом Excel не может, копируется только первая ячейка данного формата (а нужны все!).

Плиз, скажите как можно добиться нужного результата.
Puffi.Muffi вне форума Ответить с цитированием
Старый 30.07.2013, 15:40   #2
kalbasiatka
Форумчанин
 
Регистрация: 21.10.2012
Сообщений: 208
По умолчанию

Может цикл какой прикрутить?
kalbasiatka вне форума Ответить с цитированием
Старый 30.07.2013, 16:37   #3
Puffi.Muffi
Пользователь
 
Регистрация: 18.06.2013
Сообщений: 57
По умолчанию

думала об этом,
но там сложность в том, что ячейки находятся поочередно,
и каждый раз становится активной новая ячейка, а нужно все сразу.
что-то ничего в голову не приходит...
Puffi.Muffi вне форума Ответить с цитированием
Старый 30.07.2013, 17:07   #4
kalbasiatka
Форумчанин
 
Регистрация: 21.10.2012
Сообщений: 208
По умолчанию

Может от Вас пример "поочерёдности" увидим в .xls например?
kalbasiatka вне форума Ответить с цитированием
Старый 30.07.2013, 17:14   #5
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

отметьте одну ячейку, нажмите Ctrl отметьте другую несмежную ячейку (не имеющую общей границы с первой), а теперь нажмите Ctrl+C, читайте надпись.

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

Последний раз редактировалось IgorGO; 30.07.2013 в 17:16.
IgorGO вне форума Ответить с цитированием
Старый 31.07.2013, 00:33   #6
Puffi.Muffi
Пользователь
 
Регистрация: 18.06.2013
Сообщений: 57
По умолчанию

Kalbasiatka,

была идея написать:

Sub vv()
Dim x As Integer
For x = 1 To 1000
If Cells(x, "B").NumberFormat = "#,##0.00;#,##0.00-" Then
Cells(x, "B").Copy
Range("H1").End(xlDown).Offset(1, 0).Activate
ActiveSheet.Paste
End If
Next x
End Sub

однако объемы большие и такой код занимает очень много времени (особенно если нужно переносить на другой лист),

Классно было бы если в нижеследующем коде каждый раз прибавлялся бы к выбранному диапазону новый, а не скидывался старый и выбирался новый:

Sub vv()
Dim x As Integer
For x = 1 To 1000
If Cells(x, "B").NumberFormat = "#,##0.00;#,##0.00-" Then

Cells(x, "B").Select

End If
Next x
End Sub
Puffi.Muffi вне форума Ответить с цитированием
Старый 31.07.2013, 00:43   #7
Puffi.Muffi
Пользователь
 
Регистрация: 18.06.2013
Сообщений: 57
По умолчанию

IgorGO,

а как такое сделать, ссылаясь не на конкретные ячейки,
а именно на те, которые подходят под определенный формат?
Puffi.Muffi вне форума Ответить с цитированием
Старый 31.07.2013, 08:21   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
Sub Start()
  Dim rg As Range
  Set rg = FindMyNumFormat("#,##0.00;#,##0.00-")
  If Not rg Is Nothing Then rg.Interior.Color = RGB(255, 0, 0)
End Sub

Function FindMyNumFormat(f As String) As Range
  Dim rg As Range, rgf As Range
  Application.FindFormat.Clear:  Application.FindFormat.NumberFormat = f
  Set rgf = Cells.Find(What:="", SearchFormat:=True)
  Do While Not rgf Is Nothing
    If rg Is Nothing Then Set rg = rgf Else Set rg = Application.Union(rg, rgf)
    Set rgf = Cells.Find("", rgf, SearchFormat:=True)
    If Not Application.Intersect(rg, rgf) Is Nothing Then Exit Do
  Loop
  Set FindMyNumFormat = rg
End Function
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 31.07.2013, 08:30   #9
kalbasiatka
Форумчанин
 
Регистрация: 21.10.2012
Сообщений: 208
По умолчанию

Взял 10 000 ячеек, из них 9000 подходящих под условие, заняло 5 секунд:
Код:
Sub vv()
 Dim x As Integer
 k = 1
 For x = 1 To 10000
 If Cells(x, 2).NumberFormat = "#,##0.00;#,##0.00-" Then
 Cells(x, 2).Copy Cells(k, 8)
 k = k + 1
 End If
 Next x
 End Sub

Последний раз редактировалось kalbasiatka; 31.07.2013 в 08:33.
kalbasiatka вне форума Ответить с цитированием
Старый 31.07.2013, 15:48   #10
Puffi.Muffi
Пользователь
 
Регистрация: 18.06.2013
Сообщений: 57
По умолчанию

IgorGO,
идея интересная, ее мне нужно додумать: может очень подойти для другого проекта.
Единственное что, я боюсь писать коды с Do While.

Kalbasiatka,
в данном случае код вполне подходит.

Спасибо Вам Большое за уделенное время!
Puffi.Muffi вне форума Ответить с цитированием
Ответ


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