Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на Basic / VBA


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Гуревич Александр Львович
Статус: 10-й класс
Рейтинг: 958
∙ повысить рейтинг »
Megaloman
Статус: Бакалавр
Рейтинг: 600
∙ повысить рейтинг »
Botsman
Статус: Специалист
Рейтинг: 514
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Basic/VBA

Номер выпуска:935
Дата выхода:11.10.2009, 18:00
Администратор рассылки:Калашников О.А., Руководитель
Подписчиков / экспертов:363 / 94
Вопросов / ответов:3 / 5

Вопрос № 172964: Здраствуйте уважаемые эксперты. Буду рад вашей помощи. Имеется документ MS Excel в котором содержится набор телефонных номеров в виде (код)номер. все номера необходимо выделить в три группы. Первая - назовем условно "белый список" - номера ...


Вопрос № 172966: В одной строке в стоящих подряд ячейках содержатся слова(набор любых символов). Эти слова образуют предложение. Конец предложения - пустая ячейка. Таких строк в таблице Excel несколько. Создать модуль, который выводит в файл output.txt строки - предл...
Вопрос № 172980: Добрый день, уважаемые эксперты. VBA Excel Мой вопрос заключается в том, как создать программно несколько объектов на форме в зависимости от значения textbox Весь процесс выглядит следующим образом. Я набираю, например число, 5 в tex...

Вопрос № 172964:

Здраствуйте уважаемые эксперты. Буду рад вашей помощи. Имеется документ MS Excel в котором содержится набор телефонных номеров в виде (код)номер. все номера необходимо выделить в три группы. Первая - назовем условно "белый список" - номера известны заранее (можно задать в виде маски код и первые две цифры номера или перечислением), вторая - "черный список" - номера также известны заранее (около 40) и третья группа - "неизвестные". Помогите как написать макрос с возможностью вывода из общего списка отдельных групп. Заранее благодарен.

Отправлен: 06.10.2009, 09:37
Вопрос задал: vitalkis, Посетитель
Всего ответов: 1
Страница вопроса »


Отвечает Megaloman, Бакалавр :
Здравствуйте, vitalkis.
Вот возможные пути решения вашей задачи. Это только пути решения, вследствие нечёткости постановки. Нет проблем взять данные из текстового файла. Нет проблем довести решение до совершенства. Но не хотелось этого делать из-за нечеткой постановки. А предложенные примеры работоспособны и задачу в нулевом приближении решают.
Итак:
На одном листе таблицы (у меня он называется Все) имеем все телефоны
Еще на одном листе таблицы (у меня он называется Черные) имеем список черных телефонов
Еще на одном листе таблицы (у меня он называется Белые) имеем список префиксов белых телефонов

Макрос забирает в массив справочник черных телефонов и префиксов белых с листов таблицы Excel (настройте их расположение, а, в принципе, не проблема брать их из текстовых файлов),
просматривает все номера телефонов (диапазон где они расположены - прописать в макросе)
в зависимости от результата сравнения со справочными данными форматирует ячейку с те лефоном в нужный цвет
Код:
Sub telefon()
' Исходные данные --------------------------------------------------------------------------
ListBlack = "Черные" ' Наименование черного листа
ListWhite = "Белые" ' Наименование белого листа
ListAll = "Все" ' Исследуемый лист Все телефоны

RangeBlack = "A1:A12" ' Диапазон клеток со справочником черных телефонов
RangeWhite = "A1:A3" ' Диапазон клеток со справочником белых телефонов
RangeAll = "C4:C194" ' Диапазо н клеток со всеми телефонами
'-------------------------------------------------------------------------------------------

Dim MWhite As Variant, MBlack As Variant

MWhite = Sheets(ListWhite).Range(RangeWhite)
MBlack = Sheets(ListBlack).Range(RangeBlack)

NBlack = UBound(MBlack, 1)
NWhite = UBound(MWhite, 1)

Sheets(ListAll).Select
Range(RangeAll).Font.ColorIndex = 0
Range(RangeAll).Interior.ColorIndex = xlNone

For Each TelNum In Range(RangeAll)
xx = TelNum.Value
x = CStr(xx)

For i = 1 To NWhite
y = CStr(MWhite(i, 1))
If Mid(x, 1, Len(y)) = y Then
TelNum.Interior.ColorIndex = 35 ' Зелёный
Exit For
End If
Next

For i = 1 To NBlack
If xx = MBlack(i, 1) Then
TelNum.Interior.ColorInd ex = 3 ' Красный
Exit For
End If
Next

Next
End Sub

Вот еще вариант:
В отличие от первого, организуем дополнительный столбец, где словами записываем статус ячейки.
Что в этом хорошего: - можно поставить на таблицу автофильтр и фильтровать строки в таблице по статусу - очень удобно
Код:
Sub telefon()
' Исходные данные --------------------------------------------------------------------------
ListBlack = "Черные" ' Наименование черного листа
ListWhite = "Белые" ' Наименование белого листа
ListAll = "Все" ' Иссле дуемый лист Все телефоны

RangeBlack = "A1:A12" ' Диапазон клеток со справочником ч ерных телефонов
RangeWhite = "A1:A3" ' Диапазон клеток со справочником белых телефонов
RangeAll = "C4:C194" ' Диапазон клеток со всеми телефонами

NStatus = 3 ' Через сколько столбцов с телефонами напишем статус телефона
'-------------------------------------------------------------------------------------------

Dim MWhite As Variant, MBlack As Variant

MWhite = Sheets(ListWhite).Range(RangeWhite)
MBlack = Sheets(ListBlack).Range(RangeBlack)

NBlack = UBound(MBlack, 1)
NWhite = UBound(MWhite, 1)

Sheets(ListAll).Select
Range(RangeAll).Font.ColorIndex = 0
Range(RangeAll).Interior.ColorIndex = xlNone


For Each TelNum In Range(RangeAll)
xx = TelNum.Value
x = CStr(xx)
TelNum.Offset(0, NSta tus).Value = "Неизвестный"

For i = 1 To NWhite
y = CStr(MWhite(i, 1))
If Mid(x, 1, Len(y)) = y Then
TelNum.Interior.ColorIndex = 35
TelNum.Offset(0, NStatus).Value = "Белый"
Exit For
End If
Next

For i = 1 To NBlack
If xx = MBlack(i, 1) Then
TelNum.Interior.ColorIndex = 3
TelNum.Offset(0, NStatus).Value = "Черный"
Exit For
End If
Next

Next
End Sub

Фаил с моими примерами прикрепил к ответу - скачайте, смотрите Прикрепленный файл: загрузить »

-----
Нет времени на медленные танцы

Ответ отправил: Megaloman, Бакалавр
Ответ отправлен: 07.10.2009, 13:48

Оценка ответа: 5
Комментарий к оценке:
Спасибо. Пути решения меня и интересовали. Остальное доработаю. То что нужно.

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 255122 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Вопрос № 172966:

    В одной строке в стоящих подряд ячейках содержатся слова(набор любых символов). Эти слова образуют предложение. Конец предложения - пустая ячейка. Таких строк в таблице Excel несколько. Создать модуль, который выводит в файл output.txt строки - предложения, получающиеся их этих слов, с пробелов в качестве разделителя. Текстовый файл input.txt содержит некоторое количество предложений - строк символов, пробел - разделитель слов. Ввести из текстового файла предложения и разместить их в строках таблицы Excel с номерами 1, 2, ... Каждое предложение разбить на слова и разместить их в рядом стоящие ячейки одной строки, начиная с столбца А. На рабочем листе разместить две кнопки для обращения к процедурам.

    Отправлен: 06.10.2009, 10:29
    Вопрос задал: Евгений Викторович, Посетитель
    Всего ответов: 2
    Страница вопроса »


    Отвечает NRJ, 3-й класс :
    Здравствуйте, Евгений Викторович!
    готово. кнопка1 - задача 1, кнопка2 - задача2

    Приложение:

    Ответ отправил: NRJ, 3-й класс
    Ответ отправлен: 06.10.2009, 12:48

    Оценка ответа: 5
    Комментарий к оценке:
    Спасибо, все работает

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 255057 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает DVS, 1-й класс :
    Здравствуйте, Евгений Викторович.
    В приложении представлены 2 макроса, которые решают поставленные вопросы.
    К сожалению Вы не указали в каком Excel'е Вы работаете, поэтому приведу два варианта создания кнопок.
    Excel 2003
    Если не выведена панель «Формы», то её необходимо вывести. Вид – Панели инструментов –Формы.
    На появившейся панели щёлкаем по кнопке и выбираем её место расположение на листе.
    Открывается окно для назначения макроса, нажимаем «Создать ». Сразу попадаем в редактор Visual Basic,
    где будет уже создана пустая процедура вида
    Sub Кнопка1_Щелчок()

    End Sub
    Вместо неё и вставляем процедуру Sub TextOut(), либо просто добавляем код, который между
    Sub TextOut() и End Sub. Если меняем название Кнопка1_Щелчок() на TextOut(), то не забываем
    сменить его и на кнопке ( правой кнопкой мыши по кнопке, «Назначить макрос»).
    Аналогично добавляем вторую кнопку на лист с учётом, что макрос надо взять TextIn().

    Excel 2007
    Е сли нет вкладки «Разработчик», то добавляем её, Кнопка «Office», Параметры Excel и в разделе «Основные»
    ставим галочку «Показывать вкладку «Разработчик» на ленте».
    Переходим на вкладку «Разработчик», далее «Вставить», и добавляем кнопку из «Элементы управления формы».
    Далее действуем аналогично, как показано выше.

    Комментарии по работе макросов даны в тексте программы.

    Приложение:

    Ответ отправил: DVS, 1-й класс
    Ответ отправлен: 06.10.2009, 16:16

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 255082 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Вопрос № 172980:

    Добрый день, уважаемые эксперты. VBA Excel

    Мой вопрос заключается в том, как
    создать программно несколько объектов на форме в зависимости от значения textbox

    Весь процесс выглядит следующим образом. Я набираю, например число, 5 в textbox. Нажимаю кнопку и появляется новая форма с 5 тью textbox определённого размера и одной кнопкой. И что бы была возможность наложить какое либо событие на кнопку.

    Спасибо за внимание.

    Отправлен: 06.10.2009, 15:21
    Вопрос задал: Соколов В.В., Посетитель
    Всего ответов: 2
    Страница вопроса »


    Отвечает Витер Александр Анатольевич, 9-й класс :
    Здравствуйте, Соколов В.В..
    Долго расписывать пришлось бы. Лучше смотрите пример в файле по ссылке: Пример создания динамической формы. Откройте файл и нажмите кнопку. Дважды кликните по текстовому полю, чтобы увидеть реакцию на двойной клик (другие события я не прописывал) и нажмите на кнопку, чтобы увидеть реакцию на ее событие.
    Вкратце это работает так:
    • Создаем два класса. Один для событий, другой — для компонентов. В примере это классы EventsOfControls и ControlsOnForm соответственно;
    • Добавляем в проект форму (программно). Это делает процедура CreateForm(NumberOfTextBoxes As Integer), которой в качестве параметра передается количество текстовых полей, которое должно быть на форме;
    • Программно записываем процедуру инициализации формы. В той же CreateForm;
    • Когда мы показываем созданную, но еще пустую форму, то запускается про цедура ее инициализации (UserForm_Initialize()), в которой записан вызов процедуры, добавляющей компоненты на форму GetControlsForForm(ByVal oForm As Object, ByVal NumberOfTextBoxes As Integer);
    • В процедуре GetControlsForForm мы добавляем в цикле текстовые поля, связываем их с классом событий и добавляем в коллекцию класса компонентов.


    Этот метод очень удобен тем, что события для компонентов можно прописывать самым обычным образом, только в модуле класса.

    Спрашивайте, что непонятно
    -----
    Лучше день потерять - потом за пять минут долететь!

    Ответ отправил: Витер Александр Анатольевич, 9-й класс
    Ответ отправлен: 06.10.2009, 17:01

    Оценка ответа: 5
    Комментарий к оценке:
    Программа работает, вопрос раскрыт полностью! Спасибо большое, помогло. Язык написания понятен, исчерпывающие комментарии и принцип работы.

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 255084 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает NRJ, 3-й класс :
    Здравствуйте, Соколов В.В..
    на форме создаём текстбокс и кнопку, а также добавляем модуль и соответственно пишем на кнопку и в модуль следующие процедуры

    Приложение:

    Ответ отправил: NRJ, 3-й класс
    Ответ отправлен: 06.10.2009, 17:22

    Оценка ответа: 4
    Комментарий к оценке:
    Спасибо за ответ. 4 потому что есть с чем сравнивать.

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 255086 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.9 от 25.09.2009

    В избранное