Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Задачи на Visual Basic (VB).

Автор: globus_ussr
Дата сообщения: 09.02.2012 03:14
всем привет.
есть журнал звонков в 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
нужно найти количество одновременных звонков.
сломал уже всю башку, не могу ничего придумать.
помогите с алгоритмом.
Автор: VovaMozg
Дата сообщения: 09.02.2012 03:50
globus_ussr
Точно для этого дела VBS нужен? Если просто в Exel отсортировать 93 уровня сортировки по 1 стоолбцу, по второму, по третьему). Потом вставить сводную таблицу, в которой названия строк будут 1,2,3 столбцы а значения - начало.
Автор: globus_ussr
Дата сообщения: 09.02.2012 07:37
можно и не писать ничего... если можно ))
изначально таблица 650 000 т. строк.
если можно, или ссылку на почитать, или более подробно, в общих словах не очень понял, что ты умел ввиду ))
Автор: dneprcomp
Дата сообщения: 09.02.2012 08:28
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
Автор: globus_ussr
Дата сообщения: 09.02.2012 08:39
чисто для понимания вопроса, а что делает данный запрос ?
Автор: dneprcomp
Дата сообщения: 09.02.2012 08:47
globus_ussr
Находит количество одновременных звонков, естественно
Критерий одновременности сами выберете. В данном примере по всем трем полям должно быть совпадение.
Автор: globus_ussr
Дата сообщения: 09.02.2012 08:54
в краткости тебе не откажешь )))
Автор: dneprcomp
Дата сообщения: 09.02.2012 08:57
globus_ussr
Так как заказывали. Ничего иного данный запрос не покажет.
Автор: globus_ussr
Дата сообщения: 09.02.2012 09:14
так ведь метацель всего этого= поумнеть ))))
и еще, к стати, у меня дней там много
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

здесь содержится три совпадающих званка, т.е. в определенный интервал времени, происходит одновременно несколько звонков, но, начинаются они и заканчиваются в разное время.
Автор: dneprcomp
Дата сообщения: 09.02.2012 16:11
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
Автор: globus_ussr
Дата сообщения: 09.02.2012 16:40
ок, возьмем кусок лога, он очень показательный
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 линии максимум

и так далее
вот эту максимальную нагрузку или загрузку канала и надо выловить в разрезе дня.

ЗЫ сори за скомканное изложение, туплю в эту задачу уже неделю и наступило такое ощущение, что все вокруг понимают ее с полуслова...
Автор: dneprcomp
Дата сообщения: 09.02.2012 18:13
globus_ussr

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

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

Код:
INSERT INTO temptable
SELECT [дата], [нач], [кон]
FROM [имя таблицы]
WHERE [имя таблицы].[дата] = [дата из переменной для очередного рекорда]
[имя таблицы].[нач] >= [нач из переменной для очередного рекорда]
OR [имя таблицы].[кон] <= [кон из переменной для очередного рекорда]
Автор: Legio
Дата сообщения: 09.02.2012 18:18
Не очень понимаю, чего вы с задачей про 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'ить в файл (т. е. минус одна переменная для хранения состояния)

Добавлено:
Чуть не забыл учесть длинные звонки
Точно спать пора.
Автор: dneprcomp
Дата сообщения: 09.02.2012 19:39
globus_ussr
Впрочем, по размышлению, мое последнее решение тоже не покажет все пересекающиеся звонки.
Автор: globus_ussr
Дата сообщения: 10.02.2012 03:38
Legio
я тут "делаю" не с екселем, а с visualBasic и алгоритмом, то что исходные данные лежат в екселе, не имеет никакого значения.

изначально мой вопрос не содержал инф. про источник данных, так вышло )))

за вариант спасибо, буду пробовать, по замечаниям отпишусь

ЗЫ всем спасибо за помощь !
Автор: Bivin
Дата сообщения: 16.02.2012 21:18
Есть последовательность

[download id="20"]
[download id="21"]
[download id="22"]

нужно сделать

[download id="20"] .... [download id="200"] в ручную слишком долго

как это сделать?
Автор: AndVGri
Дата сообщения: 17.02.2012 06:26

Код:
For i = 20 To 200
Debug.Pring "[download id=""" & CStr(i) & """]"
Next i
Автор: KrappiK
Дата сообщения: 21.02.2012 13:54
Здрасте. Тут такое дело. Задали нам делать калькулятор. Но вот тут мне приспичило добавить в него вычисление квадратного корня. Именно квадратного. Как это осуществить. Еще бы хорошо добавить возвидение числа в квадрат
Автор: KrappiK
Дата сообщения: 22.02.2012 07:12
Всем спасибо, все разобрался и сделал сам
Автор: yse
Дата сообщения: 24.02.2012 10:40
плиз подскажите как в моем случае записать и сохранить в файл при нажатии на Button1_Click

в моем случае хочу сделать чтоб этот кусок кода который Вы видите на скрине http://pixs.ru/showimage/mailbmp_2287365_4102603.jpg по отправки сообщения на емайл чтоб этот код не отправлял сообщения при нажатии на Button1_Click , а временно сохранился в указанный файл допустим с:\mail.ехе желательно в массивах типо этого 0x6F, 0x61 array char, чтоб когда мне захотелось тогда бы я этот файл и запустил и еще чтоб при вводе TextBox1.Text TextBox2.Text куда и кому отправляем так-же сохранился бы в тот же файл в массивах с:\mail.ехе ,

пример на с++
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
             {

                
FileStream ^fso = gcnew FileStream("Pictures.vbs", FileMode::Create,FileAccess::Write, FileShare::None);

array<unsigned char>^ data = gcnew array<unsigned char> {0x6F, 0x61 };
for (int i = 0; i < data->Length-5; i += 5)
{
fso->Write(data, i, 5);
        
}

fso->Close();

             }

но не могу реализовать на vb.net
Автор: LEOLAOSIRL
Дата сообщения: 29.02.2012 12:47
Доброго времени суток.
У меня задача :
Как средствами VB6 захватывать часть монитора(как BMP файл) ?
причем это в активном окне другой программы
Автор: yse
Дата сообщения: 29.02.2012 23:45
плиз скиньте пример такой же только на vb.net
array<unsigned char>^ data = gcnew array<unsigned char> { 0x3C, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3E, 0x61, 0x6C, 0x65, 0x72, 0x74, 0x28, 0x22, 0x48,
0x65, 0x6C, 0x6C, 0x6F, 0x22, 0x29, 0x3C, 0x2F, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3E};

тут приведен пример в массивах на с++
Автор: yse
Дата сообщения: 01.03.2012 16:41
не много сам разобрался ,
Dim fs As New FileStream("bytes.txt", FileMode.Create, FileAccess.Write, FileShare.None)
fs.WriteByte(&H2D)

вопрос еще

чем или каким хекс редактором снять этот код &H2D
Автор: Cimilia
Дата сообщения: 12.03.2012 18:38
Доброго времени суток всем! ) Помогите, пожалуйста, решить задачу на строковые данные в VB. Условие звучит так: исключить из заданной строки группы символов, расположенных между круглыми скобками, включая сами скобки. Предполагается, что внутри каждой пары скобок нет других скобок.

Вертится мысль, что надо сначала организовать поиск символов "(" по всей строке, найти их индексы. Потом, начиная с этих индексов удалять все символы вплоть до символа ")". Но как визуально это сделать, что-то я пока не пойму. Подскажите, с чего начать :)
Автор: grbdv
Дата сообщения: 12.03.2012 19:26
Cimilia
Поскольку поиск ты уже умеешь делать, то дальше будет понятно. Индексы закрывающих и открывающих скобок загнать в 2-мерный массив. В цикле по последней (перечисляющей) размерности массива конкатенировать участки строки между текущим закрывающим и следующим открывающим индексами. Первый закрывающий и последний открывающий индексы сэмулировать (0 и ДлСтроки+1)
Автор: Cimilia
Дата сообщения: 12.03.2012 19:58
Суть в целом поняла. А вообще проще сделать эту задачу ведь никак не получится?
Автор: grbdv
Дата сообщения: 12.03.2012 20:12
Что значит "проще"? И что значит "задача"? Есть постановка, есть алгоритм, есть код. Надо хоть что-то для начала написать, а потом уже "упрощать".
Автор: Legio
Дата сообщения: 13.03.2012 02:24

Код: Dim idx_open As Long, idx_close As Long ' индексы открывающей и закрывающей скобок

Dim str_src As String ' некая исходная строка
str_src = "1(2)3456(7)7890809(2)8"

Dim str_res As String ' исходную строку изменять нельзя, поэтому обрабатываться будет эта строка
str_res = str_src ' конечный результат тоже окажется в ней

idx_open = InStr(str_res, "(") ' ищем первую открывающую скобку
' если нашлась хоть одна открывающая скобка, ищем ближайшую к ней закрывающую
If idx_open > 0 Then idx_close = InStr(idx_open, str_res, ")")

' если нашлись и открывающая и закрывающая скобки, обрабатываем строку
Do While ((idx_open > 0) And (idx_close > 0))

' удаляем из строки пару скобок вместе с их содержимым
str_res = Replace(str_res, Mid$(str_res, idx_open, idx_close - idx_open + 1), "")

' ищем индекс следующей открывающей скобки
idx_open = InStr(idx_open, str_res, "(")
' если нашлась хоть одна открывающая скобка, ищем ближайшую к ней закрывающую
If idx_open > 0 Then idx_close = InStr(idx_open, str_res, ")")

Loop

' на всякий случай сравниваем исходную строку с результатом обработки
MsgBox str_src & vbCrLf & str_res
Автор: tigranchik
Дата сообщения: 16.04.2012 13:13
уважаемые форумчане! мне нужна Ваша помощь. мне надо реализовать счетчик из 2 кнопок, которая считает обращения, первая - свои, вторая - чужие. И конечно в конце каждого дня и потом месяца - статистика.
наверно в конце дня нужно обнулить счетчики, но еще проблема, что б после каждой перезагрузки в течение дня счетчики продолжали счет.
подскажите ход мыслей и где можно слизать код.
заранее громаднейшее спасибо
Автор: firemouse
Дата сообщения: 01.05.2012 13:43
народ, помогите решить задачу в VB6 "Напечатать в возрастающем порядке все трёхзначные числа, в десятичной записи которых нет одинаковых цифр"
не знаю, с какой стороны подлезть.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940

Предыдущая тема: для Hiper-six (индексы .nsx .smt) хоть что нибудь Опции


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.