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

Страницы: 1 2 След.
Получение котировок и индикаторов для биржевой торговли
 
Добрый день. Интереса ради решил побаловаться торговлей на бирже (как источник заработка это не рассматриваю, скорее получится наоборот :).
Хочу выгружать в эксель в реальном времени различные индикаторы, которые можно утянуть с веб-страниц (что-то можно из Quik в эксель передовать через DDE). На форуме видел макрос по получению курсов с ЦБР.ру, довольно простой и понятный даже для новичка вроде меня. Мне кажется тут будет куда сложнее. Понятно, что готовых рецептов здесь нет, прошу совета с чего начать (Какую литературу читать, какие курсы слушать). Где есть готовые примеры, которые можно по костям разобрать.
курс цбр (ошибка макроса)
 
Добрый день, коллеги. Скачал макрос год назад на получение курса с cbr.ru, у всех коллег он прекрасно работал. Я сам понимаю его довольно поверхностно, достаточно, чтобы применять, но не править. Недавно нужно было запустить на компьютере с не русскими региональными настройками (Английские, вероятно), там дата была в формате 01/03/2014, а на других машинах дата отображалась всего нормально, например 01.03.2014. Правка даты не помогала, макрос все равно не правильно отрабатывал, вот код. Косяк, вероятно, тут dd\/mm\/yyyy. Как сделать макрос универсальным, чтобы он мог дату и в том, и в том формате обработать? У меня на листе есть код, проставляющий дату = date (текущей), поэтому от формата 01/03/2014 вроде как не уйти.

Код
Function GetRate(ByVal CurrencyName As String, ByVal RateDate As Date) As Double
          ' функция возвращает курс валюты CurrencyName на дату RateDate
    ' в случае ошибки (неверная дата или название валюты) возвращается 0
    On Error Resume Next
     CurrencyName = UCase(CurrencyName): If Len(CurrencyName) <> 3 Then Exit Function
     Set xmldoc = CreateObject("Msxml.DOMDocument": xmldoc.async = False
     url_request = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=" + Format(RateDate, "dd\/mm\/yyyy"

     If xmldoc.Load(url_request) <> True Then Exit Function    ' Запрос к серверу ЦБР

     ' Обработка полученного ответа
    Set nodeList = xmldoc.selectNodes("ValCurs": Set xmlNode = nodeList.Item(0).CloneNode(True)
     Set node_attr = xmlNode.Attributes(0): strDate = node_attr.Value
     Set nodeList = xmldoc.selectNodes("*/Valute"
     For i = 0 To nodeList.Length - 1    ' поиск нужной валюты
        Set xmlNode = nodeList.Item(i).CloneNode(True)
         If xmlNode.childNodes(1).Text = CurrencyName Then
             CurrencyRate = CDbl(xmlNode.childNodes(4).Text)
             divisor = Val(xmlNode.childNodes(2).Text)
             GetRate = CurrencyRate / divisor
             Exit Function
         End If
     Next
End Function
Изменено: Oleg - 24.12.2014 08:01:32
Сводная таблица минмальное значение - максимальное.
 
Добрый день.
Имеется таблица вида:
[Дата] [Время] [Сотрудник]
Можно ли с помощью сводной таблицы построить такой отчет, в котором по Х будет Дата, по У будет Сотрудник. А в ячейках будет разница максимального и минимального времени для этого сотрудника на эту дату. У меня получается сделать только максимум или только минимум по полю Время.

Спасибо.
Проблема длины текста при переносе из старших версий экселя
 
Ситуация: есть sql база, я к ней подключаюсь из excel файла и копирую определенные строки (книга1). На 2013 экселе все ок, но на 2007 и тем более на 2003 возникает проблема.

Копируются они нормально, но когда я начинаю производить манипуляции с этими ячейками в vba эксель вылетает с ошибкой. Пока не укорочу строки (обрежу часть текста), ошибка не пропадает. Я подозреваю, что дело все же не в спец символах, а длине текста.
Как решить проблему?
Если ее нельзя решить в лоб, может быть можно как-то обрезать текст при копировании из базы скл? Как сделать так, чтобы копировалось только Х первых символов и какой этот Х должен быть?

Благодарю.
Изменено: Oleg - 03.10.2014 13:00:28
Экспорт в ворд с отступом от левого края листа
 
Коллеги, добрый день! Я позаимствовал макрос с этого форума, надо отметить, работает как часы - экспортирует в ворд кусок текста из таблицы.

Код
Sub export_to_word()
    Set wa = CreateObject("Word.Application")
    wa.Visible = True: Set wd = wa.Documents.Add
    wd.PageSetup.Orientation = 0
    WS_calc.Range("A1:Z3").Copy
    wd.Range.PasteExcelTable False, False, False
    Application.CutCopyMode = False
End Sub
К сожалению, таблица в ворд нормально не влезает, я бы хотел изменить отступ от левого края листа ворда. Это возможно сделать?
универсальный код, меняющий вызывающий объект
 
Добрый день, всем хорошего настроения.
Можно ли сделать универсальную функцию VBA, которая будет окрашивать объект при наведении мыши на него мыши, а при отводе ее будет возвращать первоначальный (ну или заданный) цвет. Я могу код в конкретный объект листа прописать (например, кнопку) но слишком уж их много.
Спасибо.
2013 экселе Worksheet_SelectionChange вызывает подтормаживания
 
В 2013 экселе Worksheet_SelectionChange вызывает подтормаживания, заметные невооруженным глазом (даже с пустым телом кода), что очень странно. А в 2003 эта же книга открывается нормально.
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
End Sub
Есть идеи, в каком направлении копать?
Удалить строку из массива
 
Добрый день, коллеги,
Подскажите, пожалуйста, эффективный код на удаление строки из двумерного массива (последующие строки "смещаются" вверх на 1).
На сколько я знаю, redimpreserve можно использовать только не выше двумерного массива?
Искажение шрифта на элементе управления
 
Если поместить лебу на лист, шрифт в ней искажается. При клике на нее шрифт сглаживается и становится нормальным. Все бы хорошо, но в 2003 экселе все это дело выглядит ужасно. В моем 2007 вполне сносно, скрин с 2007 прилагаю. Можно с этим справиться?

подбор ближайшего значения
 
Добрый день, коллеги.
Есть функция GoalSeek (подбор параметра), подбирает значение функции, изменяя параметр (по-моему функция даже линейна).
Если функция дает дискретный результат (например, в функции применяется округление), GoalSeek не всегда может подобрать ответ. И уходит на бесконечность. Но тем не менее довольно близкие значения она подбирает. Есть ли в экселе возможность подбора ближайших значений (то есть функции не обязательно попадать 1 в 1).
Я делал такое с тупым перебором, увеличивая и уменьшая параметр. Но в данном случае уж очень медленно это работает.
ограничение действий пользователя, ограничить ввод данных в определенные ячейки, в которых находятся формулы
 
Добрый день.
Задача ограничить ввод данных в определенные ячейки, в которых находятся формулы. Защита листа, к сожалению не подходит, т.к. у пользователя должна остаться возможность их выделять (чтобы копировать значения из ячеек), но при этом нельзя ему давать возможность менять условное форматирование и вообще форматирование (если запретить изменение формата в защите, формат все равно можно будет поменять копипастом из другой ячейки), что не возможно. То есть если бы можно было поставить такую защиту, которая бы позволяла:
1. менять значения одних ячеек, но не позволяла бы менять формат

2. для других ячеек вообще нельзя бы было менять ни формат, ни значение
Я ранее реализовывал через отлов события изменения ячейки, но на разных версиях экселя возникали проблемы и файл работал очень медленно.
Изменено: Oleg - 08.05.2014 16:21:54
Заблокировать форматирование ячеек, но оставить возможность редактировать значения в них
 
Добрый день, друзья.
Задача передо мной стоит такая: сделать файл, в который пользователи будут вносить вводные данные и получать какой-то результат.
При этом ячейки, в которые они вносят данные, должны быть защищены от изменения формата (юзеры любят копипастить из ворда, после чего файл превращается в новогоднюю елку), но должна оставаться возможность менять значение в ячейках. Стандартная блокировка такого не позволяет, она блокирует возможность вносить любые изменения в значения ячеек.
Я долго думал, как реализовать данный функционал, решил следующим образом: при любом изменении листа макрос отслеживает точку изменения (что уже само по себе не так просто и в некоторых случаях вообще невозможно) и форматирует "по чистовой", то есть если пользователь "загадил" формат, макрос его восстановит, а также восстанавливает стертые формулы. Это происходит сотые доли секунды. практически незаметно, но проблема в том, что после того как файл и функционал разросся, макрос стал очень тяжело редактируемым. Учитывая, что там еще прикручена скл база прайсов и прочие фичи, а также я вообще не программист, всего лишь любитель, все это поддается редактированию с огромным трудом.
Кстати, условное форматирование по той же причине не могу использовать, т.к. у пользователя должна остаться возможность удалять, вставлять строки, делать другие действия, которые также его сбивают. В общем из всех стандартных вариантов, которые могут вам придти в голову, 90% я уже наверняка попробовал. Пишу на случай вопросов вроде: "Зачем форматировать ячейку макросом, ведь есть условное форматирование".
Прилагаю файл (сильно его порезал, ибо не влезал), на листе "спецификация" предмет вопроса.

Плюс из за такого подхода возникают плавающие глюки самого экселя с форматированием (когда, например, я не могу изменить тип линии определенной ячейки, только если выделю диапазон вокруг нее, а если все же пытаюсь, эксель вылетает с ошибкой, ну и прочие радости), т.к. файл юзают и на 2003 и на 2007 экселе и обмениваются ими - в этом причина подобных глюков.

Мне предстоит все переделать, но идей как реализовать такую задачу у меня пока нет. Возможно, кто-то сможет что-нибудь придумать.
Заранее спасибо.
Изменено: Oleg - 17.12.2013 13:11:18
не нажимаются кнопки
 
Добрый день, друзья.
Я сделал файлик на макросах и разослал коллегам. На листе пара кнопок AcitveX и ряд макросов. У 30 людей работает нормально, но у одного кнопки не нажимаются (можно их только перемещать, как в режиме конструктора, двойной клик - вылезают свойства формы) и макросы не работают.
Пробовал ему эксель с 2003 на 2007 обновить - не помогло.
Как решить проблемку?
Заранее спасибо.
хранение большого объема данных в форме
 
Есть форма, код в ней делает запрос на скл сервер и получает данные. Данных много и их надо где-то хранить пока открыта форма. Как можно реализовать хранение без глобальной переменной? Т.к. если используею глобальный массив, он остается после закрытия формы.
Запрет вставки форматированных значений
 
Добрый день, необходимо заблокировать для пользователей возможность вставлять форматированные ячейки. То есть чтобы при любой вставке (ctrl+c и тп) происходила вставка содержимого из буффера как вставить-вставить значения, это возможно?
[ Закрыто] ограничить работу макроса только на текущую книгу
 
Имеется книга с большим количеством макросов. Когда пользователь работает с несколькими подобными или иными книгами часть макросов и юзерформ срабатывают в других книгах, хотя они должны работать только в той книге, из которой вызываются. Последний раз у юзера сработал макрос на запораливание листа из моей книги, в книге пользователя, пользователь был в шоке)))

Я всего лишь любитель, поэтому не знаю как классически решается такая проблема. Я использую в коде 2 вещи:
1. вставляю вначале каждого саба if ThisWorkbook.Path <> ActiveWorkbook.Path Then Exit Sub
2. убираю обращение к листам через activesheet (хотя и не везде это сделал, рефакторить весь код займет целый день, пока лень, может это можно проще реализовать?), например: ThisWorkbook.Worksheets("Спецификация для клиента"  ;)  .Unprotect psw_var

Есть ли простой способ защититься от вмешательства макроса и юзерформ данной книги в работу других книг?
Особенно проблема актуальна по какой-то причине именно при открытии книги, в работе косяков уже не встречается. Вообще я заметил, почему-то при открытии книги запускаются макросы, которые в принципе не должны запускаться, например, макрос срабатывающий на активацию какого-либо листа, который при открытии не активен.
Изменено: Oleg - 26.07.2013 10:27:15
тормозит listbox
 
Добрый день, форумчане.
Подключаюсь к sql базе для осуществления поиска, получаю рекордсет и вывожу его в листбокс.
Странность в следующем: если листбокс большого размера (width, height), то список в 100 позиций выводит 10-15 секунд.
Если листбокс маленький, то на это уходят доли секунды. Это мне кажется странным, т.к. кол-во данных одинакого в обоих случаях, по сути только размер поля для просмотра разный.
Код
ListBox1.Clear
 'ListBox1.Column() = rs.GetRows
 
 rs.MoveFirst
 Do Until rs.EOF
 ListBox1.AddItem (rs(0))
 For n = 1 To rs.Fields.Count - 1
 ListBox1.List(ListBox1.ListCount - 1, n) = rs(n)
 Next
 
 ' ListBox1.List(ListBox1.ListCount - 1, rs.Fields.Count) = get_Last_Price(rs(0))
 rs.MoveNext
 Loop
[ Закрыто] удалить строку из массива
 
Добрый день,
Имеем массив range("b1:c10" ;) . Нужно удалить из него те строки, в которых колонка b имеет нулевое значение.
Заранее спасибо.
Собрать данные из нескольких книг, которые лежат на сервере в разных папках
 
Добрый вечер! Возможно, подобная тема уже поднималась.

Задача: собрать данные из нескольких книг, которые лежат на сервере в разных папках (все они в папке "отчеты"). Книги могут быть названы абсолютно по разному.

Нужно пробежаться по всем папкам, просмотреть в них все книги, вытащить из книг именнованные диапазоны.
Это возможно, если файлы располагаются на сервере? Возможно кто-то подкинет пример кода.
Спасибо заранее.
Изменено: Oleg - 30.05.2018 21:10:12
ограничение на копирование range в range
 
В 2003 экселе возникает, ошибка, когда пытаюсь присвоить значение макросом:
worksheets(1).range("a1")=worksheets(2).range("a1")
Возникает ошибка, в случае если в ячейке слишком длинный текст. В 2007 такой проблемы нет, как можно обойти?
база xls на сервере
 
Добрый день, форумчане, надеюсь на вашу помощь в который раз.
Ситуация:
Есть файл "клиент", в нем 5 артикулов.
Есть файл "база" на сервере (лежит на самбе в локалке), в нем список из 10 тыс позиций: артикул, описание, цена, дата, причем артикулы могут повторяться (а цены разные).

Задача: вывести на "клиентский" лист все совпадения артикулов из файла "база". Ну для начала вывести хотябы одно совпадение... Если использовать формулы листа и делать через ВПР, то массив приходится указывать через ГИППЕРСЫЛКУ, иначе не выходит =ВПР(A1;'\\smb\IT Отдел\[default.xls]Лист1'!$D$1:G$65536;4;ЛОЖЬ). Но при этом мощные тормоза.

Если делать через вба, возможно, лучше 1 раз грузануть всю базу в переменную, но это тоже сомнительное решение.
Может быть кто-то с таким сталкивался?
Изменено: Oleg - 26.03.2013 12:45:52
ограничить пользователя
 
Добрый день, вопроса два:
1. Можно ли запретить пользователю скрывать и отображать колонки, при том, что он может менять их ширину (защита листа не подходит). Возможно, можно как-то отредактировать стандартное контекстное меню, чтобы оттуда пропало действие "скрыть"?
2. Можно ли запретить пользователю перетаскивание ячеек (когда он хватает одну и бросает на другую с заменой), сохранив при этом возможность пользователя "протаскивать" формлы и значения (например 1,2 тянем -> 3,4,5)

Спасибо.
Изменено: Oleg - 25.03.2013 17:07:10
[ Закрыто] проблема: worksheet_change и выбор из списка
 
Прощу прощения еще за одну тему в продолжении этой
http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=46558&MID=387093#message387093

Дело в том, что я долго и упорно пытался справиться с этим багом, но так и не смог, однако, выяснил глубже его природу.
У меня есть код, который срабатывает на событие изменения листа. Если событие изменения листа срабатывает после выбора из списка в ячейке (в ячейке установлена проверка данных и список значений), то код "застревает" (не зацикливается, а именно просто останавливается в бездействии, при этом строки в коде вроде Application.Calculation = xlManual вообще перестают работать, программа их тупо не выполняет) на функции, при этом, если в этой функции никакой работы с переменными нет (например, она пустая), то код на ней не застревает.

Но самое странное в другом, если я впечатываю значение в эту ячейку, такое же что было в списке, или другое, никаких глюков не происходит. Сей глюк наблюдается именно на определенной версии экселя, причем лицензионный официальный дистрибутив. На дргой версии этого нет. Как его обойти я ума не приложу... Заранее спасибо за помощь.
Странная работа макросов
 
Развивая эту тему http://planetaexcel.ru/forum/?PAGE_NAME=read&FID=1&TID=46522\
Сам файл тут http://webdrive.reborn.ru/Eol/lineage/ver%20f16.3.xls

В 2ух словах: имеем макрос, имеем функцию, которая в нем неоднократно используется.

Function count_rate(val1, val2)
Dim valx, valy, i

Select Case val1
Case "RUR"
valx = 2
Case "EUR"
valx = 3
Case "USD"
valx = 4
Case "JPY"
valx = 5
Case Else
GoTo ender
End Select

Select Case val2
Case "RUR"
valy = 2
Case "EUR"
valy = 3
Case "USD"
valy = 4
Case "JPY"
valy = 5
Case Else
GoTo ender
End Select
count_rate = ThisWorkbook.Worksheets("Êóðñû"  ;)  .Cells(valx, valy)
ender:
End Function

Абсурд в том, что на одном компе все нормально работает, на другом по какой-то причине все заканчивается на том, что функция вызывается один раз, после ее завершения все останалвивается и назад выполнять код программа не возвращается.

Абсурд на этом не заканчивается, если в функции есть какие-то вычисления или select case, она "перехватывает" контроль и на ней все обрывается, если же там что-то вроде count_rate=15, то все работает.
По-моему это противоречит законом логики, либо я что-то не понимаю.
Спасибо заранее, если просто так не получится решить вопрос, я объявлю гонорар тому, кто отгадает. В пятницу у меня выступление по этому расчету, а я еще не знаю, сколько еще он мне сюрпризов готовит  :)  



End Function
плавающий глюк
 
Function count_rate(val1, val2)
Dim prng()
Dim valx, valy, i
prng = Range(ThisWorkbook.Worksheets("Êóðñû").Cells(2, 1), ThisWorkbook.Worksheets("Êóðñû").Cells(5, 1))


For i = 1 To 4

If val1 = prng(i, 1) Then
valx = i + 1
checker1 = 1
End If

If val2 = prng(i, 1) Then
valy = i + 1
checker2 = 1
End If


If checker1 = 1 And checker2 = 1 Then
count_rate = ThisWorkbook.Worksheets("Êóðñû").Cells(valx, valy)

Exit Function

End If

Next i
count_rate = 0
End Function

На одном компе все работает нормально, на другом какой-то микроглюк, сами собой вырубаются эвенты, после этого их только через вба врубать. В дебагер не выкидывает, никаких ошибок. Ума не приложу в чем дело, на обоих 2007 эксель. Опытным путем понял, что глюк проходит если закомпилить строку
prng = Range(ThisWorkbook.Worksheets("Êóðñû").Cells(2, 1), ThisWorkbook.Worksheets
Ршибка при открытии из outlook
 
При открытии файла прямо из почты эксель вылетает в дебагер. Подозреваю, что макрос пытается производить манипуляции после открытия книги, но по какой-то причине ему это сделать не дает система.
Можно ли с этим справиться?
Изменено: Oleg - 04.03.2013 10:03:16
защита от глупого юзера
 
Делаю файл калькуляции, цена ошибки очень велика. Люди склонны тупить, я хочу застраховаться от всех возможных ошибок  :) .

1. В частности есть заблокированные для изменений ячейки, с ними все ясно.
2. Есть ячейки со снятым флагом защиты. Их человек можеть менять и вводить туда начальные данные, я предусмотрел казалось бы все (восстановление критических формул на листе из резервной скрытой строки и т.д и т.п.)... но юзер может сделать следующее: перетащить ячейку на ячейку, тогда где-то на другом листе, который использует вводные с этой потерянной ячейки будет #ссылка, как я не бился, так и не придумал, как этого избежать (можно, конечно, прописать макрос на восстановление вообще ВСЕХ формул, но я опупею это делать  :)  ).

я нашел следующее решение, можно сделать, наверное, сверку формул с открытых листов, с их резервными копиями на скрытых листах. Кто-то делал что-то подобное?

Мне не раз здесь уже помогали, заранее спасибо за помощь и в этот раз.
Изменено: Oleg - 08.02.2013 14:08:47
выжать максимум скорости
 
Тема уже обсуждалась в том или ином виде.
Суть: на листе макрос - копирование одной ячейки на диапазон при изменении листа, таким образом "размножается" формула из этой ячейки на весь диапазон.
Range("ab1:ak1").Copy Worksheets("Ñïåöèôèêàöèÿ").Range("ab" & trs & ":ak" & tre)
При этом, конечно, копируются и форматы, а они по-сути мне не нужны, а при частом изменении лист "мигает", т.к. в большом диапазоне перезаписываются форматы (а мне еще подом макросом надо что-то выделять другим цветом, через colorIndex - получается лишние графические вычисления). Я могу скопировать только значения-формулы, без форматов, но только используя selection, а мне не хочется каждый раз сбрасывать текущий выбор пользователя.
Если я просто приравниваю формулы  
Worksheets("Ñïåöèôèêàöèÿ").Range("ab" & trs & ":ak" & tre).formula = Range("ab1:ak1").formula
получается не нужный мне сдвиг. Тоесть в первом случае формула множится для этой ячейке по эталону, во-второй она "съезжает".

Вопроса 2 (по крайней мере я вижу 2 решения задачи):
1. Можно ли отрубить отрисовку форматов до завершения цикла и отрисовать все разом по факту изменений, без "миганий". Уже использую:
       Application.ScreenUpdating = False
       Application.EnableEvents = False
не помогает
2. Можно ли скопировать только формулу из ячейки, "сместив" ее относительно родительской ячейки:
Например, формула в ячейке a1=b1+c1, в ячейке а5 и а6 мне надо получить a5=b5+c5, в а6=b6+c6
если я пишу range("a5:a6").formula=range("a1").formula получается "сдвиг" и в а5 будет a5=b1+c1, а мне налр b5+c5

Спасибо, прошу прощения за сумбурное объяснение
проверка на завершения открытия книги
 
Добрый день, суть проблемы:
Есть книга, на некоторых листах есть макрос, срабатывающий при активации этих листов.
При этом внутри макроса идет проверка на значение чекбокса.
При открытии книги происходит вылет, если закрыл я ее на листе "расчет". Вылет идет на строке
If CheckBox1.Value = True Then я подозреваю, что при открытии книги этот объект еще не загрузился, а эксель уже пытается считать его значение. Что делать?
Проверку через until DoEvents какую-то сделать может быть?
Файл в приложении.

Спасибо
Изменено: Oleg - 04.02.2013 13:06:32
ошибка в коде
 
Доброго времени суток всем увлеченным экселем людям.

В одной теме мне посоветовали заменить свой код на код ниже, но он по-какой-то причине не работает - синтаксическая ошибка, хотя логика кажется вполне нормальной. Кто поможет разобраться :)?

Function count_rate(val1, val2)
Dim prng(1 To 4)
prng = Worksheets("Eo?nu" ;) .Range(Worksheets("Eo?nu" ;) .Cells(2, 1), Worksheets("Eo?nu" ;) .Cells(5, 1)).Value
checker = 0

For i = 1 To 4
If val1 = prng(i) Then
val1 = i + 1
checker1 = checker1 + 1
End If
If val2 = prng(i) Then
val2 = i + 1
checker2 = checker2 + 1
End If
If checker1 =1 and checker2 =1 Then
count_rate = Worksheets("Eo?nu" ;) .Cells(val1, val2)
Exit Function
End If
Next i
Страницы: 1 2 След.
Наверх