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

Страницы: 1
Отправка данных в Телеграм
 
Здравствуйте !

Просмотрев все темы касающиеся отправки сообщения в Телеграм из VBA Excel получилась такая процедура.
Но почему то она не работает и выдает ошибку. Если просто через браузер отправить этот sURI -то все норм обрабатывается и приходит в Телеграм сообщение.

По моему все прописано верно. Но при исполнения send выходит сообщение через несколько секунд ожидания:
Run-Time Error "Не удается найти указанный ресурс".

В чем я ошибаюсь, помогите пожалуйста ?
Код
Sub Send_to_Telegram_Bot()
Dim oHttp As Object
Dim sURI As String
 
token = "573XXXXXXXXXXXXXXXXXXXXXXXXX"
chat_id = Worksheets(2).Cells(17, 8).Value
txt = "hello"
 
sURI = "https://api.telegram.org/bot" & token & "/sendmessage?chat_id=" & chat_id & "&text=" & txt
 
MsgBox sURI, vbInformation, "Запрос"
On Error Resume Next
Set oHttp = CreateObject("MSXML2.XMLHTTP")
If Err.Number <> 0 Then
Set oHttp = CreateObject("MSXML.XMLHTTPRequest")
End If
On Error GoTo 0
If oHttp Is Nothing Then Exit Sub
oHttp.Open "GET", sURI, False
oHttp.Send
MsgBox oHttp.ResponseText, vbInformation, "Ответ"
Set oHttp = Nothing
End Sub



 
Замена десятичного разделителя в числах "на лету"
 
Эта функция работает не корректно
Если вводить вручную хоть с точкой хоть с запятой все работает.
А если делать вставку готового значения  по ctrl+V в "строке функций" или непосредственно в ячейку - то происходит смена формата.
Например пробуя вставить 1.2557 ячейка переводится в неизвестный формат (все форматы) и показывает дату 01.01.2557. Чё к чему ? Не пойму я этот Replace.

Получается, что сначала Таблица меняет формат, а затем применяет к ней нашу функцию.
А как сделать изменения в ячейке до форматирования Таблицой ?
Как вообще запретить изменение форматирования ?
Изменено: selestasvz - 21.09.2017 05:48:37
Замена десятичного разделителя в числах "на лету"
 
Здравствуйте !
Задача: при вводе данных в ячейки при нажатии "ENTER" автоматически ставился в числах правильный десятичный разделитель, который определен в настройках системы.

Т.е. замена точек на запятые и обратно.

Я использую такой код:
Код
Selection.Replace What:=".", Replacement:=Application.DecimalSeparator, LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

Но есть проблема: самопроизвольно меняются форматы ячеек - то на Дату, то на числовой и пр.... а надо чтобы не изменялся формат и был просто "Общий".

Подскажите, как допилить.

Запуск Функции из подгружаемых строк в Модуль
 
Кнопка цитирования не для ответа [МОДЕРАТОР]

А можете тогда посоветовать как будет лучше реализовать:
- дешифровать в надстройку и погружать ее в систему
- дешифровать в файл xls и подгружать в невидимой книге ?

Я с надстройками не работал и поэтому не знаю, можно ли с нею раотать как с обычным файлом и есть ли возможность ее подгрузки непосредственно через VBA  
Программно снять защиту с VBA чтобы добавить строки в модуль
 
Цитата
Inexsu написал:
ПРОГРАММНО СНЯТЬ ПАРОЛЬ С VBA ПРОЕКТА
Не подходит.
Мне нужен быстрый, стабильный, надежный и однозначный вариант, чтобы пользователь его даже не замечал и все это происходило крайне быстро и не заметно. Я понял уже, что вставлять код в модули вариант не айс, когда уже весь проект с шифрованием и передачей кода был готов..... слишком поздно. А когда я подошел к моменту выпуска проекта и включил защиту страниц и проектаа, выснилось, что всё, на чем базировался подход при написании проекта в конечном итоге не сработало !!! Обидно, досадно !!!

А идея была реализована такая: расшифровка строк модулей при совпадении ключей и исполнение их на лету.
Шифровать Таблицу - не пойдет, т.к. огромное кол-во информации - работает крайне медленно. Поэтому шифровка кода - была самой хорошей идеей и главное рабочей, пока я не перешел к последнему этапу - запуска проекта с Защитой листов и проекта.

Очень жалко. Хелпппппппп .
Как можно по-другому реализовать задумку ?

Подгрузка внешнего xls файла - это считай передать исходники.
Программно снять защиту с VBA чтобы добавить строки в модуль
 
Здравствуйте !

Собственно я поставил пароль на изменение проекта VBA, но сам код использует часть подгружаемого контента из интернета.
И когда выполняется функция вставки новых строк в модуль, то выходит ошибка, т.к. проект VBA защищен.

Вопрос: как зная пароль на проект VBA быстро и незаметно его отключать на время модификации модулей ?
Изменить значение в ячейке, находящейся на другом листе
 
Цитата
Equio написал:
Я имел ввиду закомментировать вот эту строку On Error GoTo ErrorHandler. Причём не только в самой этой функции, но и в других блоках.
Останавливается на  строке
Код
Worksheets(2).Cells(6, 2) = serial
Изменить значение в ячейке, находящейся на другом листе
 
Цитата
vikttur написал:
Get_HwID - это откуда?
Это из того же модуля. Возвращает As String. Эта функция обрабатывается нормально и присваивается значение.

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

Где еще что может быть защищено ?
Изменено: selestasvz - 17.09.2017 17:46:40
Изменить значение в ячейке, находящейся на другом листе
 
Если закоментировать мой обработчик ошибок, то вообще ничего не происходит Или я не могу понять в чем дело.
Дойдя до этой строки:
Код
Worksheets(2).Cells(6, 2) = serial

Все тупо останавливается, не выдается никаких сообщений, просто ничего не происходит, как буд-то я не запускал функцию

Вот полный текст функции. Дальше 15 строки не идет Если я её комментирую то все работает !
Код
Function FIAT_NEW(Method As Integer) As Double
On Error GoTo ErrorHandler

Dim Server_http, URL, SS2 As String
Dim VVV As Double
Dim serial As String
Dim serial_old As String
Dim A As Boolean

serial = Get_HwID()
serial_old = Worksheets(2).Cells(6, 2).value

If serial_old <> serial Then
A = MsgBox("Серийный номер не верный. Сгенерируйте свой на вкладке Настройки иначе использование этого серийного номера будет прекращено Автором", vbCritical)
Worksheets(2).Cells(6, 2) = serial
Exit Function
End If

Select Case Method
   Case 1
   SS = "USDUSD"
   
   Case 2
   SS = "USDEUR"
   
   Case 3
   SS = "USDRUB"
   
   Case 4
   SS = "USDUAH"
   
   Case 5
   SS = "USDKZT"
   
End Select
   
PublicApiSite = "https://query.yahooapis.com/v1/public/yql?q=select+*+from+yahoo.finance.xchange+where+pair+=+" & Chr(34) & SS & Chr(34) & "&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback="

URL = PublicApiSite

' Instantiate a MSXML2.XMLHTTP object and open it
 With CreateObject("MSXML2.XMLHTTP")
       .Open "GET", URL, False
       .Send Null
       Server_http = .responseText
   End With

'Ищем в ответе сервера искомое значение
N1 = InStr(1, Server_http, "Rate") + 7  ' Определяем точку входа: Rate
N_St = Mid(Server_http, N1, 6)          ' Берем 6 символов
SS2 = Replace(N_St, ".", ",")           ' Заменяем точку на запятую

VVV = CDbl(SS2)                         ' Переводим текст в число
FIAT_NEW = VVV

Exit Function
ErrorHandler:
 
  On Error Resume Next
  MsgBox ("Ошибка исполнения: " & Err & Chr(13) & Chr(10) & "в модуле FIAT_NEW " & Err.Number & "  Номер ошибки:" & Err.Number & (13) & Chr(10) & "описание: " & Err.Description)
End Function
Запуск Функции из подгружаемых строк в Модуль
 
Ну переоткрыть это точно не возможно. Эта процедура происходит в автоматическом режиме через установленный интервал (1-5минут) когда юзер сидитт и смотрит на нее...

Т.е. получается, что сделать подгрузку функций внешним кодом не реально в VBA Excel ?
Запуск Функции из подгружаемых строк в Модуль
 
Не долгой была моя радость.
При вызове самой Функции 3, выходит ошибка "automation error" и Excel вообще прекращает свою работу и закрывается.

Функция 3 (TPN_Order) очень простая

Модуль 2
Код
Sub TPN_Call()  ' Кнопка вызова функции
Dim A As Boolean

Call Init_DSK   ' Эта функция вставляет в модуль строки с функцией 3
  A = TPN_Order()
Call Close_DSK   ' Эта функция удаляет ранее прописанные код из модуля
End Sub

Модуль 1
Код
Function TPN_Order() As Boolean   'Отправка на биржу пакета ордеров из TP1, TP2,TP3
On Error GoTo ErrorHandler

MsgBox("Привет")
TPN_Order=True
Exit Function

ErrorHandler: 
  On Error Resume Next
  MsgBox ("Ошибка исполнения: " & Err & Chr(13) & Chr(10) & "в модуле TPN_Order " & Err.Number & Chr(13) & Chr(10) & "описание: " & Err.Description)
End Function

Ошибка происходит непосредственно после запуска функции TPN_Order() не давая выполниться не единой строке.
Изменено: selestasvz - 17.09.2017 14:24:50
Изменить значение в ячейке, находящейся на другом листе
 
Сделал прям совсем для наглядности:
Код
If serial_old <> serial Then 
MsgBox("1")
A = MsgBox("Серийный номер не верный. Сгенерируйте свой на вкладке Настройки иначе использование этого серийного номера будет прекращено Автором", vbCritical)
MsgBox("2")
Worksheets(2).Cells(6, 2) = serial
MsgBox("3")
Exit Function
End If

1,2 выдает, а до 3 не доходит

Срабатывает мой обработчик ошибок:
Код
Exit Function
ErrorHandler:
 
  On Error Resume Next
MsgBox ("Ошибка исполнения: " & Err & Chr(13) & Chr(10) & "в модуле FIAT_NEW " & Err.Source & "  Номер ошибки:" & Err.Number & (13) & Chr(10) & "описание: " & Err.Description)

End Function

который выдает 013 ошибку: Плавающая ошибка - runtime error 13 - type mismatch

Во первых я не могу понять как она может возникать, если Dim serial As String, и ячейка Worksheets(2).Cells(6, 2) тип "Текстовый". Т.е. пишу текст в текст, а он выдает type mismatch.

Во вторых я для проверки вообще пошел вабанк и решил записать любой текст в любую ячейку на листе. И дал ему это:
Код
Worksheets(2).Cells(8, 2) = "Проверка"

Вышла таже ошибка.
Итог - я тупо не могу ничего записать в Worksheets(2), да и как выяснилось вообще ни в какой другой лист.

Что теперь делать ? Куда рыть ? Какие могут быть варианты ?
Изменено: selestasvz - 17.09.2017 12:48:49
Изменить значение в ячейке, находящейся на другом листе
 
Цитата
Equio написал:
Если хотите обращаться к листу именно по его внутреннему номеру, посмотрите что выдаст MsgBox Worksheets("Лист2").Index -  это и будет внутренний номер листа.
MsgBox Worksheets("Лист2").Index ПИШЕТ ЧТО 2

И вот основной код:
Код
serial = Get_HwID()
serial_old = Worksheets(2).Cells(6, 2).value  - значение читается с этого листа и не возникает проблем
If serial_old <> serial Then MsgBox("Серийный номер не верный."): Worksheets(2).Cells(6, 2) = serial: Exit Function    - на этой строке затыкается

Почему из ячейки [6.2] - читает , а записать туда не дает ?

P.S. Размещать весь код здесь не вижу необходимости Это та часть кода, где идет останов.
Изменить значение в ячейке, находящейся на другом листе
 
Делаю проверку:
Код
MsgBox (Worksheets(2).Cells(6, 2))

Выдает правильное значение. Значит адрес правильный.
Думал, потому что ячейка защищена - снял защиту все равно прежний результат. Мистика.....
Изменить значение в ячейке, находящейся на другом листе
 
Цитата
Sanja написал:
Cells(6,2)
Так я же привел часть кода: там и написано Cells
Цитата
Equio написал:
Наверно потому, что Worksheets(2) - это Лист1.
А как тогда будет правильнее указать
Изменить значение в ячейке, находящейся на другом листе
 
Почему я из макроса выполняющегося с Листа1 не могу изменить значение ячейке находящегося на другом листе ?
Код
Лист 1 
  Worksheets(2).Cells(6, 2) = "123" 
   ..... 
Лист 2  
  cell(6.2)

пробовал так:
Код
Worksheets(2).Cells(6, 2) = X

и так
Код
ActiveWorkbook.Worksheets(2).Cells(6, 2) = X
Запуск Функции из подгружаемых строк в Модуль
 
Хорошо !
Запуск Функции из подгружаемых строк в Модуль
 
Вот благодарю !
Мысль как- то вертелась вокруг этого, но сформулироваться не могла
Сделал именно так - все заработало !

Пользуясь случаем хотел бы задать еще один вопрос.
Почему я из макроса выполняющегося с Листа1 не могу присвоить значение ячейке находящегося на другом листе ?
Код
Лист 1
  Worksheets(2).Cells(6, 2) = "123"
   .....
Лист 2 
  cell(6.2)
Запуск Функции из подгружаемых строк в Модуль
 
Здравствуйте !

Столкнулся с нетривиальной для себя задачей при написании макроса VBA для Excel.
Необходимо запустить функции которые находятся в подгружаемой части коде. Т.е. когда модуль заполняет себя сам.

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

Компилятор при вызове Функции 5 выдает ошибку о неизвестной Функции 3 в Модуле 1. Это в принципе и понятно, что пока он не выполнит предыдущую строку о вставке кода в Модуль1, он и не увидит описание Функции 3. Получается, что компилятор компилиирует сразу всю функцию, а потом её запускает нам.

Если Вы зададите вопрос зачем такая сложность со вставкой и удалением кода - ответ прост: ШИФРАЦИЯ.
ВОПРОС: Как сделать вставляемую в Модуль Функцию запускаемой ?  
Изменено: selestasvz - 15.09.2017 14:21:33
Страницы: 1
Наверх