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

» Excel VBA

Автор: GrayElf
Дата сообщения: 27.07.2005 11:48
distance

Цитата:
1. если у меня есть функция, описанная в одном модуле, то как мне её вызвать из другого модуля? То же самое относится к константам - не видны-с...

Перед объявлением ставь Public, т. е. Public Sub qwerty()

Цитата:
2. как сделать, чтобы моя функция вызывалась при открытии документа?

функцию надо назвать auto_open и все

saintvadim
Посмотри код какого-нибудь вируса, они как раз этим и занимаются
Автор: saintvadim
Дата сообщения: 27.07.2005 12:40
Допустим, у меня есть тестовый Excel-файл, в котором я пишу весь код. Где-то далеко есть другой Excel-файл (без макросов), в который мне надо встроить разработанную программу.
Как я понял, в VBA есть возможность импорта/экспорта модулей, форм и так далее. Как этим пользоваться?
Автор: Sleepwalker
Дата сообщения: 27.07.2005 13:46
saintvadim
В тестовом жмешь правой кнопкой на модуле, делаешь ему экспорт. Потом открываешь приемник, заходишь в редактор VB и там в модулях делаешь импорт сохраненного.
Автор: saintvadim
Дата сообщения: 28.07.2005 14:27
Sleepwalker
Спасибо за ответ.
С экспортом/импортом форм, кажется, всё нормально, однако при экспорте Листа1 предлагается сохранить файл типа Class Files (*.cls), после импорта в другой файл в Project Explorer сохранённый модуль отображается в папке Class Modules, а Лист1 этого файла остаётся чистым. Макрос не работает.
Автор: igbt
Дата сообщения: 29.07.2005 12:02
Как проверить запущен указанный EXE или нет и сказать об этом макросу VBA?
Очень надо !!!
Автор: dneprcomp
Дата сообщения: 29.07.2005 22:11
igbt
В VB6 я использовал обращения к API функциям. Попробуй, может удасться сделать также в VBA. Функция CheckWindow принимает заголовок окна и возвращает boolean значение. Перед вызовом инициализируй TargetHwnd.
[more]
Код: Public TargetHwnd As Long

Public Declare Function EnumWindows Lib "user32" _
(ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

'TargetName 'заголовок окна/ window caption(title)
TargetHwnd = 0

Public Function CheckWindow (ByVal TargetName As String) as Boolean

' Используем EnumWindows для проверки существования окна
' Проверяем загруженные окна в памяти по заголовку окна
EnumWindows AddressOf WindowEnumerator, 0

' See if we got an hwnd.
If TargetHwnd = 0 Then
'файл не загружен
CheckWindow = False
ElseIf TargetHwnd > 0 Then
CheckWindow = True
файл загружен
End If
End Function

Public Function WindowEnumerator(ByVal app_hwnd As Long, ByVal lParam As Long) As Long

' Return False to stop the enumeration.
Dim buf As String * 256
Dim Title As String
Dim length As Long

' Get the window's title.
length = GetWindowText(app_hwnd, buf, Len(buf))
Title = Left$(buf, length)

' See if the title contains the target.
If InStr(Title, TargetName) > 0 Then
' Save the hwnd and end the enumeration.
TargetHwnd = app_hwnd
WindowEnumerator = False
Else
' Continue the enumeration.
WindowEnumerator = True
End If

End Function
Автор: Sleepwalker
Дата сообщения: 29.07.2005 22:44
saintvadim
понятен фиг не работает... но ты про листы не спрашивал. Т.е. тебе еще надо и лист твой вставить в проект? Я думаю, лист из файла xls можно подгрузить, правда код предоставить не могу.
Автор: epsilon
Дата сообщения: 30.07.2005 18:49
wtt
vworld
_http://dfni.dp.ua/books/load.php?ty=vb
там антилич стоит, прямую ссылку на книгу дать не могу
Автор: king_krimson
Дата сообщения: 01.08.2005 23:18
Помогите плиз срочно госпада???!!!!!

1
есть вот такая формула - переменная sum = количеству элементов в столбце. теоретически должно все работать - но хоть тресни нифига - в результате в ячейке где вбита формула пишется что "ошибка недопустимое имя"и в самой ячейке (#ИМЯ?) - если кликнуть дважды по ячейке - все исправляется и значение пересчитывается !!
Range("J" & CStr(sum + 5)).Formula = "=СУММ(J6:J" & CStr(sum + 3) & ")"
2

как скрыть книгу целиком - чтобы не маячила когда ставлю макрос на автозапуск с Excel ?
Автор: igbt
Дата сообщения: 02.08.2005 15:43
dneprcomp
Спасибо.
Но VBA под Excel постоянно навязывает работу с окнами Excel и как ему щелкнуть по носу и заставить работать с окнами других приложений, а еще и получать от них данные - для меня вопрос? Может я чего-то не понял :о)). Но вопрос остался открытым:
Как проверить запущен указанный EXE или нет и сказать об этом макросу VBA?
Автор: ShIvADeSt
Дата сообщения: 03.08.2005 01:01
igbt

Цитата:
Как проверить запущен указанный EXE или нет и сказать об этом макросу VBA?

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

Цитата:
Но VBA под Excel постоянно навязывает работу с окнами Excel и как ему щелкнуть по носу и заставить работать с окнами других приложений, а еще и получать от них данные - для меня вопрос

Юзай АПИ и не будет никаких проблем, сможешь получать инфу из практически любых окон, с которых можно получить инфу.
Автор: dneprcomp
Дата сообщения: 03.08.2005 02:24
igbt
Я же привел код. Добавь в модуль и пробуй. Поставь на форму кнопку и вызывай CheckWindow .
Автор: evle
Дата сообщения: 03.08.2005 06:14
king_krimson
В свойстве Formula не должно быть русских названий функций (СУММ). Для этого используй FormulaLocal, А лучше английские названия.
Автор: igbt
Дата сообщения: 05.08.2005 13:04
dneprcomp
Работает, спасибо.

Теперь другой вопрос: как закрыть указанное окно.
Пытался через DestroyWindow и через CloseWindow, но они возвращают False и True соответственно, а окно не закрывают.
Вот код:

Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Boolean
Declare Function CloseWindow Lib "user32" (ByVal hwnd As Long) As Boolean
Sub tt()

Dim qqq As Long
Dim Index As Boolean
qqq = ' идентификатор окна
Index = CloseWindow(qqq)
'Index = DestroyWindow(qqq)

End Sub

Автор: epsilon
Дата сообщения: 08.08.2005 20:42
igbt
Я так пишу:

Цитата:
Windows("file.xls").Activate
ActiveWindow.Close

Удачи!
Автор: dneprcomp
Дата сообщения: 09.08.2005 00:17
igbt
А чему равно qqq ?
Его не надо об'являть, т.к при об'явлении qqq = 0.
Используй TargetHwnd из моего примера.
Автор: igbt
Дата сообщения: 09.08.2005 12:08
dneprcomp

Для определения наличия окна я использовал это

Код:
Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal Class As String, ByVal WN As String) As Long
Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Boolean

Dim qqq As Long
Dim Index As Boolean

Sub tt()

qqq = FindWindow(vbNullString, "Calculator")
Index = DestroyWindow(qqq)

End Sub
Автор: KChernov
Дата сообщения: 09.08.2005 12:20
Ветки просто про VBA нету, так что пишу сюда.

Мне надо в макросе взять текст из буфера обмена, обработать и положить обратно.
Но тот вариант, который я написал, почему-то ругается при попытке положить текст обратно в буфер (последняя строчка примера).
Вот:
Dim MyData As DataObject ' это в общем модуле
Sub ConvertText()
Dim splitString As Variant
Dim joinString As String
Set MyData = New DataObject
MyData.GetFromClipboard
splitString = Split(MyData.GetText(1), " ")
splitString(1) = splitString(1) & " "
For i = LBound(splitString) + 1 To UBound(splitString)
splitString(i) = Mid(splitString(i), 1, 1) & "."
Next
joinString = Join(splitString)
MyData.SetText joinString
MyData.PutInClipboard
End Sub

Но вот если в предпоследнюю строчку процедуры вместо переменной поставить константу - все работает?!
Мб я как-то неправильно формирую строку для буфера? (msgbox отрабатывает без проблем)?

Или мб это вообще как-то иначе нужно делать?..
Автор: Tushkanchyk
Дата сообщения: 09.08.2005 12:44
Привет всем!

Умные люди, подскажите, пожалуйста, такую вещь:
наскольно я знаю, в Excel нет встроенных функций, позволяющих выводить прописью число, содержащееся в какой-либо ячейке, например: 10105 - десять тысяч сто пять (рублей).

ЧТО и КАК можно использовать, чтобы это сделать? (VBA, макросы.....)
Может, уже есть что-то работающее??? Где это можно поискать?

Спасибо заранее!
Автор: igbt
Дата сообщения: 09.08.2005 16:07
Tushkanchyk

Поищи в сети файлик Propis99.xla
И будет тебе счастье :о)))
Автор: dneprcomp
Дата сообщения: 09.08.2005 20:04
igbt

Цитата:
Visual Basic 6 definition
Declare Function DestroyWindow Lib "user32.dll" (ByVal hWnd As Long) As Long
Visual Basic .NET definition
Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Integer) As Integer
Description
DestroyWindow destroys a window. Any menus, timers, or child windows are automatically destroyed along with it. DestroyWindow only works with windows that are owned by the calling program, however. DestroyWindow Destroys the specified window.

CloseWindow Minimizes (but does not destroy) the specified window.

Попробуй:
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Const WM_CLOSE = &H10
Call SendMessage(hWnd, WM_CLOSE, 0, 0)
где hWnd = qqq
Автор: igbt
Дата сообщения: 10.08.2005 16:35
dneprcomp

Работает даже вот так. Спасибо.

Код:
Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal Class As String, ByVal WN As String) As Long
Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Call SendMessage(FindWindow(vbNullString, "Calculator"), &H10, 0, 0)

Автор: UserOKA
Дата сообщения: 10.08.2005 18:22
Народ, поделитесь примерчиком формы Excel для работы с БД Access.
Заранее спасибо.
Автор: dneprcomp
Дата сообщения: 10.08.2005 19:16
igbt
Public Const WM_DESTROY = &H2

Цитата:
Call SendMessage(FindWindow(vbNullString, "Calculator"), &H10, 0, 0)

Я бы не рекомендовал все же так делать. А что будет, если FindWindow не найдет окна?
Автор: archimed7592
Дата сообщения: 11.08.2005 00:39
всем привет!
подскажите пожалуйста, как сделать так, чтобы, когда я изменяю какую-либо ячейку, excel не переключался на её страницу(книгу), не обновлял её?
я нашёл application.interactive, но при ошибке в скрипте excel блокируется окончательно. может быть есть в VBA какой-нибудь аналог try...catch (или try...finally)?

как одной сделать так, чтобы вместо формулы в наборе ячеек (range) поместились их текущие значения?

и последнее: мне нужно открыть файл, но не просто открыть, а чтобы, если он уже открыт, заново его не открывать.

заранее very big thanks
Автор: dneprcomp
Дата сообщения: 11.08.2005 00:46
archimed7592

Цитата:
аналог try...catch

Посмотри On Error GoTo

Цитата:
мне нужно открыть файл, но не просто открыть, а чтобы, если он уже открыт, заново его не открывать
Посмотри на 8-й странице я приводил код для API

Автор: archimed7592
Дата сообщения: 11.08.2005 02:42
dneprcomp, big thanks тебе

ещё одна проблемка появилась: без application.interactive=true скрипт работает отлично.
application.interactive = false - выдаёт "5: Invalid procedure call or argument"
в чём дело?
скрипт только пишет данные в ячейки разных листов.
Автор: aquaman1977
Дата сообщения: 11.08.2005 12:12
Проблема.
При использовании функции LookUp если условие не выполняется (т.е. значение, удовлетворяющее условию в указанном диапазоне не найдено) вылетает ошибка 1004..
Как можно отловить это событие? Чтобы скрипт не прерывался?

Вопрос снимается.
Решил путем использования On Error Resume Next

Другой вопрос:
как организовать удаление одинаковых строк на листе?
На данный момент у меня решение основано на поячеечном сравнении..
Можно как-нибудь это оптимизировать?
Автор: Sleepwalker
Дата сообщения: 11.08.2005 14:01
aquaman1977

Цитата:
как организовать удаление одинаковых строк на листе?
На данный момент у меня решение основано на поячеечном сравнении..

если количество данных небольшое (ну, например, 1000 строк) то имхо никак.
Если же достаточно большое, то, по-моему, лучше сначала отсортировать а потом делать 1 сквозной проход (одинаковые ячейки будут рядом находится). Кстати, строки лучше не удалять, а копировать на другой лист, на порядок быстрее получается, нежели удаление. Либо тогда их как-то помечать на удаление, потом выделять и удалять все сразу.
Автор: Tushkanchyk
Дата сообщения: 11.08.2005 17:18
Привет всем!

Умные люди, подскажите, пожалуйста, такую вещь:
наскольно я знаю, в Excel нет встроенных функций, позволяющих выводить прописью число, содержащееся в какой-либо ячейке, например: 10105 - десять тысяч сто пять (рублей).

ЧТО и КАК можно использовать, чтобы это сделать? (VBA, макросы.....)
Не знаю, с какой стороны к этому подойти!!!
Может, уже есть что-то работающее??? Где это можно поискать?

Спасибо заранее!

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Стоит ли переходить с Билдера на Делфи?


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