| Цитата |
|---|
| Казанский пишет: Вы не поставили ; в конце оператора Print. |
Попробовал этот подход для своего случая - работает примерно в 4 раза медленнее, чем версия с Join, скорость тоже линейная.
Т.е. вариант во многих случаях приемлемый и простой.
|
23.04.2014 12:20:31
Попробовал этот подход для своего случая - работает примерно в 4 раза медленнее, чем версия с Join, скорость тоже линейная. Т.е. вариант во многих случаях приемлемый и простой. |
|||
|
|
|
|
22.04.2014 11:48:18
Исходная задача:
На листе есть длинный ряд числовых значений (число колонок 1000-10000). Нужно эффективно записывать эти числа в текстовый файл, разделяя запятыми. Первое, что приходит в голову: UPD: блин, редактор форума глючит!! ==
Но есть подозрение, что это решение будет очень неэффективным из-за переаллокаций памяти. Может быть, есть какие-то более правильные методы? UPD2: упаковал код в тег code
Изменено: - 22.04.2014 12:06:07
(упаковал код в тег code)
|
|||
|
|
|
|
28.02.2013 21:07:23
Очень интересный вопрос!
Мысли: 1. Насчёт Solver - надо подумать, как правильно ограничения формировать. 2. С точки зрения комбинаторики, задача средне-сложная. Если зафиксировать номера домов (1,2,3,4,5), то всего получается комбинаций: 5! перестановок национальностей * 5! цветов домов * 5! марок сигарет * 5! видов животных * 5! сортов напитков = (120)^5 ~= 24 млрд. комбинаций. Т.е. визуально на лист они не влезут, и без VBA при таком подходе не обойтись. 3. Можно решить задачу вручную, использую лист Excel как обычную бумагу. Тут главное - правильно представить таблицу вариантов. UPD: не заметил сначала прикреплённый файлик. Посмотрел - такой вариант таблицы будет неудобен, надо по каждому дому показывать все возможные варианты признака, постепенно вычёркивая неподходящие (т.е. по каждому номеру дома должно быть 5 колонок). |
|
|
|
|
|
28.02.2013 20:42:42
Всем привет!
Вижу такое, пожалуй, в первый раз за 17 лет пользования Excel-ем. Есть книга (*.xlsm), довольно большая, с персональными планами и т.п., немного меняю её ежедневно. И вдруг сегодня, ни с того ни с сего, после её открытия на всех листах все ячейки, у которых был формат "Общий", стали отображаться как "Время". В том числе и нетронутые пустые ячейки. Бекап есть, недельной давности, но интересно было бы осознать, в чём проблема. Текущая рабочая версия - что произошёл сбой в Excel, и, соответственно, всю книгу лучше восстановить из бекапа, аккуратно накатив новые изменения. |
|
|
|
|
|
08.06.2012 14:14:23
{quote}{login=vikttur}{date=08.06.2012 08:51}{thema=}{post}Точность_как_на_экране следует применять с осторожностью.{/post}{/quote}
+1! Как-то довелось разбираться с книгой, где была включена эта опция - этот файл чуть не со слезами прислали из бухгалтерии, ссылаясь на неведомые глюки (меняешь одну ячейку - автоматически что-то меняется в других). В итоге пришлось отключить эту опцию и всё переделать на культурные округления. |
|
|
|
|
|
27.04.2012 00:17:43
{quote}{login=ikki}{date=26.04.2012 11:59}
можно ещё ускорить - выполнять поиск один раз. см. вложение.{/quote} Ага, выше как раз писали про ПОИСКПОЗ + ИНДЕКС. Так и буду делать - в моём случае ВПР-ы (с ЛОЖЬю) как раз были натыканы везде, без оглядки на производительность (для небольшой таблицы это работало отлично, а когда данные разрослись на порядок - это стало бутылочным горлышком). Спасибо! |
|
|
|
|
|
26.04.2012 23:07:48
Господа, я дико извиняюсь - оказывается, в моей книге последний параметр у ВПР был не ИСТИНА, а ЛОЖЬ. Т.е. использовался не бинарный поиск, а полный перебор.
Сейчас заменил на ИСТИНУ, плюс добавил контроль, что искомый ключ действительно есть - получилось что-то в духе: Было: =ВПР($C$1;$A$1:$B$10000;2;ЛОЖЬ) Среднее время работы (для 1 млн. вызовов) - примерно 100 секунд Стало: =ЕСЛИ(ВПР($C$1;$A$1:$B$10000;1;ИСТИНА)=$C$1;ВПР($C$1;$A$1:$B$10000;2;ИСТИНА);НД()) Среднее время работы (для 1 млн. вызовов) - примерно 1 секунда. Всем спасибо за интересные идеи! Ещё раз, прошу прощения за введение уважаемых гуру в заблуждение. |
|
|
|
|
|
26.04.2012 18:22:31
Суть: есть большая (~100 тыс. строк) таблица, левая колонка - уникальные числа, отсортированные в порядке возрастания, возможны "дырки" (пропущенные значения).
Проблема: сейчас для поиска по таблице используется ВПР(знач, табл, столбец, ИСТИНА). Работает как надо, но медленно!! (т.к. ячеек с такими запросами тоже несколько десятков тысяч). Вопрос: посоветуйте, как принципиально ускорить поиск? |
|
|
|
|
|
21.05.2008 13:44:30
{quote}N(X)=LN(1-СЛЧИС())/LN(1-Q)
ну а дальше округлить до ближайшего верхнего целого у меня это решено с помощью (окрвверх(число,кратность=1)) {/quote} Во, это работает! По крайней мере, почти идеально совпадает с моим жутким вариантом через инверсное гамма-распределение, коэффициенты для которого я нашёл, можно сказать, подбором: =INT(GAMMAINV(RAND();1;-1/LN(1-Q)))+1 :) Единственный момент - у функции округления вверх последний параметр надо сделать равным 0 (т.к. это требуемое число цифр после запятой). |
|
|
|
|
|
21.05.2008 10:22:31
{quote}{login=DL}{date=19.05.2008 12:10}{thema=}{post}Ну за спасибо...
Если вероятность наступления события за один шаг не 0.5, а другая (= Q) То случайное число задающее шаг на котором произошло событие =ОКРВВЕРХ(LN(1-СЛЧИС()*(1-Q)/Q)/LN(Q);1){/post}{/quote} Формула интересная, для Q=0.5 работает нормально, но для произвольных Q что-то с ней не так: возьмём Q = 0.2 и СЛЧИС() = 0.5 Тогда аргумент у первого логарифма будет: 1-СЛЧИС()*(1-Q)/Q = 1 - 0.5 * (1 - 0.2) / 0.2 = -1, т.е. возникнет ошибка. И ещё не совсем ясно, почему округление вверх делается не до целого числа. |
|
|
|
|
|
27.11.2007 11:18:11
{quote}{login=}{date=26.11.2007 12:59}{thema=Re: операции с форматированными значениями}{post}{quote}{login=Раиса}{date=26.11.2007 12:39}{thema=операции с форматированными значениями}{post}Подскажите, пожалуйста, есть задача: подсчитать (сумму, срзнач, и т.п.) значений оформленных полужирным начертанием, как это сделать?{/post}{/quote}
Если выделение не имеет своей определенной закономерности, то такую задачу можно решить (только) через макрос.{/post}{/quote} Гм, судя по уточнению про школьников и про одну функцию, есть у меня смутное подозрение, что для приведённого примера правильный ответ ожидается такой: =AVERAGE(B1:H1;A2:G2) :))) Мда, так и на баш.орг попасть недолго :) |
|
|
|
|
|
21.11.2007 12:35:13
Для начала я бы построил график, чтобы примерно понять, сколько решений и есть ли они вообще.
А потом точные решения можно подобрать либо через Tools->Goal seek, либо включить надстройку "Solver" (Tools->Add-ins->Solver add-in), после этого в меню Tools появится соотв. команда ("Solver"). P.S. Все названия приведены по Excel 2000 English |
|
|
|
|
|
21.11.2007 12:27:23
1. Копируем в клипборд ряд1.
2. Выбираем ячейку A2, и Правка->Спец. вставка->Транспонировать. 3. В ячейке B2 вводим "1", в B3 - оставляем пустое значение и растягиваем B2:B3 за уголок вниз - получается ряд чисел вида 1,2 с пропусками в тех рядах, которые не нужны 4. Выделяем диапазон A2:B10 и сортируем его по второй колонке (Данные -> Сортировка, по колонке B). В результате в A2:A6 получается нужный нам список. |
|
|
|
|
|
18.11.2007 17:49:17
{quote}{login=}{date=14.11.2007 03:23}{thema=}{post}В идеале надо, чтобы из файла котировок за несколько лет (десятки тысяч значений) на отдельных листах для каждого дня недели выкладывалась статистика "Пунктов".{/post}{/quote}
Вариант1. Все данные оставить на одном листе, а на втором листе построить табличку - даты по вертикали, часы по горизонтали, и при помощи функции ВПР вытаскивать нужные данные с первого листа. Вариант2. Написать макрос (можно даже напрямую парсить файл с данными). |
|
|
|
|
|
13.11.2007 09:56:44
С макросами - подходов очень много может быть. Первое, что пришло в голову - сделать в Ворде бланк, в котором все изменяемые поля будут указаны как уникальные строки-шаблоны, которые впоследствии будут заменены макросом на нужные значения.
Пример бланка: == Договор №CONTRACT_NUMBER от CONTRACT_DATE. ... == Соответственно, можно в макросе запросить (или извлечь откуда-то, или посчитать) нужные данные и потом их заменить в текущем открытом бланке: == Sub FillBlank() Const ID_CONTRACT_NUMBER = "CONTRACT_NUMBER" Const ID_CONTRACT_DATE = "CONTRACT_DATE" Dim sNumber As String Dim sDate As String sNumber = InputBox("Please, specify the contract number", , "223-322") sDate = InputBox("Please, specify the contract date", , CStr(Date)) Selection.WholeStory ' Select all With Selection.Find .Text = ID_CONTRACT_NUMBER ' Old value .Replacement.Text = sNumber ' New value End With Selection.Find.Execute Replace:=wdReplaceAll With Selection.Find .Text = ID_CONTRACT_DATE ' Old value .Replacement.Text = sDate ' New value End With Selection.Find.Execute Replace:=wdReplaceAll End Sub == Но, повторюсь, это всего один из множества возможных подходов. |
|
|
|
|