В общем хочу автоматизировать загрузку на сайт: пост запросом не получаеться, уже все перепробовал, с помощью ИЕ- по проще намного, но тут встала проблема - нужно аплоадить картинки, а их фиг укажешь...
нашел 2 процедурки Upload_Set_Filename и Upload_Click_Open - но они не работают, может кто сталкивался?
Скрытый текст
Код
Public Sub Upload_Set_Filename(sFilePathName As String)
' 'Populate the 'File name:' edit window in the Choose File to Upload dialogue with the specified folder and/or filename.
'
'
' 'The Choose File to Upload has the following child window hierarchy:
'
' ' #32770 Choose File to Upload Static Look &in:
'ComboBox N / A
'Static N/A
'ToolbarWindow32 N / A
'ToolbarWindow32 N / A
'ListBox N / A
'SHELLDLL_DefView N/A 1376604 SysListView32 FolderView
'Static File &name:
'ComboBoxEx32 N/A 8520100 ComboBox N/A 1245594 Edit N/A
'Static Files of &type:
'ComboBox N / A
'Button Open as &read-only
'Button &Open
'Button Cancel
'Button &Help
'ScrollBar N / A
Dim hWnd As Long
Dim timeout As Date
'MsgBox ""
'Debug.Print "Save_As_Set_Filename " & folder
'Find the Window, waiting a maximum of 10 seconds for it to appear
timeout = Now + TimeValue("00:00:10")
Do
hWnd = FindWindow("#32770", "Выбор выкладываемого файла") 'Choose File to Upload
DoEvents
Sleep 200
Loop Until hWnd Or Now > timeout
If hWnd Then
SetForegroundWindow (hWnd)
'Find the child ComboBoxEx32 window
hWnd = FindWindowEx(hWnd, 0, "ComboBoxEx32", vbNullString)
'Debug.Print " ComboBoxEx32 "; Hex(hWnd)
End If
If hWnd Then
'Find the child ComboBox window
hWnd = FindWindowEx(hWnd, 0, "ComboBox", "")
'Debug.Print " ComboBox "; Hex(hWnd)
End If
If hWnd Then
SetForegroundWindow (hWnd)
'Find the child Edit window
hWnd = FindWindowEx(hWnd, 0, "Edit", "")
'Debug.Print " Edit "; Hex(hWnd)
End If
If hWnd Then
'Populate the Edit window with the full file name
' Sleep 200
SendMessageByString hWnd, WM_SETTEXT, Len(sFilePathName), sFilePathName
End If
End Sub
Public Sub Upload_Click_Open(Optional cmb As String)
Dim hWnd As Long
Dim timeout As Date
'Debug.Print "File_Download_Click_Save"
'Find the File Download window, waiting a maximum of 30 seconds for it to appear
timeout = Now + TimeValue("00:00:10")
Do
hWnd = FindWindow("#32770", "Выбор выкладываемого файла")
DoEvents
Sleep 200
Loop Until hWnd Or Now > timeout
'Debug.Print " File Download window "; Hex(hWnd)
If hWnd Then
'Find the child Open button
hWnd = FindWindowEx(hWnd, 0, "Button", "&Открыть")
'Debug.Print " Save button "; Hex(hWnd)
End If
If hWnd Then
'Click the Open button
SetForegroundWindow (hWnd)
Sleep 600 'this sleep is required and 600 miiliseconds seems to be the minimum that works
SendMessage hWnd, BM_CLICK, 0, 0
End If
End Sub
Есть еще вариант через джава скрипт, я даже на сайте его нашел когда запрос ПОСТ разбирал, но ка к с ним справиться тоже не понимаю
Скрытый текст
Код
.Document.parentWindow.execScript "document.all.DLIUploader1.UnselectAll;", "jscript"
.Document.parentWindow.execScript "if(document.all.DLIUploader1.FileCount>199) document.all.DLIUploader1.SelectFile(1);", "jscript" 'online repository accept 200 files at one time per data record
.Document.parentWindow.execScript "document.all.DLIUploader1.RemoveSelectedFiles();", "jscript"
.Document.parentWindow.execScript "document.all.DLIUploader1.UploadFile(" & sFile & ")", "jscript"
Как бы это смешно не звучало, но у меня проблема с синхронизацией асинхронного модуля))) Сам модуль пока не готов, но вот то что сейчас использую:
Скрытый текст
Код
Dim XMLHttpManager As New clsXMLHttpManager
Dim XMLHttpServerManager As New clsXMLHttpServerManager
Public AsyncXMLHttpResponse() As String, AsyncXMLHttpURLS() As String, PublicI As Long
Sub InicializeAsyncXMLHttp(Optional ByVal StartNumber As Long = 0)
PublicI = StartNumber
ReDim AsyncXMLHttpResponse(0 To PublicI)
ReDim AsyncXMLHttpURLS(0 To PublicI)
End Sub
Sub AsyncXMLHttpGet(ByVal URL As String)
If RECheck(URL) Then XMLHttpManager.XMLHttpCall "GET", URL, "AsyncXMLHttpProcessor"
End Sub
Sub AsyncXMLHttpServerGet(ByVal URL As String)
If RECheck(URL) Then XMLHttpServerManager.XMLHttpCall "GET", URL, "AsyncXMLHttpProcessor"
End Sub
Sub AsyncXMLHttpProcessor(XMLHttpReq As Object, _
ByVal URL As String, ByVal sMsg As String)
ReDim Preserve AsyncXMLHttpResponse(0 To PublicI + 1)
ReDim Preserve AsyncXMLHttpURLS(0 To PublicI + 1)
If XMLHttpReq.ResponseText <> "" Then
AsyncXMLHttpResponse(PublicI) = XMLHttpReq.ResponseText
Else
AsyncXMLHttpResponse(PublicI) = "Error"
End If
AsyncXMLHttpURLS(PublicI) = URL
PublicI = PublicI + 1
' ReDim Preserve AsyncXMLHttpResponse(0 To PublicI + 1)
' ReDim Preserve AsyncXMLHttpURLS(0 To PublicI + 1)
End Sub
и сама процедура, парсим ссылки на картинки
Скрытый текст
Код
If LastRow(Sheets(1), 4) = 1 Then
InicializeAsyncXMLHttp
For I = 2 To LastRow(Sheets(1), 3)
pi.SubAction , "Обрабатывается ссылка $index из $count", "$time"
ReadSettings
If I = NextI Then
Erase AsyncXMLHttpResponse
If Not LastRow(Sheets(1), 3) < I Then
For K = I To I + 7
AsyncXMLHttpGet (Cells(K, 3).Value)
Sleep 100: DoEvents
Next
NextI = I + 7
End If
End If
While PublicI = (I - 2): DoEvents: Wend
pi.SubAction , "Обрабатывается ссылка $index из $count", "$time"
html$ = AsyncXMLHttpResponse(I - 2)
Set FindsImg = GetTxt(html$, "src=.(.*?\.(\w){3})(.\d{1,}){1,}\.\w{3}""")
Id = AsyncXMLHttpURLS(I - 2)
rowNum = Application.Match(Id, Rng, 0)
If FindsImg.Count >= 1 Then
If CInt(CountImages) > CInt(FindsImg.Count - 1) Then CountImages = FindsImg.Count - 1
Cells(rowNum, 4) = ""
For J = 1 To CountImages
Cells(rowNum, 4) = Cells(rowNum, 4) & FindsImg(J).SubMatches(0) & ",": DoEvents
Next
End If
Next
Исправил предварительно записав переменную т.е. вместо
Код
Set FindsImg = GetTxt(AsyncXMLHttpResponse(I - 2), "src=.(.*?\.(\w){3})(.\d{1,}){1,}\.\w{3}""")
Код
html$ = AsyncXMLHttpResponse(I - 2)
Set FindsImg = GetTxt(html$, "src=.(.*?\.(\w){3})(.\d{1,}){1,}\.\w{3}""")
Статью почти перевел, есть еще пару вопросов и мне нужна Ваша помощь. 1)Пока не пойму как реализовать CreateObject, с поздним связыванием... 2)Почему-то некоторые сайты не грузились, когда заменил на MSXML2.ServerXMLHTTP - пошло, но намного медленней и хочу реализовать следующее: Использовать сначала MSXML2.XMLHTTP, а если будет ошибка - то MSXML2.ServerXMLHTTP (Хотя нет знаю, создам 2 копии классов и функций, просто буду при ошибке вызывать другой) Сейчас протестировал и MSXML2.XMLHTTP работает но через раз.
Заменил все объявления MSXML на Object и связал в одном месте, только что протестировал - все прекрасно работает. Но проблема с загрузкой через раз - остается. 1)Решено 2)Тоже вроде решено
уже встраиваю в один из проектов - прирост скорости ОГРОМНЫЙ + никаких подвисаний, сейчас делаю краштесты, возможно получится что-то уложить буду по десятку страниц сверху загружать.
Интересно конечно, я еще посмотрю, но для этого нам нужно что? - таскать с собой этот файл или в создавать считывать из него и т.д. в любом случае использовать не ОЗУ, а тормознутый ВИНТ, что ой как не хорошо и тормозит, конечно по сравнению с тем что сейчас есть, лучше, но все-равно немного не-то.
Еще перевожу статью, как переведу - выложу, статья офигенная и результат - тот что нужно! Смысл тот же что и в предыдущем сообщении, но теперь можно делать сколько угодно асинхронных запросов!
цепочка: 1)запрос пользователя (список сайтов, ссылок, запросов ...) 2) отправка запросов (ждем по вайлу пока одна из глобальных переменных не поменялась) , как только меняется 3.1)пошел запрос на следующий сайт в эту глобальную переменную 3.2)выполняем действие с переменной, после обработки ее идем к пункту 2) 4)обработано все, запись данных
Выложу код главный сюда:
Скрытый текст
Код
Option Explicit
Dim XMLHttpReq As MSXML2.XMLHttp, _
bIAmAvailable As Boolean, _
ResponseProcessor As String, _
sURL As String, sMsg As String
Property Get IAmAvailable() As Boolean
IAmAvailable = bIAmAvailable
End Property
Sub ReadyStateChangeHandler()
'Debug.Print XMLHttpReq.readyState
If XMLHttpReq.readyState = 4 Then
If XMLHttpReq.Status = 200 Then
'Process the response here
'hrefToHyperLink XMLHttpReq.responseText, ActiveCell
Application.Run ResponseProcessor, XMLHttpReq, sURL, sMsg
bIAmAvailable = True
Else
Debug.Print XMLHttpReq.Status & ", " & XMLHttpReq.responseText
End If
End If
End Sub
Public Sub XMLHttpCall(ByVal ReqMethod As String, _
ByVal URL As String, ByVal uResponseProcessor As String, _
Optional ByVal AsyncCall As Boolean = True, _
Optional ByVal uMsg As String = "")
Set XMLHttpReq = New MSXML2.XMLHTTP
If AsyncCall Then
sURL = URL: sMsg = uMsg
ResponseProcessor = uResponseProcessor
XMLHttpReq.OnReadyStateChange = Me
End If
With XMLHttpReq
.Open ReqMethod, URL, AsyncCall
.send uMsg
If Not AsyncCall Then Application.Run uResponseProcessor, XMLHttpReq, URL, uMsg
End With
End Sub
и класс:
Скрытый текст
Код
Option Explicit
Option Base 0
Dim XMLHttpMon() As clsXMLHttpMonitor
Private Function findAvailMon() As clsXMLHttpMonitor
Dim I As Integer, Done As Boolean
I = LBound(XMLHttpMon)
Do
If XMLHttpMon(I) Is Nothing Then
Done = True
ElseIf XMLHttpMon(I).IAmAvailable Then
Done = True
Else
I = I + 1
Done = I > UBound(XMLHttpMon)
End If
Loop Until Done
If I > UBound(XMLHttpMon) Then _
ReDim Preserve XMLHttpMon(UBound(XMLHttpMon) + 1)
Set XMLHttpMon(I) = New clsXMLHttpMonitor
Set findAvailMon = XMLHttpMon(I)
End Function
Public Sub XMLHttpCall(ByVal ReqMethod As String, _
ByVal URL As String, ByVal uResponseProcessor As String, _
Optional ByVal AsyncCall As Boolean = True, _
Optional ByVal uMsg As String)
Dim XMLHttpMon As clsXMLHttpMonitor
Set XMLHttpMon = findAvailMon()
XMLHttpMon.XMLHttpCall ReqMethod, URL, uResponseProcessor, AsyncCall, uMsg
End Sub
Private Sub Class_Initialize()
ReDim XMLHttpMon(0)
End Sub
Ну вот ночь не прошла даром и после долгого покраснения моих глаз, а потом ОТЛИЧНОГО СНА (очень рекомендую тем у кого-то что-то не получается) мы получили пока следующее: Module - Test Async
Скрытый текст
Код
Option Explicit
Public xmlHttpRequest As MSXML2.XMLHttp 'объявляем наш объект
Sub Test()
On Error GoTo FailedState
'If Not xmlHttpRequest Is Nothing Then Set xmlHttpRequest = Nothing
Dim MyXmlHttpHandler As CXMLHTTPHandler 'объявляем обработчик
Dim url As String
url = "http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=60760&TITLE_SEO=60760-mnogopotochnost-ili-ee-imitatsiya&MID=508807&result=edit#message508807"
Set xmlHttpRequest = New MSXML2.XMLHttp 'ниже описал, что НЕЛЬЗЯ 2 сразу загружать ТОЛЬКО 1 сайт
' Create an instance of the wrapper class. \ Инициализируем обработчик
Set MyXmlHttpHandler = New CXMLHTTPHandler
MyXmlHttpHandler.Initialize xmlHttpRequest
' Assign the wrapper class object to onreadystatechange. \ объясняем как действовать во время загрузки - с помощью обработчика
xmlHttpRequest.OnReadyStateChange = MyXmlHttpHandler
' Get the page stuff asynchronously. \ загружаем страницу
xmlHttpRequest.Open "GET", url, True
xmlHttpRequest.Send "" 'никаких подвисаний
Exit Sub
FailedState:
MsgBox Err.Number & ": " & Err.Description
End Sub
Sub MyXmlHttpHandler()
'выполняем ЛЮБЫЕ действия после загрузки сайта, единственное не знаю как вернуться в основную процедуру делать метки? resume next?
MsgBox xmlHttpRequest.responseText
End Sub
class CXMLHTTPHandler В этом классе есть 1 секрет который мы не видим и из-за чего все это дело работает, а именно: 1)нужно удалить и експортировать код 2)через блокнот или что-то подобное открыть и дописать после: "Sub OnReadyStateChange()" строчку "Attribute Value.VB_UserMemId = 0" 3)снова импортировать и смотреть на результат, взято из статьи http://www.cpearson.com/excel/DefaultMember.aspx
Скрытый текст
Код
Option Explicit
Dim m_xmlHttp As MSXML2.XMLHttp
Public Sub Initialize(ByRef xmlHttpRequest As MSXML2.XMLHttp)
Set m_xmlHttp = xmlHttpRequest
End Sub
Sub OnReadyStateChange()
Debug.Print m_xmlHttp.readyState
If m_xmlHttp.readyState = 4 Then
If m_xmlHttp.Status = 200 Then
MsgBox m_xmlHttp.responseText ' вот эта строка не срабатывает, но срабатывает в обработчике
Else
'Error happened
End If
End If
End Sub
И что вы думаете - работает , да еще и как, как минимум, нет подвисания, а значит можно спокойно делать все что угодно пока грузится(как минимум Ваш PI прогресс не висит, а это уже что-то), НО после прочтения первой статьи я понял что нельзя загружать несколько сайтов одновременно, только делать что-то другое т.к. обьект 1 и класс 1, дальше напишу как сделать так чтоюы можно было несколько сайтов загружать одновременно. И еще не знаю что делать если выключена библиотека с MSXML2.XMLHttp? П.С. Начал переводить главную статью готово на 10%
Пока только реальный способ только через ИЕ, даже вот
Скрытый текст
Цитата
InternetExplorer in Action In the above section, the code that instantiated IE waited for it to fully load a page (with the Do…Loop statement). This is because IE runs asynchronously with our VB code. There can be instances when we don’t want to wait for the page to complete loading. In fact, we can leverage both its asynchronous nature as well as the fact that IE is a standalone application designed to display webpages to a human. Consider a scenario where we want to respond to user action by displaying information from different web pages. For example, in an Excel worksheet with a column of stock symbols, as the user clicks in a different cell we want to show information about that stock. The code to show the information in an instance of InternetExplorer is below. It checks if it still has access to the asynchronously running IE. If not, it instantiates a new copy. In either case it uses InternetExplorer’s Navigate method to direct the browser to a specific web page.
Код
Option Explicit
Dim IEApp As InternetExplorer 'Need a reference to Microsoft Internet Controls
Sub AsyncIE(ByVal URL As String)
'URL contains the complete string to pass to IE, _
e.g., http://www.google.com/search?q=tushar+mehta
On Error Resume Next
IEApp.Navigate URL
If Err.Number <> 0 Then
Set IEApp = Nothing
Set IEApp = New InternetExplorer
IEApp.Visible = True 'Some things don't work unless it's visible
IEApp.Navigate URL
End If
If IEApp Is Nothing Then Exit Sub
End Sub
только что вспомнил, когда делал и искал таймер нашел асинхронный таймер на вба, который работал прекрасно! к Стати вот нашел ту статью на хабре http://habrahabr.ru/sandbox/67296/ (про таймер)
О Значит кто-то все-таки сталкивался и проверял, да ваш сайт вообще нечто - он меня и вдохновил и обучил за прошлый год и сейчас переодически смотрю обновления.
Цитата
Игорь пишет: (т.е. пока ответ сервера не получен, - другие команды макросов выполняться не будут, - т.к. VBA однопоточный) как вариант, - написать отдельный компонент (не на VBA)? подключить к проекту, - и через него работать с многопоточностью
Да об этом то и идет речь минимальная мысль это IE их можно много открывать и проверять загруженность страницы (но он долго грузит), далее средства cURL или чего-то подобного (сейчас уже пытаюсь реализовать проблема в передаче данных или через буфер или файлы) + ко всему у нас есть CMD, в котором что-то можно выделить, но опять-же не хотелось бы батник таскать с программой (нужно программно создавать) и т.д. Сейчас еще смотрю что можно сделать написав ADD IN для VBA по типу MZTOOLZ, какие там есть возможности. Как вариант думаю написать что-то на Delphi или C++.
Во вложении класс и пример работы с ним! Очень много времени трачу именно на загрузку страниц и т.д. сейчас активно читаю MSDN и забугорные форму и как это реализуется на других языках, cURL и т.д. ищу альтернативу особенно ИНДУССКОМУ IE (ой как они его любят же). В общем случае мы используем один из этих объектов и получаем ответы от сервера так:
Код
'Dim XMLHttp As Object: Set XMLHttp = CreateObject("Microsoft.XMLHTTP")
'Dim XMLHttp As Object: Set XMLHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
'Dim XMLHttp As Object: Set XMLHttp = CreateObject("MSXML2.ServerXMLHTTP")
'Dim XMLHttp As Object: Set XMLHttp = CreateObject("MSXML2.XMLHttp") '
'Dim XMLHttp As Object: Set XMLHttp = New WinHttpRequest
XMLHttp.Open "GET", "site.com", False 'OR "POST" type and True for redirect
'XMLHttp.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
'XMLHttp.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
'XMLHttp.SetRequestHeader "Cache-Control", "no-store, no-cache"
'XMLHttp.SetRequestHeader "Pragma", "no-cache"
'XMLHttp.Send StrConv("title=Title&cat=Cat&post=PostText&pas=tipapass", vbFromUnicode)
XMLHttp.Send '"title=Title&cat=Cat&post=PostText&pas=tipapass" << тут дольше всего висит
Debug.Print XMLHttp.ResponseText
Set XMLHttp = Nothing
Если кто сталкивался или знает XMLHttp.Send действительно отправляет и ждет ответа или может только отправить и не ждать или он и так только отправляет какие еще есть варианты?
По сути в общем смысле идея следующая: 1)сделать или массив или несколько объектов через рекурсию, любого из перечисленных выше или может даже IE 2)создали, отправили сайт на загрузку, проверили загрузился или нет 1 раз, если нет: 2.1)создали, отправили сайт на загрузку, проверили загрузился или нет ПЕРВЫЙ САЙТ, потом наш, если нет: 2.n)создали, отправили сайт на загрузку, проверили загрузился или нет ПЕРВЫЙ САЙТ, если да - забрали данные, убили обьект, проверили следующий, до n
Реально ли так сделать? - пока еще думаю на счет реализации и преимущества в скорости. Пока по сравнению всех выше перечисленных объектов WinHttp.WinHttpRequest.5.1 - работает дольше всех в 2.5 раза, но грузит все сайты (и китайские) с любого URL, у него есть TimeAut, если сильно долго грузится и т.д., в теории есть и
Если честно, всегда считал что поиск по массиву намного быстрее т.к. он весь в памяти, а не к листу обращаемся + там еще всегда нужно пути полные прописывать книга\лист и т.д., а массив он в памяти работай с ним (бери что хочешь, записуй что хочешь, он и динамичный может быть, едиственное что столбцы\строки наоборот местами, что не привычно по началу), потом освободи память, а тут таааакой прорыв - спасибо за пост!
Автоматизация приложений, разработка ботов, парсинг сайтов, поиск информации и многое другое на языках : Delphi, C++, VBA. Информация в профиле.
Столкнулся со следующей проблемой, хочу наконец сделать нормальное меню и таки интерфейс я сделал, а вот вызывать кнопкой на листе - не красиво, а пункотом в меню ячейки не практично, раньше делал вот так:
Код
Dim objCmdBrBtn As CommandBarButton
CommandBars("Cell").Reset
Set objCmdBrBtn = CommandBars("Cell").Controls.Add(msoControlButton, , , , True)
With objCmdBrBtn
.Caption = "Запуск обработки данных"
.DescriptionText = "Показывает форму настройки"
.enabled = True
.OnAction = "ShowFormFilter"
.TooltipText = "Запуск обработки данных"
.Visible = True
.FaceId = 2
End With
сейчас где-то в интернетах нашел другой способ, добавил, а убрать или поменять уже не могу
Код
Private Sub Workbook_Open()
Call ReadSettings
'Application.CommandBars.Reset
'Application.CommandBars("НАДСТРОЙКИ").Reset
With Application.CommandBars.Add(Name:="Menu", temporary:=True)
.Visible = True
With .Controls.Add
.OnAction = "showformsettings"
.Style = 2
.Caption = "Parser"
.FaceId = 25 ' - значок кнопки из стандартного набора офиса
End With
End With
End Sub
Как видно выше "пытался" найти как его сбросить или убрать по аналогии с первым вариантом, но все тщетно ... Хочу иметь свою кнопку в т.н. "ленте", где ее там разместить уже другой вопрос пусть хоть в надстройках, или в переименовать лучше конечно.
Автоматизация приложений, разработка ботов, парсинг сайтов, поиск информации и многое другое на языках : Delphi, C++, VBA. Информация в профиле.
Private FReg As Object
Public Function replacePunctuations(ByVal this As String) As String
If FReg Is Nothing Then
Set FReg = CreateObject("VBScript.RegExp")
FReg.IgnoreCase = True
FReg.Global = True: FReg.Pattern = "[^, \da-zёа-я]"
End If
replacePunctuations = FReg.Replace(this, "")
End Function
и исправил вот так:
Код
Public Function replacePunctuations(ByVal this As String) As String
Dim FReg As Object
If FReg Is Nothing Then
Set FReg = CreateObject("VBScript.RegExp")
FReg.IgnoreCase = True
FReg.Global = True: FReg.Pattern = "[^\da-z¸à-ÿ]"
End If
replacePunctuations = FReg.Replace(this, "*")
End Function
вроде-бы правильно работает
Автоматизация приложений, разработка ботов, парсинг сайтов, поиск информации и многое другое на языках : Delphi, C++, VBA. Информация в профиле.
Function Extract_Number_from_Text(sWord As String, Optional Metod As Integer)
'sWord = ссылка на ячейку или непосредственно текст
'Metod = 0 – числа
'Metod = 1 – текст
Dim sSymbol As String, sInsertWord As String
Dim i As Integer
If sWord = "" Then Extract_Number_from_Text = "Нет данных!": Exit Function
sInsertWord = ""
sSymbol = ""
For i = 1 To Len(sWord)
sSymbol = Mid(sWord, i, 1)
If Metod = 1 Then
If Not LCase(sSymbol) Like "*[0-9]*" Then
If (sSymbol = "," Or sSymbol = "." Or sSymbol = " ") And i > 1 Then
If Mid(sWord, i - 1, 1) Like "*[0-9]*" And Mid(sWord, i + 1, 1) Like "*[0-9]*" Then
sSymbol = ""
End If
End If
sInsertWord = sInsertWord & sSymbol
End If
Else
If LCase(sSymbol) Like "*[0-9.,;:-]*" Then
If LCase(sSymbol) Like "*[.,]*" And i > 1 Then
If Not Mid(sWord, i - 1, 1) Like "*[0-9]*" Or Not Mid(sWord, i + 1, 1) Like "*[0-9]*" Then
sSymbol = ""
End If
End If
sInsertWord = sInsertWord & sSymbol
End If
End If
Next i
Extract_Number_from_Text = sInsertWord
End Function
которая заменяет цифры и решил ее дописать: Но не знаю как написать, мне нужно заменить все символы (0-9~`!@#$%^&*()-_=+,./?\|{}[]<>;:""' ) и т.д. в ANCII это все символы с 0-64 и 91-96 и 123-126 ну и вроде-бы все как их указать в like я не знаю
Автоматизация приложений, разработка ботов, парсинг сайтов, поиск информации и многое другое на языках : Delphi, C++, VBA. Информация в профиле.
Спасибо, регулярно пользуюсь вашим сайтом и очень вам благодарен, особенно вашим готовым примером именно с его помощью сейчас отправляю запросы и получаю информацию. Сделал так: Все переписал, потом в точности все это дело отправил, но отправлял с помощью одно и того-же xmlhttp = CreateObject("WinHttp.WinHttpRequest.5.1" я его не пересоздавал, я просто переписал (данные которые отправляются), отправил логин (вроде получилось), потом переписал - xmlhttp.Open "POST", и PostData = "", а потом заново добавил туда данные ну и отправил еще раз уже на создание поста
'Set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP")
Set xmlhttp = CreateObject("WinHttp.WinHttpRequest.5.1")
вот что мне браузер возвращает
Цитата
Осторожно: Режим обслуживания активен! ОШИБКА: Cookies либо заблокированы, либо не поддерживаются вашим браузером. Чтобы использовать WordPress, нужно разрешить cookies.
пробую получить через
Код
Function GetHeader(sURL As String) As String
Dim oXHTTP As Object
Set oXHTTP = CreateObject("MSXML2.XMLHTTP")
oXHTTP.Open "HEAD", sURL, False
oXHTTP.send
GetHeader = oXHTTP.GetAllResponseHeaders()
Dim c As Range
End Function
начало я давно уже проложил, я написал макрос для того чтобы он залогинился и запомнил меня (ексель). А вот дальше с пост запросом не пошло и наработки ушли (не сохранил).
Сейчас попробовал ручками с помощью IE это делать, но опять-же столкнулся с проблемами, который возможно можно решить, но я не хочу т.е. ИЕ очень много памяти жрет и достаточно долго работает по сравнению с обычной отправкой запроса на сайт. Конкретно такие вопросы у меня: Как можно отправить запрос на сайт для создания поста и что для этого нужно, у меня снифер поймал следующие данные при отправке :
Нужно ли отправлять все эти данные? и как получить post_ID точнее как он его получает, если не только я могу посты создавать? Если кто сталкивался с подобным подскажите помогите!
К Стати у этого сайта база на МУСКУЛЕ, если кто знает как это сделать с его помощью возможно подскажите.
Я сейчас играюсь со значениями, может и получится сделать.
Код
Sub PostForPostWP()
'On Error Resume Next
Set xmlhttp = CreateObject("Microsoft.XMLHTTP")
xmlhttp.Open "POST", "http://nonator.com/wp-login.php", "True"
xmlhttp.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT" ' чтобы избежать кеширования
Dim POST() As Byte, PostData$
PostData = "log=test&pwd=test&rememberme=forever&wp-submit=%D0%92%D0%BE%D0%B9%D1%82%D0%B8&redirect_to=http%3A%2F%2Fnonator.com%2Fwp-admin%2F&testcookie=1"
' PostData = PostData & "log=test"
' PostData = PostData & "&pwd=test"
' PostData = PostData & "&rememberme=forever"
' PostData = PostData & "&wp-submit=Войти"
' 'PostData = PostData & "&redirect_to=http://nonator.com/wp-admin/post-new.php" 'post-new.php
' PostData = PostData & "&testcookie=1"
POST = StrConv(PostData, vbFromUnicode)
xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xmlhttp.send (POST): DoEvents
If xmlhttp.Status <> 200 Then Exit Sub
Debug.Print xmlhttp.responseText
Set xmlhttp = Nothing
End Sub
Ага разобрался Мне нужно включить кукки и как-то или где-то их хранить.
Dim t0 As Single
t0 = Timer
Do While Timer - t0 < 0.4
DoEvents
Loop
Ну и конечно то что выше написали вам, переведите просто все ваши формулы на макросы и все или сделайтеиз формул функции и используйте как формулу (менее рентабельно)
Да вариант, я этот уже и сам реализовал, подобно тому что вы дали, но меня это не совсем устраивает, хотя решает частично проблему. Ладно, пока пусть так будет.
да запросто во 1) добавь в цикл обработки - визуализацию процесса, любую (есть готовые варианты), для того чтобы видно было процент и процесс и можно было отменить, а не казалось что "зависло" 2)в процесс обработки добавь Паузы Wait`ы и подбери нужую задержку для уменьшения нагрузки 3)Посмотри темы про оптимизацию, уверен что очень много чего можно оптимизировать, не только отключая визуализациии всякие и рюшечки, к примеру все нужно переносить на оперативку и вычислять сначало в памяти, для этого создавай переменные и записуй сначало в них указатели, а лучше данные - потом производи с переменными уже все процессы, а потом приравняй таблицу к переменным. (надеюсь понятно изложил) И вуаля
П.С. Найди места самые трудоемкие - для этого есть в инете мого тоже разных процедур и функций и выведи эту часть на форум, а мы посмотрим.
Текущий вопрос - на форме, есть listbox в нем есть текст, который не помещается, попробовал вот так:
Код
Private Sub Inf_Click()
Inf.ControlTipText = CStr(Inf.List(Inf.ListIndex))
End Sub
да - хорошо, но выводиться только, если вывести за пределы и навести снова Поискал по нэту, принудительного выведения - нету, переноса строк - нету, даже событие нельзя отловить перед показом этого ControlTipText, чтобы его поменять перед показом, писал в процедуре движения мышки...
У меня на уме только поверх всего создавать временный Label с содержимым вместо этого ControlTipText. Кто сталкивался или знает ответ - подскажите.
В тему что-то подобное, интересное буду заносить!
Автоматизация приложений, разработка ботов, парсинг сайтов, поиск информации и многое другое на языках : Delphi, C++, VBA. Информация в профиле.
Не знаю что с этими таблицами делать, с одной вроде придумал - поделю ее пока по периодам ее (недели) и будет нормально, а вот что делать со второй там невозможно работать и фильтры разные пробовал создавать и менять столбцы\строки... Вся суть вопроса какой может быть вид у таблицы где есть 3+1 параметра (адрес, человек, действие + время) по которым можно было-бы удобно фильтрировать.
Спасибо Вам всем что помогаете мне уже не первый раз, видел тут пару тем где вы предлагали отличные преобразования таблиц в нормальный вид, может и мое посмотрите. В файле пример - таблица где мы "распространяем", честно думал очень долго как ее еще можно преобразовать, но ничего даже с использованием формы для поиска и фильтрации - очень не удобно.
Там где пример отчета - я думаю поделить на недели и на другие структуры уже начал работать с макросом, на сколько я понимаю нужно: поиск вдоль строки, если нашли объединеную область - то 1)создать новый лист, 2)первый столбик скопировать, 3) скопировать все столбики под выделенной областью и над. Это я вроде как умею, но не получается что-то определить объедененную область ее начало и конец, сейчас делю ее и заполняю одинаковыми значениями и ищу их.
Помогите с ошибкой поиска текста, иду от большего к меньшему, но почему-то выводит ошибку вместо текста, вроде-бы все учел уже...
Код
Function код(cell, cell2, cell3) As String
Dim ws2, buf As Range
Set ws2 = Sheets(2).Range("A:A")
'On Error Resume Next
'Set buf = ws2.Cells.Find(What:=cell.Value, LookIn:=xlFormulas, LookAt:=xlPart)
'Do While Not buf Is Nothing
'If (InStr(buf, cell2.Value) > 0) Or (InStr(buf, Left(cell3.Value, Len(cell3.Value) - 3)) > 0) Then
' код = buf.Offset(0, 2).Value
' exit do
'Else
' Set buf = ws2.Cells.Findnext(buf)
' код = "Не найдено"
'End If
'Wend
Set buf = ws2.Cells.Find(What:=cell.Value + "*" + cell2.Value + "*" + Left(cell3.Value, Len(cell3.Value) - 3), LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False)
If buf Is Nothing Then
Set buf = ws2.Cells.Find(What:=cell.Value + "*" + Left(cell3.Value, Len(cell3.Value) - 3) + "*" + cell2.Value, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False)
If buf Is Nothing Then
Set buf = ws2.Cells.Find(What:=cell.Value + "*" + cell2.Value, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False)
If buf Is Nothing Then
Set buf = ws2.Cells.Find(What:=cell.Value + "*" + Left(cell3.Value, Len(cell3.Value) - 3), LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False)
If buf Is Nothing Then
Set buf = ws2.Cells.Find(What:=cell.Value, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False)
End If
End If
End If
End If
'If Not buf Is Nothing Then
код = buf.Offset(0, 2).Value
' Else
' код = ws2.Cells.Find(What:=cell.Value, LookIn:=xlFormulas, _
' LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False).Offset(0, 2).Value
' End If
End Function
Автоматизация приложений, разработка ботов, парсинг сайтов, поиск информации и многое другое на языках : Delphi, C++, VBA. Информация в профиле.