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

» Excel VBA (часть 3)

Автор: aleksey0
Дата сообщения: 18.03.2010 16:19
так, хорошо, обьясните мне на пальцах КАК эту хрень сделать. Я налекциях по информатике занимался чем угодно кроме информатики, так как ненавижу все эти офисные гадости, а сейчас пожинаю, так сказать, плоды -_-
Автор: ZlydenGL
Дата сообщения: 18.03.2010 16:42
aleksey0, открываешь MS Excel, в любой ячейке вводишь:

Код: =SumIf(
Автор: aleksey0
Дата сообщения: 19.03.2010 08:26
спасибо
Автор: Andrew_Us
Дата сообщения: 19.03.2010 12:13
Добрый день.
Очень нужна информация для решения проблемы с инициализацией (референсом) компонента Spreedsheet размещенного на пользовательской форме.
Я впервые использовал данный компонент, положил его на пользовательской форме проекта, подключил к SQL-базе и всё было хорошо, но после запуска этого проекта на чужом (пользовательском) компьютере узнал, что просто так он не заработает: при открытии файла получаю ошибку "Could not load an object because it is not available on this machine". Начал искать информацию в Сети, нашел пост http://forum.ru-board.com/topic.cgi?forum=33&topic=8273&start=3840, советы данные там были неполными и решения не имели. Что сможете посоветовать, как заставить мой проект работать на другой машине? Спасибо.

P.S. Применение именно Spreedsheet необходимо.
Автор: Justice
Дата сообщения: 19.03.2010 13:02
Господа (и дамы),
а есть ли такой макрос, который заменяет команды Excel на английском языке на их русские аналоги?
Автор: Maximus777
Дата сообщения: 19.03.2010 20:29
Andrew_Us, если я правильно понял, то на компах разные Офисы установлены? Иначе всё должно пахать. Чтобы сказать точно, надо моделировать именно ту среду, в которой вы пытаетесь это сделать. А так, на вскидку, можно лишь совет дать, попробовать добавить библу, которая лежит (при Офисе 2003) по адресу:
C:\Program Files\Common Files\Microsoft Shared\Web Components\11\OWC11.DLL
Может даже вместе с путями. И плюс ключ реестра:
GUID а в ветке реестра HKEY_CLASSES_ROOT\CLSID\
SpreadSheet11:
{0002E559-0000-0000-C000-000000000046}
Автор: Hugo121
Дата сообщения: 21.03.2010 13:53
Valentino10
Если изначально выгрузка производится в текст (как очень часто бывает), то можно из этого файла легко выбрать скриптом wsh строки, где содержится искомый город (во всей строке или в определённом месте строки). И нет ограничения на количество строк (как до 2003 Экселя). Скрипт простой, писал десяток вариантов под разные задачи, если интересно - посмотрю на работе, сейчас писать заново лениво... да может и не надо уже...
Автор: Andrew_Us
Дата сообщения: 21.03.2010 23:31
Maximus777
Компы разные, но Офис везде 2003 Standard. Проблема в следующем: из-за наличия на пользовательской форме (появляется по клику на кнопке) компонента Spreedsheet другой комп начинает ругаться что этого у него нет и загрузить эту форму со SpreedSheet он не может. Если в Excel вызвать режим VBA и добавить на тулбокс-панель компонент Spreedsheet из библиотеки Microsoft Office Web Component v11.0 (вы правильно говорили, это - OWC11.exe) и закрыть ошибочно отработанный ныне открытый проект, а потом снова его загрузить и нажать кнопку для открытия формы со Spreedsheet, то всё равно появится ошибка и ... пустая форма, без Spreedsheet. Если теперь взять и заново (как когда-то при проектировании) га эту форму снова положить Spreedsheet, то сохранив проект и открыв его снова можно радоваться - ошибки больше нет, впрочем как и всех нюансов и настроек, которые были у той первой Spreedsheet. Код макросов начинает сыпаться и трещать: то лист Spreedsheet не так называется, то еще что-то в таком духе, а производить все эти настройки заново, да еще не на одном, а на нескольких компах! - сами понимаете занятие малопривлекательное. Пробовал я в Private Sub Workbook_Open вставлять строчки кода для прописывания референса как это делал Drazhar (см. http://forum.ru-board.com/topic.cgi?forum=33&topic=8273&start=3840), но максимум чего я добился (тут еще знание синтаксиса хромает) это то что теперь при открытии формы на другом компе мне сообщается что данная библиотека (или ссылка, точно не запомнил) является какой-то битой. Смотрю в референсах (Tools ->Referens..) - там в списках задействованных библиотек появилась строчка "MISSING:Microsoft Office Web Component v11.0". Если здесь в Referens нажать кнопку "Обзор" и вручную указать путь к OWC11.exe, то слово MISSING исчезает и выглядит Referens хорошо, безошибочно, но проект всё равно не работает. Т.е. видимо мой путь верен, но чего-то не хватает. Я писал так:

Private Sub Workbook_Open()
Dim id As Object
Dim bibldir As String
bibldir = "C:\Program Files\Common Files\Microsoft Shared\Web Components\11\OWC11.DLL"
Set id = VBProject.References.AddFromFile(bibldir)

Буду очень признателен если совет будет оформлен в виде кода, т.е. в виде синтаксически правильно написанных команд. Еще раз спасибо за то что откликнулись.Очень рассчитываю на помощь опытных VBA-программистов.
P.S. Выше вы писали совет про реестр и GUID, но как это делается программно - напишите, пожалуйста - буду пробовать.
Автор: Hugo121
Дата сообщения: 22.03.2010 09:37
Valentino10
Передумал - это макрос VBA.
Может пригодится, можно диалог ввода города навесить:


Код: Option Explicit

Sub CopyFromFile2File()

Dim strValue$
Dim t As Single

t = Timer
Open "c:\input.txt" For Input As #1
Open "c:\output.txt" For Output As #2

While Not EOF(1)
Input #1, strValue
If InStr(strValue, "MOSCOW") Then
Print #2, strValue
End If
Wend

Close #1
Close #2
MsgBox "Ready in " & Timer - t

End Sub
Автор: vaulin
Дата сообщения: 23.03.2010 09:57
Здравствуйте! я только начинаю программировать в VBA Excel. Меня интересует простая задачка -- нарисовать на форме линию (в крайнем случае -- на листе). Замучился уже искать в нете ответ на этот вопрос. Подскажите, пожалуйста, если не сложно, хотя бы где искать.
Заранее спасибо!
Автор: vlth
Дата сообщения: 23.03.2010 10:07
vaulin, не надо мучиться: включив макрорекордер , узнаете, как выглядит код создания линии на листе.
С рисованием на форме сложнее: нужен контрол, поддерживающий такую возможность. Среди стандартных в VBA (Label, TextBox, List, ComboBox и др.) такого нет.

Автор: vaulin
Дата сообщения: 23.03.2010 10:11
vlth

Цитата:
vaulin, не надо мучиться: включив макрорекордер , узнаете, как выглядит код создания линии на листе.

Кажется, я так уже пробовал, но что-то не получилось (у меня office 2007). Я делал следующим образом: на панели Разработчик нажал Запись макроса. Потом дал ему название. Далее на панели Вставка в Иллюстрации выбрал Фигуры - линия. Нарисовал линию. Остановил запись. Открыл код, но там было пусто
Что-то не так?
Спасибо за ответ!
Автор: vlth
Дата сообщения: 23.03.2010 10:55
vaulin, всё вроде так... про 2007 не могу сказать наверняка, в чём дело ( у меня 2003)
Вот что даёт запись макроса (прямая линия):

Код: ActiveSheet.Shapes.AddLine(96#, 63.75, 191.25, 114#).Select
Автор: vaulin
Дата сообщения: 23.03.2010 11:20
Спасибо, vlth


Цитата:
vaulin, всё вроде так... про 2007 не могу сказать наверняка, в чём дело ( у меня 2003)
Вот что даёт запись макроса (прямая линия):

Код:
ActiveSheet.Shapes.AddLine(96#, 63.75, 191.25, 114#).Select

Попробовал вставить твой код в тот пустой макрос, который я создал описанным выше способом, действительно, нарисовалась линия. Спасибо!
И всё-таки, очень хочется порисовать на форме.
Про
Цитата:
нужен контрол, поддерживающий такую возможность

можно поподробнее? У меня лицензионный office, полная версия. Должна же быть в нем такая возможность? Нужно что-то доустановить?


Добавлено:
p.s.: странно, почему-же у меня не получилось в 2007 то же проделать? видимо, нужно в настройках копаться ...
Автор: NJCorp
Дата сообщения: 23.03.2010 21:27
vaulin

Цитата:
можно поподробнее? У меня лицензионный office, полная версия. Должна же быть в нем такая возможность? Нужно что-то доустановить?


так прошол код

Код: ActiveSheet.Shapes.AddLine(96#, 63.75, 191.25, 114#).Select
Автор: vlth
Дата сообщения: 23.03.2010 21:43

Цитата:
Нужно что-то доустановить?
vaulin, Toolbox (Controls), щёлкаем правой клавишей по его панели, ->Additional Controls...
Выбираем из списка тот, который нужен. А вот где его взять, чтобы зарегить в системе, вопрос второй. Но не последний по значимости.
Автор: vaulin
Дата сообщения: 24.03.2010 08:36

Цитата:
проходит в 2007 или нет?

да, NJCorp, прошел, всё рисует.


Цитата:
Toolbox (Controls), щёлкаем правой клавишей по его панел

vlth, захожу в пункте меню "View" среды VBA, а там строка Toolbox не активна, т.е. бледно-серым цветом. Ее нельзя ни включить ни выключить. Как ее активизировать?

Цитата:
В зависимости от того, для чего тебе линия

нет, я говорю о произвольной линии, да вообще о произольном рисовании на форме.
Автор: vlth
Дата сообщения: 24.03.2010 09:02

Цитата:
Как ее активизировать?
Создать пользовательскую форму.
Автор: vaulin
Дата сообщения: 24.03.2010 09:35
да, появилось, спасибо; но, щелкнув по ней правой клавишей мыши, не нашел Additional Controls..., щелкать, оказывается, нужно было по движку слайдера. Похоже, что это тоже не то, т.к. я имел в виду программное рисование, т.е. на уровне кода. Нашел одну ссылочку: http://forum.sources.ru/index.php?showtopic=287841&hl=%CD%C0%D0%C8%D1%CE%C2%C0%D2%DC в которой приводится код программы, с выводом линий и текста на форму, но код слишком большой для начинающих, не смог в нем разобраться.
Странно всё это, задача, вроде, примитивнейшая, а решить ее, похоже, не так-то просто
Автор: vlth
Дата сообщения: 24.03.2010 10:39
vaulin, по приведённой Вами ссылке:

Код: Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function dwLineTo Lib "gdi32" Alias "LineTo" _
(ByVal hDC As Long, ByVal X As Integer, ByVal Y As Integer) As Long
Private Declare Function dwGetDC Lib "user32" Alias "GetDC" _
(ByVal hWnd As Long) As Long
Private Sub Draw()
Dim hForm As Long, hDC As Long
hForm = FindWindow("ThunderDFrame", Me.Caption)
hDC = dwGetDC(hForm)
Call dwLineTo(hDC, 150, 200)
End Sub
Private Sub UserForm_Click()
Draw
End Sub
Автор: vaulin
Дата сообщения: 24.03.2010 11:15
Ура, vlth, получилось. Спасибо!
Только я немного изменил предложенный Вами код:

Код:
Option Explicit
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function dwLineTo Lib "gdi32" Alias "LineTo" _
(ByVal hdc As Long, ByVal X As Integer, ByVal Y As Integer) As Long
Private Declare Function dwGetDC Lib "user32" Alias "GetDC" _
(ByVal hWnd As Long) As Long
Private Declare Function dwReleaseDC Lib "user32" Alias "ReleaseDC" _
(ByVal hWnd As Long, ByVal hdc As Long) As Long
Private Function Draw()
Dim hForm As Long, hdc As Long
hForm = FindWindow("ThunderDFrame", Me.Caption)
hdc = dwGetDC(hForm)
Call dwLineTo(hdc, 150, 200)
Call dwReleaseDC(hForm, hdc)
End Function
'получение контекста устройства для рисования
Private Sub UserForm_Click()
Draw
End Sub
Автор: vlth
Дата сообщения: 24.03.2010 11:35
vaulin, обратите внимание: я уже удалил вызов dwReleaseDC, ну и, само-собой, её объявление: она здесь лишняя.
Автор: vaulin
Дата сообщения: 24.03.2010 12:01
Ок, vlth, вот конечный вариант:

Код: Option Explicit
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function dwMoveTo Lib "gdi32" Alias "MoveToEx" _
(ByVal hdc As Long, ByVal x As Long, ByVal y As Long, _
ByVal lpPoint As Long) As Long
Private Declare Function dwLineTo Lib "gdi32" Alias "LineTo" _
(ByVal hdc As Long, ByVal x As Integer, ByVal y As Integer) As Long
Private Declare Function dwGetDC Lib "user32" Alias "GetDC" _
(ByVal hWnd As Long) As Long
Private Function Draw()
Dim hForm As Long, hdc As Long
hForm = FindWindow("ThunderDFrame", Me.Caption)
hdc = dwGetDC(hForm)
Call dwMoveTo(hdc, 10, 40, 0)
Call dwLineTo(hdc, 150, 100)
End Function
Private Sub UserForm_Click()
Draw
End Sub
Автор: vlth
Дата сообщения: 24.03.2010 13:47

Цитата:
Интересно, а как нарисовать окружность?


Код: Private Declare Function dwEllipse Lib "gdi32" Alias "Ellipse" _
(ByVal HDC As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Sub Draw3()
Dim hForm As Long, HDC As Long
hForm = FindWindow("ThunderDFrame", Me.Caption)
HDC = dwGetDC(hForm)
Call dwEllipse(HDC, 50, 50, 150, 150)
End Sub
Автор: vaulin
Дата сообщения: 24.03.2010 13:59
vlth, суппер!
ты где нашел эту функцию dwEllipse? я в нете не смог найти даже dwLineTo
Автор: vlth
Дата сообщения: 24.03.2010 14:44

Цитата:
vlth, суппер!
ты где нашел эту функцию dwEllipse? я в нете не смог найти даже dwLineTo

Да порылся вот в своих архивах

Код: Declare Function Ellipse Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Declare Function Rectangle Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, lpPoint As POINTAPI) As Long
Declare Function MoveToExNull Lib "gdi32" Alias "MoveToEx" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal lpPointNull As Long) As Long
Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Declare Function Arc Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long, ByVal X4 As Long, ByVal Y4 As Long) As Long
Автор: vaulin
Дата сообщения: 24.03.2010 14:51

Цитата:
Да порылся вот в своих архивах

что за архивы, если не секрет ?
Автор: vlth
Дата сообщения: 24.03.2010 15:01
Только не помню, откуда это у меня.
Автор: Drazhar
Дата сообщения: 24.03.2010 15:05
Доброе время суток.
Необходима помощь в функции архивирования файлов больших объемов с целью их дальнейшей отправки по почте. Пока использовался следующий код

Код: Open ActiveWorkbook.Path & "\db.zip" For Output As #1
Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0)
Close #1 'Этим создаем ЗИП
Set oApp = CreateObject("Shell.Application")
i = 1
oApp.Namespace(ActiveWorkbook.Path & "\db.zip\").CopyHere ActiveWorkbook.Path & "\db.mdb"
Автор: vlth
Дата сообщения: 24.03.2010 17:01
Drazhar

Код: Shell "C:\Program Files\WinRAR\WinRAR.exe a db.rar " & ActiveWorkbook.Path & "\db.mdb", vbHide

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

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


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