Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Задачи на Visual Basic (VB).

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

Открыть новую тему     Написать ответ в эту тему

NEOMATRIX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору


Данный топик предназначен только для обсуждения типовых задач на Visual Basic.
Обсуждение задач на VBA (а именно, Excel, Word, Access) строго запрещено!
Пишите в соответствующих топиках.

 
Родственные топики:
  • Excel VBA - часть 1, часть 2 - все вопросы по Excel VBA туда
  • Word VBA все вопросы по Word VBA туда
  • Access все вопросы по программированию в Access туда
  • VBScript - программирование "удобняшек" на VBScript
  • QBasic - типовые задачи на QBasic
     
  • Date Time Functions In Visual Basic
  • VB6's Trig, Math, Financial, Boolean, and Random functions
  • Visual Basic 6 String Functions
  • VB6 Number System Functions (Hex, Oct, Etc)
  • VB6's DateAdd function
     
  • Functions (Visual Basic)
  • Keywords and Members by Task
  • Visual Basic Reference
     
  • Visual Basic String Manipulation Tutorials
     
  • Top 10 Visual Basic Sins

     
    Учебники:
    Visual Basic для студентов и школьников. Культин Н. (2010)
    Занимательное программирование на Visual Basic.NET. Климов А. (2005)
    Visual Basic в задачах и примерах. Сафронов (2009)
    Visual Basic 2012 на примерах. Зиборов В. (2012)

  • Всего записей: 202 | Зарегистр. 29-12-2004 | Отправлено: 19:30 16-11-2005 | Исправлено: XPerformer, 10:07 28-10-2014
    PALbICH

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Проблема оказалась не в VBA, а в HTML. Если HTMLBody содержит более одного пробела подряд, то при отображении в outlook или браузере все дополнительные пробелы убираются, остается только один. Можно полечить тэгом <PRE> или заменой пробелов на  &nbsp.

    Всего записей: 11 | Зарегистр. 11-09-2009 | Отправлено: 08:38 27-01-2012
    Legio



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    PALbICH
    Лучше &nbsp; -- и не забывайте его закрывать точкой с запятой, а то может вылезти всякое.

    Всего записей: 695 | Зарегистр. 01-08-2003 | Отправлено: 16:49 27-01-2012
    Moiseyka

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ПОЖАЛУЙСТА ПОМОГИТЕ НАПИСАТЬ ПРИЛОЖЕНИЕ НА VB. Нужно сделать приложение, которое рассчитывает и показывает анимацию колебательного движения. Связь ISQ 471142671. Skype - Moiseykaaa. Буду несказанно благодарен

    Всего записей: 1 | Зарегистр. 29-01-2012 | Отправлено: 10:54 29-01-2012
    PALbICH

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Legio
    и
    dneprcomp
     
    Спасибо!

    Всего записей: 11 | Зарегистр. 11-09-2009 | Отправлено: 12:47 29-01-2012
    globus_ussr



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    всем привет.
    есть журнал звонков в excel
    дата                           нач.          кон.
    01.01.2011    10:01:00    10:01:15
    01.01.2011    10:05:00    10:06:27
    01.01.2011    10:12:00    10:12:38
    01.01.2011    10:20:00    10:21:42
    01.01.2011    10:25:00    10:29:49
    01.01.2011    10:27:00    10:31:12
    01.01.2011    10:33:00    10:33:44
    01.01.2011    10:34:00    10:40:05
    01.01.2011    10:46:00    10:46:52
    01.01.2011    10:50:00    10:50:51
    01.01.2011    10:54:00    10:58:43
    01.01.2011    10:54:00    10:55:46
    01.01.2011    10:58:00    11:33:24
    01.01.2011    11:04:00    11:04:24
    01.01.2011    11:08:00    11:11:12
    01.01.2011    11:13:00    11:15:28
    01.01.2011    11:13:00    11:13:22
    01.01.2011    11:22:00    11:23:08
    01.01.2011    11:22:00    11:23:27
    01.01.2011    11:25:00    11:28:32
    01.01.2011    11:35:00    11:35:10
    01.01.2011    11:45:00    12:10:57
    01.01.2011    11:47:00    11:58:51
    01.01.2011    11:56:00    11:56:13
    нужно найти количество одновременных звонков.
    сломал уже всю башку, не могу ничего придумать.
    помогите с алгоритмом.

    Всего записей: 249 | Зарегистр. 06-04-2005 | Отправлено: 05:14 09-02-2012
    VovaMozg



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    globus_ussr
    Точно для этого дела VBS нужен? Если просто в Exel отсортировать 93 уровня сортировки по 1 стоолбцу, по второму, по третьему). Потом вставить сводную таблицу, в которой названия строк будут 1,2,3 столбцы а значения - начало.

    ----------
    В конце концов причина причин оказалась в начале начал...

    Всего записей: 761 | Зарегистр. 02-06-2005 | Отправлено: 05:50 09-02-2012
    globus_ussr



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    можно и не писать ничего... если можно ))
    изначально таблица 650 000 т. строк.
    если можно, или ссылку на почитать, или более подробно, в общих словах не очень понял, что ты умел ввиду ))

    Всего записей: 249 | Зарегистр. 06-04-2005 | Отправлено: 09:37 09-02-2012
    dneprcomp



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    globus_ussr
     
    http://www.exceluser.com/explore/msquery1_1.htm
    http://ask.metafilter.com/35916/How-to-run-a-SQL-Query-on-an-Excel-Spreadsheet
     
    Потом делаем выборку из базы в виде:
    Код:
     
    SELECT [дата], [нач], [кон], count(1)
    FROM [имя таблицы]
    GROUP BY [дата], [нач], [кон]
    HAVING count(1) > 1

     

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 10:28 09-02-2012 | Исправлено: dneprcomp, 10:33 09-02-2012
    globus_ussr



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    чисто для понимания вопроса, а что делает данный запрос ?  

    Всего записей: 249 | Зарегистр. 06-04-2005 | Отправлено: 10:39 09-02-2012
    dneprcomp



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    globus_ussr
    Находит количество одновременных звонков, естественно
    Критерий одновременности сами выберете. В данном примере по всем трем полям должно быть совпадение.

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 10:47 09-02-2012 | Исправлено: dneprcomp, 10:55 09-02-2012
    globus_ussr



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    в краткости тебе не откажешь )))

    Всего записей: 249 | Зарегистр. 06-04-2005 | Отправлено: 10:54 09-02-2012
    dneprcomp



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    globus_ussr
    Так как заказывали. Ничего иного данный запрос не покажет.

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 10:57 09-02-2012
    globus_ussr



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    так ведь метацель всего этого= поумнеть ))))  
    и еще, к стати, у меня дней там много
    01.01.2011    10:01:00    10:01:15
    01.01.2011    10:05:00    10:06:27
    01.01.2011    10:12:00    10:12:38
    01.01.2011    10:20:00    10:21:42
    01.01.2011    10:25:00    10:29:49
    01.01.2011    10:27:00    10:31:12
    01.01.2011    10:33:00    10:33:44
    01.01.2011    10:34:00    10:40:05
    01.01.2011    10:46:00    10:46:52
    01.01.2011    10:50:00    10:50:51
    01.01.2011    10:54:00    10:58:43
    01.01.2011    10:54:00    10:55:46
    01.01.2011    10:58:00    11:33:24
    01.01.2011    11:04:00    11:04:24
    01.01.2011    11:08:00    11:11:12
    01.01.2011    11:13:00    11:15:28
    01.01.2011    11:13:00    11:13:22
    01.01.2011    11:22:00    11:23:08
    01.01.2011    11:22:00    11:23:27
    01.01.2011    11:25:00    11:28:32
    01.01.2011    11:35:00    11:35:10
    02.01.2011    10:44:00    11:04:27
    02.01.2011    10:50:00    11:22:25
    02.01.2011    10:54:00    10:55:18
    02.01.2011    10:56:00    10:58:39
    02.01.2011    10:58:00    10:59:32
    02.01.2011    11:01:00    11:01:08
    02.01.2011    11:20:00    11:24:31
    02.01.2011    11:25:00    11:26:48
    02.01.2011    11:26:00    11:26:17
    02.01.2011    11:39:00    11:42:46
    02.01.2011    11:59:00    12:16:26
     
    и тд, весь год
     
    Добавлено:
    что то не так работает, я так понял, запрос просто группирует одинаковые звонки, которые именно одинаковые.
    а мне нужно совпадающие, т.е.  
    01.01.2011    10:58:00    11:33:24  
    01.01.2011    11:04:00    11:04:24  
    01.01.2011    11:08:00    11:11:12  
    01.01.2011    11:13:00    11:15:28  
    01.01.2011    11:13:00    11:13:22  
    01.01.2011    11:22:00    11:23:08  
    01.01.2011    11:22:00    11:23:27  
    01.01.2011    11:25:00    11:28:32  
     
    здесь содержится три совпадающих званка, т.е. в определенный интервал времени, происходит одновременно несколько звонков, но, начинаются они и заканчиваются в разное время.

    Всего записей: 249 | Зарегистр. 06-04-2005 | Отправлено: 11:14 09-02-2012
    dneprcomp



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    globus_ussr
    Дай определение совпадаемости. Сколько полей должно совпасть?
    Если исходить, что должны совпасть только день и начало, то в приведенной выборке я вижу всего 2:
    01.01.2011    11:13:00    
    01.01.2011    11:22:00    
    Такой результат будет по запросу

    Код:
    SELECT [дата], [нач], count(1)  
    FROM [имя таблицы]  
    GROUP BY [дата], [нач]
    HAVING count(1) > 1

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 18:11 09-02-2012 | Исправлено: dneprcomp, 18:19 09-02-2012
    globus_ussr



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ок, возьмем кусок лога, он очень показательный
    1. 01.01.2011    10:58:00    11:33:24  
    2. 01.01.2011    11:04:00    11:04:24  
    3. 01.01.2011    11:08:00    11:11:12  
    4. 01.01.2011    11:13:00    11:15:28  
    5. 01.01.2011    11:13:00    11:13:22  
    6. 01.01.2011    11:22:00    11:23:08  
    7. 01.01.2011    11:22:00    11:23:27  
    8. 01.01.2011    11:25:00    11:28:32  
    9. 01.01.2011    11:35:00    11:35:10
     
    и так,  первый начинается в 10-58 и заканчивается в 11-33, что же происходит за эти 40 минут.
     
    кратковременный разговор 2, итого занято 2 линии максимум, с учетом первого разговора.
    кратковременный разговор 3, итого занято 2 линии максимум
    одновреиенно вступают разговоры 4 и 5, и того занято 3 линии максимум
     
    и так далее
    вот эту максимальную нагрузку или загрузку канала и надо выловить в разрезе дня.
     
    ЗЫ сори за скомканное изложение, туплю в эту задачу уже неделю и наступило такое ощущение, что все вокруг понимают ее с полуслова...  

    Всего записей: 249 | Зарегистр. 06-04-2005 | Отправлено: 18:40 09-02-2012
    dneprcomp



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    globus_ussr

    Цитата:
    что же происходит за эти 40 минут

    Нечто такое я и подозревал. Тогда можно попробовать так.
    Для каждого рекорда в цикле делаем INSERT если проходит проверку  

    Код:
     
    INSERT INTO temptable
    SELECT [дата], [нач], [кон]
    FROM [имя таблицы]
    WHERE  [имя таблицы].[дата] = [дата из переменной для очередного рекорда]
    [имя таблицы].[нач] >= [нач из переменной для очередного рекорда]
    OR  [имя таблицы].[кон] <= [кон из переменной для очередного рекорда]

    После окончания цикла делаем

    Код:
    SELECT DISTINCT [дата], [нач], [кон] FROM temptable  

     
     

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 20:13 09-02-2012 | Исправлено: dneprcomp, 20:24 09-02-2012
    Legio



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Не очень понимаю, чего вы с задачей про Excel делаете в этой теме, но свой велосипед тем не менее предложу. Допущения: а) данные о каждом звонке записаны в одну строчку в три колонки, б) данные упорядочены по времени начала звонка, в) обработка будет вестись унутре Excel'я посредством VBA (хотя последнее не очень важно, на самом-то деле).
     
    (Смысл алгоритма такой -- по первой строчке берём начало текущего учитываемого промежутка; дальше смотрим, сколько ещё звонков начинаются в это же время; дальше ищем начало следующего промежутка -- это либо конец одного из звонков, либо начало какого-то из следующих звонков; уже учтённые данные стираются.)
     
    Алгоритм детализировался методом "где левая пятка скажет, там и уточню", переменных для хранения состояния должно быть минимум 4 -- начальное время рассматриваемого промежутка (StartTime), конечное время рассматриваемого промежутка (EndTime), количество звонков за рассматриваемый промежуток (CurrentCount) и номер текущего ряда на листе "Результат" (CurrentResultRowIdx).
     
    Инициализация переменной с номером текущего ряда (CurrentResultRowIdx) должна происходить до начала обработки, остальные три (хранящие состояние рассматриваемого промежутка) должны обнуляться в начале каждого прохода по циклу.
     
    0. Копируем исходные данные "куда-нибудь", куда не очень жалко, потому что оне в процессе помрут; в этом "куда-нибудь" помимо листа с исходными данными должен быть лист с "результатом обработки" -- пусть это будут "Данные" и "Результат". Формат листа "Результат" -- два столбца на дату и время начала промежутка, два столбца на дату и время окончания промежутка, столбец с количеством звонков за этот промежуток.
    1. [На листе "Данные"] берём начальное время звонка (полное, вместе с датой; сохраняем в StartTime) из первой строчки. (Если оно там есть; если первая строчка пустая -- сворачиваемся.)
    2. [На листе "Данные"] Смотрим, сколько ещё звонков началось в это время (смотрим данные во втором столбце, пока либо они не кончатся, либо не сменится время, сохраняем это значение в CurrentCount).
    3. [На листе "Данные"] в текущих обрабатываемых звонках (число которых см. в CurrentCount) ищем наиболее раннее время завершения звонка (тоже полное, вместе с датой; сохраняем в EndTime). (EndTime обязательно надо сравнивать ещё и с началом "следующего" звонка -- который будет в ряду (CurrentCount+1), иначе из-за длинных звонков пропадёт много-много данных.)
    4. [На листе "Результат"] Записываем время начала промежутка, время окончания промежутка и количество звонков за промежуток. (А заодно увеличиваем на единицу CurrentResultRowIdx.)
    5. [На листе "Данные"] в текущих обрабатываемых звонках (число которых см. в CurrentCount) заменяем время начала звонка на EndTime.
    6. [На листе "Данные"] в текущих обрабатываемых звонках (число которых см. в CurrentCount) удаляем все строчки, в которых StartTime = EndTime.
    7. См. п. 1.
     
    Более чем уверен, что есть решения проще (и уж точно должны быть решения быстрее).
     
    Ещё здесь не обрабатывается случай, когда звонок нулевой длины (времена начала звонка и конца звонка совпадают). Понятия не имею, как в вашей "бизнес-логике" это надо учитывать. Если учитывать не надо, то такие случаи отлавливаются в процессе определения CurrentCount (п. 2) и по мере обнаружения изничтожаются (в CurrentCount они учитываться, естественно, не должны).
    При такой преобработке никто, кроме таких краевых случаев, вроде бы пострадать не должен.
     
    В роли цикла выступает While.
     
    Ещё на листе "Результат" логи будут скорее всего прерываться -- и перед практическим употреблением очень даже стоит пройтись по этому листу (снизу вверх -- потому что придётся добавлять строчки) и если у соседних рядов не совпадают начало промежутка нижнего ряда с концом промежутка верхнего ряда, добавлять строчку с недостающим промежутком, а в количество звонков за этот промежуток писать ноль.
     
    Вроде всё.
     
    Добавлено:
    В принципе, какой-то там лист "Результат" и не нужен вовсе -- можно же всё просто тупо append'ить в файл (т. е. минус одна переменная для хранения состояния)
     
    Добавлено:
    Чуть не забыл учесть длинные звонки
    Точно спать пора.

    Всего записей: 695 | Зарегистр. 01-08-2003 | Отправлено: 20:18 09-02-2012 | Исправлено: Legio, 20:46 09-02-2012
    dneprcomp



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    globus_ussr
    Впрочем, по размышлению, мое последнее решение тоже не покажет все пересекающиеся звонки.

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 21:39 09-02-2012
    globus_ussr



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Legio
    я тут "делаю" не с екселем, а с visualBasic и алгоритмом, то что исходные данные лежат в екселе, не имеет никакого значения.
     
    изначально мой вопрос не содержал инф. про источник данных, так вышло )))  
     
    за вариант спасибо, буду пробовать, по замечаниям отпишусь
     
    ЗЫ всем спасибо за помощь !

    Всего записей: 249 | Зарегистр. 06-04-2005 | Отправлено: 05:38 10-02-2012 | Исправлено: globus_ussr, 05:43 10-02-2012
    Bivin



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть последовательность
     
    [download id="20"]
    [download id="21"]
    [download id="22"]
     
    нужно сделать  
     
    [download id="20"] ....  [download id="200"] в ручную слишком долго  
     
    как это сделать?

    Всего записей: 13 | Зарегистр. 06-09-2008 | Отправлено: 23:18 16-02-2012
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Задачи на Visual Basic (VB).


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru