Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Excel VBA (часть 3)

Автор: asbo
Дата сообщения: 29.07.2011 07:55
smirnvlad
Да не-е :) Хотелось бы на логическом уровне. А тут автоматизатор какой-то надо обучить будет. Я вот ужЕ библиотеку TLBInf32 прицепил. Похоже - то, что доктор прописал. Щаз буду пробывать.
Автор: asbo
Дата сообщения: 29.07.2011 10:52
smirnvlad
Ну вот. Есть первые результаты. Правда пока только с константами получилось, как с самыми простыми. [more=Код:]

Код:
Sub sb_ObjList() ' Need TlbInf32.dll or vstlbinf.dll
Dim tla As TLIApplication, tli As InterfaceInfo, tlb As TypeLibInfo, _
cst_enum As ConstantInfo, cst As MemberInfo ' As ConstantInfo ???; As MemberInfo ???
Dim tst As Object ' test object
Dim i As Byte

'' ' For non linked dll:
'' Set tla = CreateObject("Tli.TliApplication")
'' Set tli = tla.InterfaceInfoFromObject(fso)
'' Set tlb = tli.Parent

'Set tst = CreateObject("Scripting.FileSystemObject") ' External object
Set tst = New Image ' Internal object

Set tla = New TLIApplication
Set tli = tla.InterfaceInfoFromObject(tst)
Set tlb = tli.Parent

For Each cst_enum In tlb.Constants
If Left(cst_enum.Name, 1) <> "_" Then
Debug.Print vbLf & "' *** "; cst_enum.Name
For Each cst In cst_enum.Members
i = i + 1
Select Case i < 201
Case True: Debug.Print cst.Name & " = " & cst.Value
Case False: i = 0: Stop ' screen is full
End Select
Next
End If
Next
Stop
End Sub
Автор: andrewkard1980
Дата сообщения: 30.07.2011 13:04
Добрый день.
Не получается распечать web страницу, читал на MS что это из-за безопасности. Может как-то возможно сделать? Необходимо распечатать 10-20 web страниц по ссылкам, я с циклом разберусь - лишь бы сам процесс печати настроить.
Спасибо.
Вот код:

Код:
Sub IE()
Dim oApp As SHDocVw.InternetExplorer
'SHDocVw.dll (Microsoft.internet.control)

Set oApp = CreateObject("InternetExplorer.Application")
Set oApp = New SHDocVw.InternetExplorer

With oApp
.Navigate "http://www.msoffice.nm.ru"
.Visible = True
.ExecWB OLECMDID_PRINT
End With

End Sub
Автор: asbo
Дата сообщения: 30.07.2011 13:50

Цитата:
Не получается распечать web страницу

Блин... Ось какая? Под адином или юзером? Принтер сетевой или локальный? Недурно бы и обсказать - что именно не получается, где возникает ошибка. А если читал что-то, то и ссылку дать. Глядишь, кто и поможет...
Автор: andrewkard1980
Дата сообщения: 30.07.2011 14:55
WinXp, админ, сейчас виртуальный.
Исправленный код:


Код:
Sub IE()
Dim oApp As SHDocVw.InternetExplorer
Dim sURL$

'SHDocVw.dll (Microsoft.internet.control)

For i = 2 To 21
sURL = Worksheets("Ввод").Cells(i, 10).Value

If InStr(1, sURL, "http") = 0 Then Exit Sub

Set oApp = CreateObject("InternetExplorer.Application")
Set oApp = New SHDocVw.InternetExplorer

oApp.Navigate sURL
oApp.Visible = true
While oApp.Busy
DoEvents
Wend

oApp.ExecWB OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER

Next i

End Sub
Автор: Andrey32
Дата сообщения: 30.07.2011 21:51
Здравствуйте. Нужно решить проблему с красным уголком в примечаниях, Excell 2007. Хочется, чтобы их не было, портят вид. Возможно ли это сделать в коде VBA?
Добавляю примечания с помощью .AddComment
Автор: asbo
Дата сообщения: 30.07.2011 22:21
Andrey32
По памяти - что-то типа DisplayComment(s) или ShowComment(s), нет Екселя под руками. Поищи в браузере по Comment. Но это глобальная настройка Excel. Отдельно у примесания вроде не регулируется.
Автор: asbo
Дата сообщения: 31.07.2011 07:09
andrewkard1980
У меня - Win2003, Office 2003 SP3, IE8, Maxthon 1.6.7) не воспроизводится. Все печатает на локальные принтеры - физические и виртуальные.

По коду, имо, надо после отсылки на печать поставить или таймер, или ручной останов и
уточнить проверку на: Left(sStr, 7) = "http://"
Автор: andrewkard1980
Дата сообщения: 31.07.2011 07:59
asbo
не понял по твоему комментарию:

Цитата:
У меня - Win2003, Office 2003 SP3, IE8, Maxthon 1.6.7) не воспроизводится

не работает?

А дальше ты пишешь:

Цитата:
Все печатает на локальные принтеры - физические и виртуальные.


Таймер я тоже думал поставить - но код даже 1 ссылку не печатает. Хотя один раз сработал - вот я и думаю, почему?



Добавлено:
После установки таймера перед отсылкой на принтер, код заработал, я так понимаю, не работает задержка doEvents?
В идеале надо бы после распечатки закрывать окно IE, потому что их будет около 20... Завтра попробую с реальным принтером.

Автор: asbo
Дата сообщения: 31.07.2011 08:57
andrewkard1980
не воспроизводится == ошибка не воспроизводится
Сорри :)

DoEvents - не задержка, а передача управления операционке для справления других нужд. В данном случае - во время цикла ожидания отработки браузера, который может оказаться длительным.

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

Закрывать открытые страницы (окна) будет весьма полезно, если есть такие механизмы. Я не изучал.
Автор: asbo
Дата сообщения: 31.07.2011 11:03
Что-то не могу сообразить... Помогите окультурить. Разница только в жирном раз и два. Другими словами - как выразить жирное через pDesc, чтобы сокраитить запись:

Код:
Select Case pDesc
Case True
Do
Do: i = i + 1: Loop Until pArr(i) <= vVal ' Not pArr(i) > vVal ' раз <=
Do: j = j - 1: Loop Until j = lLeftNdx Or pArr(j) >= vVal ' два >=
vTmp = pArr(i)
pArr(i) = pArr(j)
pArr(j) = vTmp
Loop Until j <= i
Case False
Do
Do: i = i + 1: Loop Until pArr(i) >= vVal ' Not pArr(i) < vVal ' раз >=
Do: j = j - 1: Loop Until j = lLeftNdx Or pArr(j) <= vVal ' два <=
vTmp = pArr(i)
pArr(i) = pArr(j)
pArr(j) = vTmp
Loop Until j <= i
End Select
Автор: Niiks
Дата сообщения: 31.07.2011 11:39
Есть обычная таблица, в которую цифровые значения вводи оператор.
После заполнения таблицы и вычисления среднего значения excel-ом, оператору нужно мышью закрасить все заполненные ячейки, нажать delete, и опять курсор мышью поставить на начало таблицы для ввода новых данных.
Что создает неудобство в работе и отнимает немало времени в сумме рабочего дня.
Вопрос: нельзя ли операцию (подчёркнуто в вопросе) выполнить одной кнопкой?
Т.е. заполнилась таблица -нажал одну клавишу и все заполненные данные очищены и курсор снова в начале таблицы.
Автор: andrewkard1980
Дата сообщения: 31.07.2011 12:45
asbo


Цитата:
DoEvents - не задержка, а передача управления операционке для справления других нужд. В данном случае - во время цикла ожидания отработки браузера, который может оказаться длительным.

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

Код:
While oApp.Busy
DoEvents
Wend
Application.Wait Now + TimeValue("0:00:05")
oApp.ExecWB OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER
Автор: Niiks
Дата сообщения: 31.07.2011 13:06

Цитата:
Niiks
запишите макрос и назначьте его выполнение на комбинацию клавиш.
И все.

andrewkard1980, я не умею. Может кто-то помочь?
Или это достаточно сложно

Автор: asbo
Дата сообщения: 31.07.2011 13:40
andrewkard1980
Цитата:
я так понимаю, не работает задержка doEvents?
Цитата: DoEvents - не задержка
Цитата: должно по идее ожидать полной загрузки страницы и только потом отсылать на печать
Автор: dneprcomp
Дата сообщения: 31.07.2011 20:04
andrewkard1980

Попробуйте вместо таймера. DoEvents оставьте для возможности останова цикла, если зависнет.
Do While oApp.Busy Or oApp.ReadyState <> READYSTATE_COMPLETE

Automating Internet Explorer
Автор: logvinnnnnnnn
Дата сообщения: 01.08.2011 10:07
Вопрос по VBA но не совсем по Excel.
Пишу макросы на VBA для MS Project и столкнулся с такой проблемой.
Когда макросами открываю много файлов и потом закрываю, мне кажется, что они остаются объектами в памяти.
Внешне это выглядит так: макрос доходит до открытия файла и выдает ошибку "невозможно открыть файл". Вручную файл тоже не открывается
но если закрыть все проекты MS Project, включая пул ресурсов (полностью завершить все сервисы MS Project), то все открывается без проблем.

Подскажите, с чем это может быть связано и как это можно лечить
Заранее спасибо!
Автор: aidomars
Дата сообщения: 01.08.2011 10:21
logvinnnnnnnn
У меня тоже бывает такое, хотя открываю не макросом, а вручную. На 8-10 файле ошибка "невозможно открыть файл". Думаю дело в формулах, или памяти не хватает. Попробуй отключить автопересчет формул.
Автор: asbo
Дата сообщения: 01.08.2011 10:24
logvinnnnnnnn
Если объект поддерживает закрытие (освобождение) открытого им же файла - надо пользоваться этим механизмом. Если он не работает - уничтожать или закрывать сам объект. Не полагаться на неявное закрытие (уничтожение), прописать и проверить область видимости объектов.
Автор: andrewkard1980
Дата сообщения: 01.08.2011 22:07
dneprcomp
Спасибо за подсказку. Так вроде лучше.

Niiks
Не сложно. Набераете в Яндекс строку поиска:
запись макроса Excel
Получите подробную инструкцию.
После пробы отпишитесь.
Спасибо.

Добавлено:
asbo
Благодарствую. Попробую, что оно скажет
Автор: grooogler
Дата сообщения: 01.08.2011 23:03
очень нужен один макрос.

Офис 2007 (База.xlsx)
В ней около 12 Листов, названия листов произвольные. (в каждом листе заполнено около 1000 строк)
В принципе задача такая - Найти повторения значений ячеек в столбцах 'B' всех листов.

Как нужно чтоб всё было - Открываем нужный лист, например List10, выделяем ячейки в столбце 'B'. Запускаем макрос, он пробегается по всем другим листам ища совпадения в столбцах B. Если какая-то ячейка в нашем List10 в столбце B совпадает с ячейкой например в листе List20 (тоже в столбце B), то эту ячейку в List10 мы выделяем красным цветом. Всё.
Автор: logvinnnnnnnn
Дата сообщения: 02.08.2011 07:16
asbo
А что значит "прописать и проверить область видимости объекта" ?
где почитать можно про это не подскажешь?
Автор: asbo
Дата сообщения: 02.08.2011 07:54
logvinnnnnnnn, :)

Цитата:
Не полагаться на неявное закрытие (уничтожение), прописать ...

Процедуру закрытия прописать:
Set Object is Nothing или Object.Close

и, дополнительно к этому,

Цитата:
... и проверить область видимости объектов

Это азы. Погугли на тему область видимости и время жизни переменных.
Ну, к примеру, если объект объявлен на уровне модуля, а используется только в одной процедуре, то именно в ней и надо его объявлять. Тогда, после окончания ее выполнения он уничтожится автоматически (если не статик).
Автор: logvinnnnnnnn
Дата сообщения: 02.08.2011 12:18
asbo
Спасибо. почитаю



А еще, не нашел на форуме. Подскажите, как будет выглядеть код обработчика ошибок, который считывает формулировку ошибки, записывает ее в error.log и продолжает выполнение кода как по Resume Next

Заранее спасибо!
Автор: asbo
Дата сообщения: 02.08.2011 13:16
logvinnnnnnnn

Цитата:
как будет выглядеть код обработчика ошибок

Это целая философия - обработка ошибок. Тут в каждой избушке свои погремушки.
Есть объект Err и его свойства Number и Description. Вот маленький [more=пример:]

Код:
Private Sub sb_ErrTest()
Dim lErrUsr&
On Error GoTo Err

Err.Raise 713

lErrUsr = 4545
Err.Raise vbObjectError + lErrUsr

'Err.Raise vbObjectError + lErrUsr, "Source", "Desc"

Exit Sub
Err:
Dim lErr&, sErr$
With Err
lErr = .Number
sErr = .Description
End With
Debug.Print lErr & " - " & sErr
Select Case Err
Case 1
MsgBox "The error occures: " & vbLf & lErr & vbLf & sErr & vbLf
Case 713
Call sb_LogErr(lErr)
Resume
Case vbObjectError + lErrUsr
Debug.Print lErrUsr
Resume Next
Case Else
Stop
End Select
'Resume
End Sub
Автор: asbo
Дата сообщения: 03.08.2011 15:51
Блин... Полдня ковырялся, чтобы организовать грамотный диалог сохранения-открытия файлов через Application.FileDialog. Все окультурил, смежные модули подогнал под общую идеологию. В результате выясняется, что тип диалога msoFileDialogSaveAs не позволяет ни добавить собственный фильтр, ни удалить пресеты. Получилось, что этот тип диалога заточен чисто под Ексель. В хэлпе про это ни слова я не увидел. А тесты я начал с msoFileDialogFilePicker. С ним все ОК.

Пришлось возвращаться к GetSaveAsFilename и GetOpenFilename, млин. А они и значения по-другому возвращают, и инициализируются по-разному. И, вообще, это две функции, а не одна. Все переписывать... Может я чего-то недопер?

Бзв, ап.
Автор: smirnvlad
Дата сообщения: 03.08.2011 17:07
asbo

Цитата:
Может я чего-то недопер?

нет, все Dialogs предопределены, так что "возвращаться к GetSaveAsFilename и GetOpenFilename"


Цитата:
как выразить жирное через pDesc, чтобы сокраитить запись

IIF ?


Цитата:
Жирное в коде не показывается

или разницы на выделенных знаках нет

Код: Until iif(pDesc = True, pArr(i) <= vVal, pArr(i) >= vVal)
Until j = lLeftNdx Or iif(pDesc = True, pArr(j) >= vVal, pArr(j) <= vVal)
Автор: asbo
Дата сообщения: 03.08.2011 17:23
smirnvlad

Цитата:
нет, все Dialogs предопределены
Что ж... Смирюсь.
Но, все равно странно, почему в одном режиме он позволяет это делать, а в другом нет... Ворд, значит, будет только ворд сохранять, а Акс только себя?


Цитата:
IIF ?
УжЕ что-то. В записи однозначно выигрыш будет, но и вычислений чуть больше в каждом цикле. Но здесь это не критично.

Спасибо большое.
Автор: Niiks
Дата сообщения: 03.08.2011 21:52
Воможно ли в excel-е составить программу что-бы были отобраны наиболее часто повторяющихся 6 чисел в лото 6 из 48. И также наиболее редко появляющиеся чмсла.
( по результатам предыдущих тиражей за год)
Это реально?
Сложно?
Автор: asbo
Дата сообщения: 03.08.2011 22:10
Niiks
Для начала работы - тут и программа не нужна. Статистических функций для начинающего - умотаться. Потом, может быть, когда разные "изящные" выборки делать.
А потом, что там считать - 53 недели в году. 300 чисел. А если по номерам смотреть, так и еще меньше. Выборка получится нерепрезентативной. Тетрадный листок. В клетку :)
И еще. Гиблое это дело. От того, что монета 9 раз упала орлом, вероятность 10-го выпадания ее решкой не увеличивается :) Как была 1/2, так и остается.
Не хочу обнадеживать, но, имо, если в Сети поискать - можно развернутую статистику за года найти. Ужаленых-то полно...

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

Предыдущая тема: VS 2010


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.