0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 3
1

Поиск и выборка по листу excel

09.06.2013, 20:21. Показов 2589. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! Нужна помощь для чайника и тугодума)
Изначально наша компания вела клиентскую базу в гуглотаблицах. Некоторое время назад перешли на более-менее толковую CRM, а старая база была экспортирована в xls. Сейчас встала задача выдернуть из экселя все e-mail адреса. На ответах.мэил мне посоветовали следующий вариант:

Visual Basic
1
2
3
4
5
6
7
8
Sub ppp()
kk = 1
For Each ccc In Sheets(1)
If InStr(ccc.Text, "@") > 0 Then
Sheets(2).Cells(kk, 1) = ccc.Text
kk = kk + 1
End If
End Sub
Но он ругается: Compile erroe: For withuout Next
Кроме того, насколько я еще помню VBA, на новый лист перенесутся ячейки, содержащие символ @, а не конкретные адреса. Если я правильно понимаю принципе, то речь идет о том, чтобы в ячейках, содержащих собаку взять фрагмент текста от пробела до пробела, содержащий этот символ и перенести на новый лист.
А, чуть не забыл уточнить! Таблица строилась по следующему принципу:
дата | номер проекта | *тут всяка сводная информация в разных столбцах* | имя, телефон и почта клиента (в произвольном порядке)

Буду очень признателен, если кто поможет! Надеюсь, я не прошу о чем-то сверхсложном, но если зарвался - ткните носом)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.06.2013, 20:21
Ответы с готовыми решениями:

Поиск по листу Excel книги
Здравствуйте! Пытаюсь организовать поиск по листу книги Excel. Т.е. в самом начале книга...

Реализовать поиск по листу Excel
Всем привет! Подскажите пожалуйста как сделать поиск определенного текста в Visaul studio 2013 типа...

доступ к листу Excel
Добрый вечер ! вывожу данные в шаблон в excel в котором есть 3 листа как вывести данные на...

Обращение к листу Excel по имени
Добрый день! Есть такой код string workpath =...

15
Модератор
Эксперт функциональных языков программированияЭксперт Python
36587 / 20317 / 4218
Регистрация: 12.02.2012
Сообщений: 33,614
Записей в блоге: 13
09.06.2013, 22:43 2
Чтобы не ругался:

Visual Basic
1
2
3
4
5
6
7
8
9
Sub ppp()
  kk = 1
  For Each ccc In Sheets(1)
       If InStr(ccc.Text, "@") > 0 Then
          Sheets(2).Cells(kk, 1) = ccc.Text
          kk = kk + 1
       End If
  Next
End Sub
Добавлено через 3 минуты
Я понял, что e-Mail в четвертой колонке? И там еще может быть телефон? Самое правильное в этом случае - использовать регулярные выражения. Но можно и по-детски:

1) найти позицию "@"
2) от нее вправо и влево до конца/начала строки или первого пробела
0
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 3
09.06.2013, 22:55  [ТС] 3
Catstail, object doesn' support this property or method

Все правильно, почта в четвертой колонке, однако ничто не мешает грохнуть первые три, чтобы осталась единственная колонка.
Обычно, ячейка выглядит следующим образом:
Сайт 1с, Евгений, d*****@***.info, 8916******53
Звездочками затер из соображения приличий.
При этом ячейка может содержать почту, может не содержать, то же самое касается всего остального. То есть четкого регламента по их заполнению никогда не было. Сам менеджер разберется - остальное по барабану.

Не могли бы Вы помочь мне оценить мне сложность этой задачи? В том плане, стоит ли искать бесплатного энтузиаста или сразу предлагать деньги за решение задачи?) Проблем особых нет, не думаю, что это будет много стоить.
0
996 / 355 / 135
Регистрация: 27.10.2006
Сообщений: 764
09.06.2013, 22:55 4
Я бы ограничил бы поиск по UsedRange, а то на листе может быть дофига ячеек, если файл в формате Excel 2007 (1048576 * 16384 = 17 179 869 184 ячеек). Поэтому лучше так

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub ppp()
    Dim ccc As Range, kk As Long
 
    kk = 1
    For Each ccc In Sheets("Лист1").UsedRange
        If InStr(ccc.Text, "@") > 0 Then
            Sheets("Лист2").Cells(kk, 1) = ccc.Text
            kk = kk + 1
        End If
    Next
    MsgBox "Конец", vbInformation, ""
End Sub
0
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 3
09.06.2013, 23:02  [ТС] 5
Pavel55, subscript out of range

Не подскажете, где мне купить мозги и прямые руки?)
0
996 / 355 / 135
Регистрация: 27.10.2006
Сообщений: 764
09.06.2013, 23:16 6
думаю стоит проверить, есть ли в книге Excel листы с названием "Лист1" и "Лист2". На "Лист1" должна быть какая-то информация, а "Лист2" должен быть пуст
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36587 / 20317 / 4218
Регистрация: 12.02.2012
Сообщений: 33,614
Записей в блоге: 13
09.06.2013, 23:36 7
Visual Basic
1
2
3
4
5
6
7
8
9
Sub ppp()
  kk = 1
  For Each ccc In Sheets(1).Cells
       If InStr(ccc.Text, "@") > 0 Then
          Sheets(2).Cells(kk, 1) = ccc.Text
          kk = kk + 1
       End If
  Next
End Sub
Это будет поиск по всем колонкам
0
996 / 355 / 135
Регистрация: 27.10.2006
Сообщений: 764
09.06.2013, 23:48 8
Catstail,

если честно, то записи

Visual Basic
1
For Each ccc In Sheets(1)
и
Visual Basic
1
For Each ccc In Sheets(1).Cells
для VBA - абсолютно одинаковы. И в первом и во втором случае в цикле будут перебираться вообще ВСЕ ячейки листа
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36587 / 20317 / 4218
Регистрация: 12.02.2012
Сообщений: 33,614
Записей в блоге: 13
09.06.2013, 23:53 9
У меня (в Office-200) это оказалось не так.
0
996 / 355 / 135
Регистрация: 27.10.2006
Сообщений: 764
09.06.2013, 23:57 10
не очень понял, какой у вас офис, вы 4-ю цифру забыли написать.
Если офис 2000, то скажите что он у вас обрабатывает? только первый столбец?
У меня Офис 2013 - обрабатываются все ячейки на листе.
Я даю гарантию, что это будет так же и в Офис 2003, 2007, 2010.
Про более ранние версии (XP, 2000, 97) не знаю.

Aikhal, у вас какой офис установлен на компьютере (97, 2000, XP, 2003, 2007, 2010, 2013) ?
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
10.06.2013, 00:02 11
Ну у Sheets(1) есть cells, rows, columns, areas, names и т.д.
Я бы для начала использовал UDF:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Function em(S As String)
    Dim v
    Dim EML_PTRN$
    EML_PTRN = "[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}"
 
    With CreateObject("vbscript.regexp")
        .Pattern = EML_PTRN
        .Global = True
        .IgnoreCase = True
        Set v = .Execute(S)
    End With
    em = v(0).Value
End Function
Этот столбец отсортировать, скопировать значения.
Или наоборот.
0
996 / 355 / 135
Регистрация: 27.10.2006
Сообщений: 764
10.06.2013, 00:09 12
А у Range("A1") есть:
Address
Areas
Borders
Cells
Characters
Font
Text
Value
Value2
и много всего.
НО! Значением по-умолчанию, является Value
Думаю, что VBA обрабатывая строку

For Each ccc In Sheets("Лист1")

по-умолчанию, берёт Cells и это подтверждается на простом примере.
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
10.06.2013, 00:09 13
Но у меня тоже без cells не работает (2007).
0
996 / 355 / 135
Регистрация: 27.10.2006
Сообщений: 764
10.06.2013, 00:19 14
да, согласен, не работает) Был не прав

P.S. всё же лучше Usedrange обрабатывать, чем Cells.
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
10.06.2013, 00:23 15
Ну вероятно достаточно обрабатывать один четвёртый столбец от первой строки до последней заполненной в этом столбце.
По описанию эти эмейлы не скачут по всему листу.
0
996 / 355 / 135
Регистрация: 27.10.2006
Сообщений: 764
10.06.2013, 00:42 16
тогда так

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
Option Explicit
 
Sub ppp()
    Dim Rng As Range
 
    With Sheets("Лист1")
        Set Rng = Intersect(.UsedRange, .Columns(4))
    End With
 
    EmailsExtract Rng, Sheets("Лист2").Range("A1")
    
    MsgBox "Конец", vbInformation, ""
End Sub
 
' ZVI:2011-05-27 [url]http://www.planetaexcel.ru/forum.php?thread_id=28292[/url]
' Выдает массив e-mails из смешанного текста Txt
Function EmailsArray(Txt)
    If InStr(Txt, "@") = 0 Then Exit Function
    Dim s$, x, a, i&
    s = Txt
    If InStr(s, vbLf) Then s = Replace(s, vbLf, " ")
    If InStr(s, vbCr) Then s = Replace(s, vbCr, " ")
    If InStr(s, ",") Then s = Replace(s, ",", " ")
    If InStr(s, " @ ") Then s = Replace(s, " @ ", "@")
    a = Split(s)
    For Each x In a
        If Len(x) > 4 Then
            If InStr(x, "@") Then
                a(i) = x
                i = i + 1
            End If
        End If
    Next
    If i Then
        ReDim Preserve a(i - 1)
        EmailsArray = a
    End If
End Function
 
' ZVI:2011-05-27 [url]http://www.planetaexcel.ru/forum.php?thread_id=28292[/url]
' Процедура извлечения уникальных e-mails из RngFrom и копирования в TopCellTo
' Пример вызова: EmailsExtract Range("A:A"), Range("C2")
Sub EmailsExtract(ByVal RngFrom As Range, TopCellTo As Range)
    Dim a, b(), e, i&, j&, x
    Set RngFrom = Intersect(RngFrom, RngFrom.Parent.UsedRange)
    With TopCellTo.Parent.UsedRange
        j = .Rows.Count - .Row + 1
        If j < 0 Then j = 1
    End With
    ReDim b(1 To TopCellTo.Parent.Rows.Count, 1 To 1)
    With CreateObject("Scripting.Dictionary")
        .CompareMode = 1
        For Each x In RngFrom.Value
            a = EmailsArray(x)
            If IsArray(a) Then
                For Each e In a
                    If Not .Exists(e) Then
                        i = i + 1
                        b(i, 1) = e
                        .Item(e) = 0
                    End If
                Next
            End If
        Next
    End With
    With TopCellTo.Resize(i, 1)
        With .Parent.UsedRange
            j = .Rows.Count - .Row + 1
        End With
        If j > .Row Then .Resize(j - .Row + 1, 1).ClearContents
        If i Then
            .Value = b()
            .Sort .Cells(1, 1), xlAscending, Header:=xlNo
        End If
    End With
End Sub
0
10.06.2013, 00:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.06.2013, 00:42
Помогаю со студенческими работами здесь

Неправильно работает запрос к листу Excel
Добрый день. Уже давно при возникновении необходимости получить данные из книги Excel, пользуюсь...

Поиск по неактивному листу
Есть форма, на ней кнопка, к кнопке привязан код поиска по листу, если лист активен - все...

Получить доступ к листу Excel и прочитать данные
На форме два текстбокса один баттон и один лабел. Как сделать так: ввожу имя в текстбокс1,...

Как применить SQL-запрос к листу Excel?
как в Visual Studio работать с файлами Ecxel? Подскажите в каком направлении ковать! Спасибо.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru