Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 След.
VBA: как эффективно склеивать строки?
 
Цитата
Казанский пишет:
Вы не поставили ; в конце оператора Print.
Спасибо!! Вот что значит невнимательно читать документацию! :)  Я ещё удивился было, почему не сделали такую опцию :)

Попробовал этот подход для своего случая - работает примерно в 4 раза медленнее, чем версия с Join, скорость тоже линейная.
Т.е. вариант во многих случаях приемлемый и простой.
VBA: как эффективно склеивать строки?
 
Попробовал несколько подходов, вот результаты:
1. Самый быстрый подход, как и предполагалось - прямое сохранение листа в CSV файл (тыц)
Но, к сожалению, в моём случае этот "велосипед" не подошёл, т.к. требуемый формат более хитрый, и сохраняемые данные - это лишь часть сложного выходного файла.

2. Отлично показал себя подход с Join (тыц):
Код
 tc = GetTickCount
 ReDim arr(1 To N) As String
 For i = 1 To N
   arr(i) = i
 Next
 ss = Join(arr, "," ;) 
 Debug.Print GetTickCount - tc

Среднее время у меня получилось 6.3 мс на N=10000.

3. Примерно на том же уровне по скорости - подход с резервированием буфера и вставкой нужных строк по кусочкам при помощи MID (тыц)
Среднее время получилось 7.8 мс на N=10000.
Но у него есть недостаток - размер строкового буфера ограничен в 64К, а в моём случае это критично.

4. Исходный подход с итеративной склейкой - как и ожидалось, оказался очень тормозным.
Среднее время 102 мс на N=10000. Причём зависимость от N квадратичная, и это в моём случае самое неприятное!

5. Подход с буферизацией (тыц) интересен, но при каждом Print в файл записывается перевод строки.

6. Подход с заменой N итераций по Cells на одну выборку через Range(...).Value - взлетел отлично, спасибо! (тыц)

ИТОГ: удалось ускориться в десятки раз и, самое главное, избавиться от квадратичных зависимостей.
Всем спасибо огромное за помощь!!
VBA: как эффективно склеивать строки?
 
Ого, сколько ценных предложений! Попробую, отпишусь.
VBA: как эффективно склеивать строки?
 
:)
Пардон, не срабатывали Enter при редактировании текста, зато сообщение отравилось  :)
Сделал апдейт.
VBA: как эффективно склеивать строки?
 
Исходная задача:
На листе есть длинный ряд числовых значений (число колонок 1000-10000).
Нужно эффективно записывать эти числа в текстовый файл, разделяя запятыми.
Первое, что приходит в голову:

UPD: блин, редактор форума глючит!!
==
Код
s = ""
for c = 1 to 1000
  s = s + Cells(1,c).Text + ","
next
print #1, s
==
Но есть подозрение, что это решение будет очень неэффективным из-за переаллокаций памяти.
Может быть, есть какие-то более правильные методы?

UPD2: упаковал код в тег code
Изменено: andy1618 - 22.04.2014 12:06:07 (упаковал код в тег code)
решение загадки энштейна в эксель спомощью SOLVER
 
Очень интересный вопрос!
Мысли:

1. Насчёт Solver - надо подумать, как правильно ограничения формировать.

2. С точки зрения комбинаторики, задача средне-сложная. Если зафиксировать номера домов (1,2,3,4,5), то всего получается комбинаций: 5! перестановок национальностей * 5! цветов домов * 5! марок сигарет * 5! видов животных * 5! сортов напитков = (120)^5 ~= 24 млрд. комбинаций. Т.е. визуально на лист они не влезут, и без VBA при таком подходе не обойтись.

3. Можно решить задачу вручную, использую лист Excel как обычную бумагу. Тут главное - правильно представить таблицу вариантов.
UPD: не заметил сначала прикреплённый файлик. Посмотрел - такой вариант таблицы будет неудобен, надо по каждому дому показывать все возможные варианты признака, постепенно вычёркивая неподходящие (т.е. по каждому номеру дома должно быть 5 колонок).
Съехал формат по всей книге: "Общий" -> "Время"
 
Всем привет!
Вижу такое, пожалуй, в первый раз за 17 лет пользования Excel-ем.
Есть книга (*.xlsm), довольно большая, с персональными планами и т.п., немного меняю её ежедневно.
И вдруг сегодня, ни с того ни с сего, после её открытия на всех листах все ячейки, у которых был формат "Общий", стали отображаться как "Время". В том числе и нетронутые пустые ячейки.

Бекап есть, недельной давности, но интересно было бы осознать, в чём проблема.
Текущая рабочая версия - что произошёл сбой в Excel, и, соответственно, всю книгу лучше восстановить из бекапа, аккуратно накатив новые изменения.
Excel очень странно сравнивает два значения
 
{quote}{login=vikttur}{date=08.06.2012 08:51}{thema=}{post}Точность_как_на_экране следует применять с осторожностью.{/post}{/quote}  
+1! Как-то довелось разбираться с книгой, где была включена эта опция - этот файл чуть не со слезами прислали из бухгалтерии, ссылаясь на неведомые глюки (меняешь одну ячейку - автоматически что-то меняется в других).  
В итоге пришлось отключить эту опцию и всё переделать на культурные округления.
Как ускорить ВПР? (нужен очень быстрый поиск в отсортированной таблице)
 
{quote}{login=ikki}{date=26.04.2012 11:59}  
можно ещё ускорить - выполнять поиск один раз.  
см. вложение.{/quote}  
 
Ага, выше как раз писали про ПОИСКПОЗ + ИНДЕКС.  
Так и буду делать - в моём случае ВПР-ы (с ЛОЖЬю) как раз были натыканы везде, без оглядки на производительность (для небольшой таблицы это работало отлично, а когда данные разрослись на порядок - это стало бутылочным горлышком).  
 
Спасибо!
Как ускорить ВПР? (нужен очень быстрый поиск в отсортированной таблице)
 
Господа, я дико извиняюсь - оказывается, в моей книге последний параметр у ВПР был не ИСТИНА, а ЛОЖЬ. Т.е. использовался не бинарный поиск, а полный перебор.  
Сейчас заменил на ИСТИНУ, плюс добавил контроль, что искомый ключ действительно есть - получилось что-то в духе:  
 
Было:  
=ВПР($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 секунда.  
 
Всем спасибо за интересные идеи!  
Ещё раз, прошу прощения за введение уважаемых гуру в заблуждение.
Как ускорить ВПР? (нужен очень быстрый поиск в отсортированной таблице)
 
{quote}{login=Владимир}{date=26.04.2012 06:24}{thema=}{post}Макрос.{/post}{/quote}  
 
Несколько лет назад пробовал - макрос на VBA с функциональностью, аналогичной ВПР (полный просмотр таблицы с поиском нужных данных), работал раз в 100(!) медленнее, чем ВПР.
Как ускорить ВПР? (нужен очень быстрый поиск в отсортированной таблице)
 
Суть: есть большая (~100 тыс. строк) таблица, левая колонка - уникальные числа, отсортированные в порядке возрастания, возможны "дырки" (пропущенные значения).  
 
Проблема: сейчас для поиска по таблице используется ВПР(знач, табл, столбец, ИСТИНА).  
Работает как надо, но медленно!! (т.к. ячеек с такими запросами тоже несколько десятков тысяч).  
 
Вопрос: посоветуйте, как принципиально ускорить поиск?
Как просуммировать только видимые (после фильтрации) ячейки?
 
Спасибо, работает!
Как просуммировать только видимые (после фильтрации) ячейки?
 
Есть таблица с автофильтром, некоторые строки спрятаны (отфильтрованы).  
Функция СУММ(А:А) выдаст сумму чисел во ВСЕХ строках, а нужно только в ВИДИМЫХ.
Генерация случайного числа с заданной условной вероятностью.
 
{quote}N(X)=LN(1-СЛЧИС())/LN(1-Q)  
ну а дальше округлить до ближайшего верхнего целого    
у меня это решено с помощью (окрвверх(число,кратность=1))  
{/quote}  
Во, это работает! По крайней мере, почти идеально совпадает с моим жутким вариантом через инверсное гамма-распределение, коэффициенты для которого я нашёл, можно сказать, подбором:  
=INT(GAMMAINV(RAND();1;-1/LN(1-Q)))+1  
:)  
 
Единственный момент - у функции округления вверх последний параметр надо сделать равным 0 (т.к. это требуемое число цифр после запятой).
Генерация случайного числа с заданной условной вероятностью.
 
{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, т.е. возникнет ошибка.  
И ещё не совсем ясно, почему округление вверх делается не до целого числа.
Помогите, пожалуйста, формулой...
 
А может вручную - скопировать в столбец C сначала содержимое столбца A, под него - содержимое B и отсортировать?
автоматизация вставки формулы в ячейку
 
А в чём проблема-то? Тормозит? На винчестер не влазит? :)
удаление чисел в заданном интервале
 
Макросом, ясно дело, можно сделать.  
А так - если задача разовая, может быстрее и вручную - с использованием условного форматирования для отмечания "жертв" :)
Нужна не большая помощь!!!
 
Возможно, причина проблемы в том, что между старыми введёнными данными и текущей ячейкой имеются пустые ячейки.  
Туда можно что-нибудь невидимое поставить, вроде пробелов.
проблема с графиком
 
1. Строите обычный график (в координатах XY).  
2. Добавляете для него линию тренда ("Add Trendline")  
3. В закладке опций у линии тренда есть счётчики Forward, Backward для экстраполяции вправо и влево.
операции с форматированными значениями
 
{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)  
:)))  
 
Мда, так и на баш.орг попасть недолго :)
Помогите вывести формулу
 
Для начала я бы построил график, чтобы примерно понять, сколько решений и есть ли они вообще.  
А потом точные решения можно подобрать либо через Tools->Goal seek, либо включить надстройку "Solver" (Tools->Add-ins->Solver add-in), после этого в меню Tools появится соотв. команда ("Solver").  
 
P.S. Все названия приведены по Excel 2000 English
Заполнение из строк с заданным шагом
 
О, оказывается, есть дубликаты этой ветки с интересными решениями:  
http://www.planetaexcel.ru/forum.php?thread_id=952
Заполнение из строк с заданным шагом
 
1. Копируем в клипборд ряд1.  
2. Выбираем ячейку A2, и Правка->Спец. вставка->Транспонировать.  
3. В ячейке B2 вводим "1", в B3 - оставляем пустое значение и растягиваем B2:B3 за уголок вниз - получается ряд чисел вида 1,2 с пропусками в тех рядах, которые не нужны  
4. Выделяем диапазон A2:B10 и сортируем его по второй колонке (Данные -> Сортировка, по колонке B).  
В результате в A2:A6 получается нужный нам список.
Работа с цветом ячейки
 
{quote}{login=Зеленая}{date=15.11.2007 04:32}{thema=Работа с цветом ячейки}{post}С помощью какой клавиши (сочетания клавиш) можно покрасить ячейку?{/post}{/quote}  
 
Еще есть кнопка F4 - повтор предыдущего действия. Часто помогает.
Каждый день недели - на отдельный лист
 
{quote}{login=}{date=14.11.2007 03:23}{thema=}{post}В идеале надо, чтобы из файла котировок за несколько лет (десятки тысяч значений) на отдельных листах для каждого дня недели выкладывалась статистика "Пунктов".{/post}{/quote}  
Вариант1. Все данные оставить на одном листе, а на втором листе построить табличку - даты по вертикали, часы по горизонтали, и при помощи функции ВПР вытаскивать нужные данные с первого листа.  
Вариант2. Написать макрос (можно даже напрямую парсить файл с данными).
Построение диаграммы
 
Ага, т.е. действительно всего 2 числа нужно было получить.  
Ваше решение с формулой массива, пожалуй, оптимальное.
Бланки
 
С макросами - подходов очень много может быть. Первое, что пришло в голову - сделать в Ворде бланк, в котором все изменяемые поля будут указаны как уникальные строки-шаблоны, которые впоследствии будут заменены макросом на нужные значения.  
Пример бланка:  
==  
Договор №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  
==  
 
Но, повторюсь, это всего один из множества возможных подходов.
Макрос в экселе
 
{quote}{login=Anyatbr369}{date=12.11.2007 01:14}{thema=Макрос в экселе}{post}Какие бывают команды в макросе,и как их использовать?{/post}{/quote}  
Посмотрите раздел "Учебник" на этом сайте - там вроде были очень толковые и конкретные статьи.
Страницы: 1 2 3 4 5 След.
Наверх