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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2010, 13:51   #1
zenner
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 199
По умолчанию Выборка номеров по диапазону

Добрый день!К нам приходит данный список DECON.rar номеров на выключение, но это список номеров всех АТС а мне нужно выбрать только номера нашей АТС.Помогите пожалуйста с макросом который оставит только номера с диапазоном 440000-449999, 312000-312299.Хотелось бы чтобы гдето сбоку была бы кнопка "ОБРАБОТАТЬ" Спасибо!!!
Безымянный.png

Последний раз редактировалось zenner; 22.06.2010 в 13:57.
zenner вне форума Ответить с цитированием
Старый 22.06.2010, 14:27   #2
AChrist
Пользователь
 
Регистрация: 29.11.2008
Сообщений: 31
По умолчанию

Код:
Sub Кнопка1_Щелчок()
Application.ScreenUpdating = False

For Each cell In Range("A:A")

If cell.Value < 312000 Or cell.Value > 312299 And cell.Value < 440000 Or cell.Value > 449999 Then
cell.Delete
End If

Next cell



End Sub
Попробуйте. Хотя я думаю, другие пользователи помогут Вам этот макрос ускорить.
AChrist вне форума Ответить с цитированием
Старый 22.06.2010, 14:38   #3
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Корректнее и существенно быстрее так:
Код:
Sub Main()
    Dim i As Long, j As Long, x As Range, a(), b(): Application.ScreenUpdating = False
    Set x = Range([A1], Cells(Rows.Count, 1).End(xlUp)): a = x.Value
    ReDim b(1 To UBound(a, 1), 1 To 1): j = 1
    For i = 1 To UBound(a, 1)
        If (a(i, 1) >= 440000 And a(i, 1) <= 449999) Or (a(i, 1) >= 312000 And a(i, 1) <= 312299) Then
            b(j, 1) = a(i, 1): j = j + 1
        End If
    Next: x.Value = b
End Sub
Пример во вложении.
Вложения
Тип файла: rar DECON_2.rar (81.2 Кб, 22 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 22.06.2010, 15:11   #4
zenner
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 199
По умолчанию

Спасибо Вам !!!
zenner вне форума Ответить с цитированием
Старый 22.06.2010, 15:55   #5
zenner
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 199
По умолчанию

Я хочу добавить еще 20 диапазонов и просто добавляю в одну строку
Or (a(i, 1) >= 430000 And a(i, 1) <= 430099) но так как диапазонов много они не помещаются в одну строку а что надо написать чтобы каждый диапазон писать с новой строки примерно так:

If (a(i, 1) >= 440000 And a(i, 1) <= 449999)
If (a(i, 1) >= 430000 And a(i, 1) <= 430099)
If (a(i, 1) >= 455540 And a(i, 1) <= 455599)
zenner вне форума Ответить с цитированием
Старый 22.06.2010, 16:21   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Я хочу добавить еще 20 диапазонов
Я в вашем случае вынес бы проверку на принадлежность номера к вашей АТС в отдельную функцию:

Код:
Function IsOurNumber(ByVal pn As Variant) As Boolean
    ' возвращает TRUE, если номер pn принажлежит нашей АТС
    IsOurNumber = False
    If (Len(pn) < 5 Or Len(pn) > 6) Or Not IsNumeric(pn) Then Exit Function
    Select Case val(pn) Mod 100000
        Case 17000 To 17999, 18025, 18028 To 19026: IsOurNumber = True
        Case 38000 To 38999, 79000 To 82599: IsOurNumber = True
            ' ...
        Case 96000 To 96499: IsOurNumber = True
        Case 97900 To 97999: IsOurNumber = True
    End Select
End Function
А потом использовал бы её так (в коде от SAS888):

Код:
Sub Main()
    Dim i As Long, j As Long, x As Range, a(), b(): Application.ScreenUpdating = False
    Set x = Range([A1], Cells(Rows.count, 1).End(xlUp)): a = x.Value
    ReDim b(1 To UBound(a, 1), 1 To 1): j = 1
    For i = 1 To UBound(a, 1)
        If IsOurNumber(a(i, 1)) Then b(j, 1) = a(i, 1): j = j + 1
    Next: x.Value = b
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 22.06.2010, 16:28   #7
zenner
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 199
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Я в вашем случае вынес бы проверку на принадлежность номера к вашей АТС в отдельную функцию:

Код:
Function IsOurNumber(ByVal pn As Variant) As Boolean
    ' возвращает TRUE, если номер pn принажлежит нашей АТС
    IsOurNumber = False
    If (Len(pn) < 5 Or Len(pn) > 6) Or Not IsNumeric(pn) Then Exit Function
    Select Case val(pn) Mod 100000
        Case 17000 To 17999, 18025, 18028 To 19026: IsOurNumber = True
        Case 38000 To 38999, 79000 To 82599: IsOurNumber = True
            ' ...
        Case 96000 To 96499: IsOurNumber = True
        Case 97900 To 97999: IsOurNumber = True
    End Select
End Function
А потом использовал бы её так (в коде от SAS888):

Код:
Sub Main()
    Dim i As Long, j As Long, x As Range, a(), b(): Application.ScreenUpdating = False
    Set x = Range([A1], Cells(Rows.count, 1).End(xlUp)): a = x.Value
    ReDim b(1 To UBound(a, 1), 1 To 1): j = 1
    For i = 1 To UBound(a, 1)
        If IsOurNumber(a(i, 1)) Then b(j, 1) = a(i, 1): j = j + 1
    Next: x.Value = b
End Sub
Так что и с чем мне нужно склеить???

Последний раз редактировалось zenner; 22.06.2010 в 16:31.
zenner вне форума Ответить с цитированием
Старый 22.06.2010, 16:33   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Так что мне нужно склеить???
Заменить это:
Код:
Sub Main()
    Dim i As Long, j As Long, x As Range, a(), b(): Application.ScreenUpdating = False
    Set x = Range([A1], Cells(Rows.count, 1).End(xlUp)): a = x.Value
    ReDim b(1 To UBound(a, 1), 1 To 1): j = 1
    For i = 1 To UBound(a, 1)
        If (a(i, 1) >= 440000 And a(i, 1) <= 449999) Or (a(i, 1) >= 312000 And a(i, 1) <= 312299) Then
            b(j, 1) = a(i, 1): j = j + 1
        End If
    Next: x.Value = b
End Sub
на это:
Код:
Sub Main()
    Dim i As Long, j As Long, x As Range, a(), b(): Application.ScreenUpdating = False
    Set x = Range([A1], Cells(Rows.count, 1).End(xlUp)): a = x.Value
    ReDim b(1 To UBound(a, 1), 1 To 1): j = 1
    For i = 1 To UBound(a, 1)
        If IsOurNumber(a(i, 1)) Then b(j, 1) = a(i, 1): j = j + 1
    Next: x.Value = b
End Sub

Function IsOurNumber(ByVal pn As Variant) As Boolean
    ' возвращает TRUE, если номер pn принажлежит нашей АТС
    Select Case val(pn)
        Case 440000 To 449999, 430000 To 430099: IsOurNumber = True
            ' ...
        Case 455540 To 455599, 312000 To 312299: IsOurNumber = True
    End Select
End Function
EducatedFool вне форума Ответить с цитированием
Старый 22.06.2010, 16:42   #9
zenner
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 199
По умолчанию

Спасибо большое!!!
zenner вне форума Ответить с цитированием
Старый 22.06.2010, 17:28   #10
zenner
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 199
По умолчанию

Я добавил все диапазоны и получилось следующее:
PHP код:
Private Sub CommandButton1_Click()
    
Dim i As LongAs LongAs Rangea(), b(): Application.ScreenUpdating False
    Set x 
Range([A1], Cells(Rows.Count1).End(xlUp)): x.Value
    ReDim b
(1 To UBound(a1), 1 To 1): 1
    
For 1 To UBound(a1)
        If 
IsOurNumber(a(i1)) Then b(j1) = a(i1): 1
    Next
x.Value b
End Sub

Function IsOurNumber(ByVal pn As Variant) As Boolean
    
' âîçâðàùàåò TRUE, åñëè íîìåð pn ïðèíàæëåæèò íàøåé ÀÒÑ
    Select Case Val(pn)
         Case 440000 To 449999: IsOurNumber = True '
ATC-44
         
Case 430000 To 430099IsOurNumber True 'ATC-44
         Case 430300 To 430949: IsOurNumber = True '
ATC-44
         
Case 433000 To 433079IsOurNumber True 'ATC-44
         Case 433130 To 433179: IsOurNumber = True '
ATC-44
         
Case 433185 To 433540IsOurNumber True 'ATC-44
         Case 434000 To 435999: IsOurNumber = True '
ATC-44
         
Case 438000 To 439999IsOurNumber True 'ATC-44
         Case 450000 To 450899: IsOurNumber = True '
ATC-44
         
Case 490000 To 499999IsOurNumber True 'ATC-44
         Case 310000 To 311286: IsOurNumber = True '
ATC-44
         
Case 312000 To 312367IsOurNumber True 'ATC-44
         Case 432000 To 432999: IsOurNumber = True '
ATC-44
         
         
Case 455000 To 455467IsOurNumber True 'ATC-455
         Case 455500 To 455511: IsOurNumber = True '
ATC-455
         
         
Case 450900 To 450991IsOurNumber True 'ATC-46
         Case 460000 To 469999: IsOurNumber = True '
ATC-46
         
Case 459000 To 459999IsOurNumber True 'ATC-46
         Case 436000 To 436299: IsOurNumber = True '
ATC-46
         
Case 436600 To 436999IsOurNumber True 'ATC-46
         Case 455468 To 455499: IsOurNumber = True '
ATC-46
         
Case 437000 To 437119IsOurNumber True 'ATC-46
         
         Case 451000 To 452021: IsOurNumber = True '
ATC-451
         
Case 455842 To 455969IsOurNumber True 'ATC-451
         Case 452022 To 452499: IsOurNumber = True '
ATC-451
         
Case 455540 To 455599IsOurNumber True 'ATC-451
         Case 455970 To 455999: IsOurNumber = True '
ATC-451
         
Case 455600 To 455841IsOurNumber True 'ATC-451
    End Select
End Function 

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

Последний раз редактировалось zenner; 22.06.2010 в 17:38.
zenner вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поиск по диапазону и подстановка значения в зависимости от результата Propinol Microsoft Office Excel 17 02.04.2012 21:35
Форма фильтрации по диапазону Малой БД в Delphi 3 24.02.2010 13:24
Применение формулы к диапазону ячеек mar3m Microsoft Office Excel 4 31.08.2009 17:44
Сортировчик номеров ildusfm Microsoft Office Excel 1 19.05.2009 13:38
Количество дней в месяце по диапазону дат VadimSh Microsoft Office Excel 6 26.11.2008 23:48