Здравствуйте уважаемые!
Сразу хочу предупредить что в программировании почти ничего не понимаю, и с макросами в Эксель дел не имел, поэтому прошу снисходительности к моим словам, наверняка какую-нибудь глупость скажу... :-)
Нужно мне сделать файл Экселя который бы тянул исторические данные цен на акции от моего брокера и сохранял данные каждой акции в отдельном файле.
Основу собрал из разных макросов, кажется работает (хотя наверняка можно было сделать гораздо лучше, но не в этом суть).
Столкнулся с проблемой которая казалась легко решаемой, но вот почему-то застрял...
Суть проблемы вот в чем:
В ячейку помещается ссылка DDE которая запрашивает данные из другой программы. В этот момент высвечивается слово- PROCESSING.Когда данные подготовлены появляется слово RECEIVED. А после того как макрос их сохраняет в новый файл- FINISHING.
Пока что все эти процессы запускаются вручную поочереди, но так как данных очень много и вручную нажимать так на кнопки весь день нереально, то нужно чтобы все это работало в нужной последовательности само.
Самым логичным мне представляется запускать каждый макрос в зависимости от того какое слово на данный момент в ячейке со ссылкой DDE.
Перепробовал множество вариантов (уже две недели мучаюсь...), но ничего не получается. Когда запускаешь все вручную, то макрос активизируется реагируя на слово появляющееся в ячейке и то не всегда, а само все работать не хочет. Предполагаю, что причина может скрываться в том что ячейка в момент изменения в ней слов, неактивна. Но возможно причина совсем в другом.
Помогите пожалуйста, сделать условие которое будет запускать нужный макрос в зависимости от того какое слово сейчас находится в ячейке со ссылкой DDE.
Вот так выглядит ссылка DDE:
=SЛОГИН|hist!'id4?req?AAPL_STK_SMART_USD_~/20170611singleSpace23singleColon59singl
eColon59_2singleSpaceW_11_TRADES_1_1'
А вот сам макрос который нужно запускать после того как данные будут готовы и появится слово- RECEIVED.
Скрытый текст |
---|
Код |
---|
Sub fetchHistoricalData()
'This variable will store the incoming data
'Эта переменная будет хранить поступающие данные
Dim TheArray() As Variant
'Fetch the data from the TWS...
'Принесите данные от TWS...
'(Replace sample123 with your own TWS username!)
'(Заменяют sample123 Вашим собственным именем пользователя TWS!)
TheArray = getData("sample123", "hist", "id4?result")
'... and pass the result into another function which will populate the sheet
'... и переносим результат в другую функцию, которая заполнит лист
Call populate(TheArray)
End Sub
'This function triggers a DDE request and returns its response
'Эта функция вызывает запрос DDE и возвращает его ответ
Function getData(serverName, topic, request)
Dim chan As Integer
'Initiate the DDE channel
'Инициация канала DDE
chan = Application.DDEInitiate(serverName, topic)
'Perform the request
'Выполняем запрос
getData = Application.DDERequest(chan, request)
'Terminate the channel
'Закрываем канал
Application.DDETerminate chan
End Function
'Populate our blank sheet with the incoming data
'Заполняем наш чистый лист с поступающими данными
Sub populate(ByRef TheArray() As Variant)
'Книга
NewBook = ""
' Путь, где будут храниться наши карточки
' Т.е. в той папке, откуда запустился файл с макросом
Path = ThisWorkbook.Path
' Выбираем лист с данными
Sheets("Лист1").Select
' Запускаем цикл, скажем на 100000 итераций
' Начиная со второй строки, не учитывая заголовок
For k = 2 To 10000
' Выйдем из него, когда названия акций закончатся, т.е. строки
If Cells(k, 1).Value = "" Then
k = 10000
Exit For
End If
' Имя файла карточки, назовем по названию акции
Name_file = Path & "\" & Sheets("Лист1").Cells(k, 1).Value & ".xls"
' Создаем новую книгу или делаем ее активной
If NewBook = "" Then
Workbooks.Add
NewBook = ActiveWorkbook.Name
Else
Workbooks(NewBook).Activate
Cells(1, 1).Select
End If
'Watch out for empty possible errors and handle properly.
'Не упустите пустые возможные ошибки и ручку должным образом.
On Error GoTo ErrHandler
For i = 1 To UBound(TheArray)
Range("A" & i + 1).Value = TheArray(i, 1)
Range("B" & i + 1).Value = TheArray(i, 2)
Range("C" & i + 1).Value = TheArray(i, 3)
Range("D" & i + 1).Value = TheArray(i, 4)
Range("E" & i + 1).Value = TheArray(i, 5)
Range("F" & i + 1).Value = TheArray(i, 6)
Range("G" & i + 1).Value = TheArray(i, 7)
Range("H" & i + 1).Value = TheArray(i, 8)
Range("I" & i + 1).Value = TheArray(i, 9)
Next
ErrHandler:
' Сохраняем с нашим новым названием
ActiveWorkbook.SaveAs Filename:= _
Name_file, FileFormat:=xlExcel8, _
Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False
NewBook = ActiveWorkbook.Name
Application.DisplayAlerts = True
' Снова активируем файл с макросом и выбираем лист
Workbooks("Книга1.xls").Activate
Sheets("Лист1").Select
' Переходим к следующей строке
Next k
' Закроем книгу
Workbooks(NewBook).Close
' Выведем сообщение об окончании
MsgBox ("Выполнено!")
Exit Sub
End Sub |
|