Hugo, спасибо, точно! но похоже что проблема была не в этом помогите пожалуйста ещё понять что заставляет отображаться все миллион строк и как их удалить?
получил от коллег для возможного ремонта эксель файл. В файле перестали нажиматься кнопки макросов. Визуально то пропадали то появлялись. При нажатии вели себя как будто в режиме конструктора, а если нажимались то не отжимались. Также на листе правая полоса прокрутки прокручивалась до последней возможной строки (миллион с чем-то). Удаление пустых строк с переоткрытием файла не помогало от них избавиться. Методом исключения начал искать проблему. Поудалял все макросы, все объекты с листа, обычные и условные форматирования, данные ячеек, связи. Даже пересохранил в другой формат (был xlsm). В итоге остался пустой файл с одним листом и максимальным количеством строк. И вот после удаления первого столбца получился лист в котором 1963 строки. Впервые в жизни такое вижу. Другие листы создаются нормальными. Подскажите что его заставляет быть таким и как вернуть лист в норму? Понимание необходимо для ремонта изначального файла (там много всего на листе и переносить вручную на вновь созданный лист затруднительно)
buchlotnik искренне спасибо Вам за то что вникли в вопрос. простите за резковатый ответ. согласен что не очень корректно изначально сформулировал вопрос, но если бы описал реальный пример, то вообще запутался бы в объяснении. понял что универсального подхода нет. пошёл изучать ЛИНЕЙН(). ещё раз спасибо
есть 4 числа. Какие-то математические действия с первыми 3 из них приводят к получению 4го числа. 1е и 2е число во всех наборах одинаковые, а 3е меняется. есть несколько таких наборов по 4 числа и в каждом из них одинаковая, неизвестная мне зависимость. есть ли способ с помощью экселя, имея большое количество таких наборов, определить эту зависимость?
в файле примера в каждом столбце первые 3 числа (зелёные ячейки), 4е число - жёлтые ячейки.
метод открытия сайта в хроме - CreateObject("WScript.Shell").Run "адрес_сайта" работает с сайтами и не работает с адресом "chrome://settings/cookies/detail?site=адрес_сайта" буду очень признателен если подскажете как средствами VBA открыть такого вида адрес
по пути C:\Users\имя_пользователя\AppData\Local\Microsoft\Windows\INetCookies у меня нет куков. там только лежит файл "deprecated.cookie" весом 1 кб датированный концом прошлого года в котором одна запись - "Cookies are no longer stored in files. Please use Internet*Cookie* APIs to access cookies."
актуальные куки у меня лежат по пути C:\Users\имя_пользователя\AppData\Local\Google\Chrome\username\Default\ там файл без расширения "Cookies"
подставляю его в вашу функцию. содержимое считывается но на этапе разделения a = Split(sContent, vbLf & "*" & vbLf) массив не набивается. не видит он такого разделителя.
во вложении кусок файла с нужной мне кукой "session" в непонятной мне кодировке. Есть ли возможность перевести её на человеческий язык (средствами VBA)?
подскажите возможно ли получить значение куки из уже залогиненного в хроме сайта?
авторизоваться силами vba не вариант, т.к. происходит через госуслуги, очень заморочено. По итогу авторизации выдаётся токен. его значение можно легко увидеть по ссылке вида chrome://settings/cookies/detail?site=адрес_сайта. Можно было бы спарсить открывающуюся по этой ссылке страницу, но я не знаю как её открыть средствами VBA. с помощью WinHttp.WinHttpRequest.5.1 не получается. не получается открыть и таким образом - CreateObject("WScript.Shell").Run "chrome://settings/cookies/detail?site=адрес_сайта" можно было бы вытащить эту куку из файла с куками расположенного по C:\Users\username\AppData\Local\Google\Chrome\username\Default\cookies, но там всё толи зашифровано, толи я с кодировкой разобраться не могу. в общем тоже не получается.
getAllResponseHeaders() не помогает, т.к. нет залогинивания, да и в респонсе нет куков. они только в реквесте
тут текст файла diplom.pdf ------WebKitFormBoundaryOtMjnxAQ1j0yc83f Content-Disposition: form-data; name="education-0-document"; filename="tk.pdf" Content-Type: application/pdf
тут текст файла tk.pdf ------WebKitFormBoundaryOtMjnxAQ1j0yc83f Content-Disposition: form-data; name="json"
тут строка json ------WebKitFormBoundaryOtMjnxAQ1j0yc83f--
с заголовками вроде бы тоже всё понятно. другие запросы на этот сервер, состоящие только из json, отправляются нормально может я сначала неправильно сформулировал вопрос. Я решил что пдф файл разложенный на текст и есть "бинарный вид файла", текст которого мне нужно вставить в запрос
если важно - ответ сервера в норме такой - "data:Object { status: "success", errors: [] }"
честно говоря, получается что эксель файла-то и нет. я пытаюсь с помощью VBA отправить POST запрос с прикреплённым pdf файлом.
я преобразовываю файл в текст функцией указанной в моём первом посте. Открываю в блокноте, вижу то что на скриншоте. Смотрю в браузере, когда делаю запрос средствами браузера, и вижу похожее, но немного другое (на втором скриншоте) Думаю проблема в кодировке. Вычитал что для post запроса файл нужно конвертировать в base64, нашёл необходимую функцию, файл конвертируется в впечатляющий массив латинских букв и цифр, но такой запрос тоже не проходит
подскажите как пребразовать пдф в такой же текст, как в браузере?
для отправки файла с помощью post запроса перевожу его в текстовый вид функцией:
Код
Private Function File_Reader(ByVal file_path As String)
With CreateObject("ADODB.Stream")
.Charset = "utf-8"
.Open
.LoadFromFile (file_path)
File_Reader = .ReadText()
End With
End Function
sub отправить_почту()
sUsername = "test@gmail.com" ' Учетная запись на сервере
sPass = "YCxAHX71" ' Пароль к почтовому аккаунту
sSubject = "тема письма"
sTo = "test1@gmail.com"
sFrom = "test@gmail.com"
sBody = "Здравствуйте"
sAttachment = ""
BCC = "test2@gmail.com"
SMTPServer = "smtp.gmail.com"
Call отправка_email(SMTPServer, sUsername, sPass, sTo, sFrom, sSubject, sBody, vFolders, BCC)
end sub
Sub отправка_email(SMTPServer, sUsername, sPass, sTo, sFrom, sSubject, sBody, sAttachment, Optional BCC)'отправляем почту
'======================
If sSubject = "" Then Exit Sub
If sTo = "" Then Exit Sub
sTo = WorksheetFunction.Trim(sTo)
Const CDO_Cnf = "http://schemas.microsoft.com/cdo/configuration/"
Dim oCDOCnf As Object, oCDOMsg As Object
' Dim SMTPserver As String, sUsername As String, sPass As String, sMsg As String
' Dim sTo As String, sFrom As String, sSubject As String, sBody As String, sAttachment As String
' On Error Resume Next
'sFrom - как правило совпадает с sUsername
If Len(SMTPServer) = 0 Then MsgBox "Не указан SMTP сервер", vbInformation, "www.Excel-VBA.ru": Exit Sub
If Len(sUsername) = 0 Then MsgBox "Не указана учетная запись", vbInformation, "www.Excel-VBA.ru": Exit Sub
If Len(sPass) = 0 Then MsgBox "Не указан пароль", vbInformation, "www.Excel-VBA.ru": Exit Sub
'Проверка наличия файла по указанному пути
' If Dir(sAttachment, vbDirectory) = "" Then sAttachment = ""
'Назначаем конфигурацию CDO
Set oCDOCnf = CreateObject("CDO.Configuration")
With oCDOCnf.Fields
.Item(CDO_Cnf & "sendusing") = 2
.Item(CDO_Cnf & "smtpauthenticate") = 1
.Item(CDO_Cnf & "smtpserver") = SMTPServer
'если необходимо указать SSL
.Item(CDO_Cnf & "smtpserverport") = 465 'для Яндекса и Gmail 465
.Item(CDO_Cnf & "smtpusessl") = True
'=====================================
.Item(CDO_Cnf & "sendusername") = sUsername
.Item(CDO_Cnf & "sendpassword") = sPass
.Update
End With
'Создаем сообщение
Set oCDOMsg = CreateObject("CDO.Message")
With oCDOMsg
Set .Configuration = oCDOCnf
.BodyPart.Charset = "Windows-1251"
.From = sFrom
.To = sTo
.BCC = BCC
.Subject = sSubject
.TextBody = sBody
If IsArray(sAttachment) Then
For n = 0 To UBound(sAttachment)
.AddAttachment sAttachment(n)
Next
ElseIf Len(sAttachment) > 0 Then
.AddAttachment sAttachment
End If
' If Len(sAttachment) > 0 Then .AddAttachment sAttachment
'On Error Resume Next
.Send
End With
Debug.Print Err.Number
' MsgBox Err.Number
' Select Case Err.Number
' Case -2147220973: sMsg = "Нет доступа к Интернет"
' Case -2147220975: sMsg = "Отказ сервера SMTP"
' Case 0: sMsg = "Письмо отправлено"
' Case Else: sMsg = "Ошибка номер: " & Err.Number & vbNewLine & "Описание ошибки: " & Err.Description
' End Select
On Error GoTo 0
' MsgBox sMsg, vbInformation
Set oCDOMsg = Nothing: Set oCDOCnf = Nothing
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.DisplayAlerts = True
ActiveSheet.EnableCalculation = True
Application.ScreenUpdating = True
End Sub
после его срабатывания эксель начинает вести себя странно - экран как будто заморожен - кликаешь на ячейку - ничего не происходит (даже не выделяется). делаешь двойной (или даже тройной) клик - ячейка становится редактируемся, вводишь данные, нажимаешь энтер - визуально данные не обновляются. помогает перещёлкивание листов с одного на другой.
также, например, на выбрать мышкой цвет заливки - выпадающее окно с разными цветами появляется, но ничего не выбрать мышкой. Однако tab-ом выбрать удаётся. с остальными меню примерно такая же история. в общем всё вроде работает но очень мучительно. помогает только закрытие файла и повторное открытие. как вы видите я уже добавил в конец макроса всё что знал про то, что может отключать нормальную работу экселя, но это не помогло.
также при сохранении файла появляется окно "файл сохраняется" и само больше не исчезает. Заставить его исчезнуть можно только нажав "отмена". Файл при этом на самом деле сохраняется, но ощущение неопределённости очень неприятное)
в интернетах нашёл человека с такой же проблемой вот тут и он её решил исключением из кода msgbox. Мне это не помогло
я думал что без обновления связей файл будет быстрее открываться, но сейчас сравнил варианты Workbooks.Open с UpdateLinks:=0 и GetObject - никакой разницы (
у меня есть формула, которая с помощью суммпроизв сравнивает значения массивов (столбцов). для каждого массива задано своё условие. в предпоследнем действии расчёта получаются 3 массива в последнем действии они перемножаются и складываются. Мне же нужно их только перемножить, получив массив из 3х значений {20;0;21}, и последним действием мне нужно получить максимальное значение из этих трёх (21)
похоже что я не к месту использую суммпроизв и нужно использовать какую-то другую функцию.
Sanja написал: Записать формулу массива с листа в код VBA напрямую, именно как формулу, не получится.
это и есть ответ на мой вопрос. если я буду пытаться сделать это по-другому (через открытие книги например) и у меня не будет это получаться и я не найду ответа на форме, то я создам новую тему с тем вопросом который у меня возникнет.
я читаю. пытаюсь разобраться. просто вроде как не отвечать на Ваши вопросы - некрасиво. а отвечаю - считаете что я сижу ничего не делаю и только f5 жму. я уже решил проблему (временно). формула рассчитывается в другом файле и результат извлекается из ячейки (их закрытого файла) с помощью ExecuteExcel4Macro.
по WorksheetFunction - я не смог разобраться как переписать мою формулу функциями vba. не хватает мне ума.
я возможно (абсолютно точно) иду к решению многих задач очень не рационально. но я дохожу до решения, получая рабочий инструмент который экономит много времени. мне практически безразлично то, что он затрачивает в 1млн раз больше ресурсов и время выполнения занимает не одну наносекунду, а одну секунду. главное что работает и удовлетворяет МОИМ потребностям а не потребностям тех кто будет смотреть как написан код и сокрушённо взмахивать руками.
при этом я крайне благодарен этому форуму. без него ничего бы небыло. но блин - очень раздражают уточняющие вопросы которые предлагают не решение проблемы, а сомневаются в наличии вопроса.
при всём огромном уважении ко всем кто отвечает - я не прошу Вас сейчас помогать мне решать прикладную задачу, предлагать оптимальные алгоритмы её решений и убеждать меня в том что я делаю что-то не рационально и не оптимально. я прошу Вас ответить ровно на тот вопрос который я задал.