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

» Excel VBA

Автор: Yuk
Дата сообщения: 08.02.2007 19:00
The okk

Цитата:
немного шокировал

Мягко сказано. И за эту хрень они просят 20 баксов. Наши люди!
Можно было бы, конечно, попробовать из интереса, действительно ли это так как описано. Можно и взломать при желании. Времени только жалко.


Добавлено:
The okk
Может, ключевое слово здесь
Цитата:
где стоят числовые значения?

Автор: The okk
Дата сообщения: 09.02.2007 09:09
Yuk
Да. Ломануть, конечно, надо. Просто из интереса.


Цитата:
Может, ключевое слово здесь
Цитата:где стоят числовые значения?

Нет. Это НЕ числовые значения. Это обычный текст (если, конечно, в качестве разделителей не выбраны точки). Следовательно, обычный SpecialCells с параметром xlNumbers эти ячейки не увидит. Следовательно, надо найти все ячейки с форматом "Текст" и в каждой из них, где есть точка, сделать Split по точке и в полученном массиве проверить элементы на IsNumeric. Быстрее это вручную сделать, чем код писать.
Автор: serb78
Дата сообщения: 09.02.2007 23:16
Подскажите как выделить деапозон ячеек относительно активной ячейки, которая определена поиском?
Автор: Yuk
Дата сообщения: 09.02.2007 23:26
serb78
ActiveCell.Offset(строк,столбцов)
Или для диапазона пример
Range(ActiveCell.Offset(1,0),ActiveCell.Offset(5,2))
Выделит область 5 строк вниз и 3 столбца.
Автор: serb78
Дата сообщения: 10.02.2007 12:26
Спасибо огромное!

Подскажите еще как создать книгу с названием напимер "книга100220071320", т.е. часть названия "книга" всегда постоянная, а цифры это текущая дата и время?
Автор: Troitsky
Дата сообщения: 10.02.2007 13:48
serb78

Цитата:
Подскажите еще как создать книгу с названием напимер "книга100220071320", т.е. часть названия "книга" всегда постоянная, а цифры это текущая дата и время?


Код: Set wbNew = Workbooks.Add
wbNew.SaveAs "книга" & Format(Now(), "ddmmyyyyhhmm")
Set wbNew = Nothing
Автор: Domivan
Дата сообщения: 10.02.2007 16:13
Здравствуйте всем.
Я научился передавать команды через com порт во внешнее устройство (электронные весы) с целью управления ими и получения необходимых данных (результат взвешивания).
Вопросы следующие.
1. Для обращения к com порту я использую элемент управления mscomm32.ocx разработанный в Microsoft но не вошедший в дистрибутив по определенным причинам. Подробнее можно прочитать здесь http://www.anthillsolutions.com/msexcel.html
Оттуда я и скачал элемент. Задачу передачи данных через порт я решил, но: есть ли какой-нибудь другой способ обращения к порту, желательно без помощи посторонних элементов управления? Естественно, средствами VBA.
2. Опрос порта происходит в течение определенного времени, скажем, 2-х секунд.
В течение этого времени весы успевают передать в порт всю строку в ответ на запрос. Программа циклически считывает данные с порта в текстовую переменную и ждет символа конца строки Chr (10), после чего цикл прекращается. Цикл прекращается также по таймингу (примерно 2-5 секунды). Но мне не нравится как этот тайминг мне пришлось организовать: я тупо устроил цикл do-loop until i=0 с начальным счетчиком i=10000.
Подскажите, как сделать нормальный цикл по времени? Чтоб задать необходимое время жизни цикла?
Спасибо.
Автор: Anton T
Дата сообщения: 10.02.2007 20:10
Смотри рисунки:
[more=рис1][img=http://images.people.overclockers.ru/111519.gif][/img][/more]
[more=рис2][img=http://images.people.overclockers.ru/111520.png][/img[/more]
По адресу "Ленин" отображается все по улице Ленина, когда я ввожу фамилию "Ав" отображаются разные адреса. Как можно сделать, чтобы не отображались разные адреса?
[more=Здесь коды]
Код:
Private Sub TB1_Change() 'Фамилия
Dim rng As Worksheet
Dim r As Range
Dim strFilt As String
Dim strFiltLen As Integer
Dim arrFilt As Variant 'динамический массив
Dim ColCnt As Integer
Dim i As Integer, c As Integer

ColCnt = ActiveSheet.UsedRange.Columns.Count

strFilt = TB1.Text
strFiltLen = Len(strFilt)
i = 0
ReDim arrFilt(ColCnt - 1, i)
For Each rng In ActiveWorkbook.Worksheets
For Each r In rng.UsedRange.Rows
If strFilt = Left(r.Cells(1).Text, strFiltLen) Then
ReDim Preserve arrFilt(ColCnt - 1, i)
For c = 1 To ColCnt
arrFilt(c - 1, i) = r.Cells(1, c).Value
Next
i = i + 1
End If
Next r
Next rng
ListBox1.Column = arrFilt
End Sub

Private Sub TB2_Change() 'Адрес
Dim rng As Worksheet
Dim r As Range
Dim strFilt As String
Dim strFiltLen As Integer
Dim arrFilt As Variant 'динамический массив
Dim ColCnt As Integer
Dim i As Integer, c As Integer

ColCnt = ActiveSheet.UsedRange.Columns.Count

strFilt = TB2.Text
strFiltLen = Len(strFilt)
i = 0
ReDim arrFilt(ColCnt - 1, i)
For Each rng In ActiveWorkbook.Worksheets
For Each r In rng.UsedRange.Rows
If strFilt = Left(r.Cells(5).Text, strFiltLen) Then
ReDim Preserve arrFilt(ColCnt - 1, i)
For c = 1 To ColCnt
arrFilt(c - 1, i) = r.Cells(1, c).Value
Next
i = i + 1
End If
Next r
Next rng
ListBox1.Column = arrFilt
End Sub

Private Sub UserForm_Initialize()
Dim ColCnt As Integer
ColCnt = ActiveSheet.UsedRange.Columns.Count

With ListBox1
.ColumnCount = ColCnt
End With

TB1_Change
End Sub
Автор: Yuk
Дата сообщения: 11.02.2007 07:24
Domivan
Это не ты случайно раньше здесь уже спрашивал про управление весами из VBA?
Про 1 не знаю.
2. Используй метод Application.Wait. Посмотри в хелпе, там есть нужные тебе примеры. Есть еще метод OnTime для расписания, может тоже пригодится.

Добавлено:
Подумал, что возможно я не так понял. Можно просто записать значение Time0 = Now() в начале работы цикла, а потом сравнивать с ним текущее время. Можно и не на каждом шаге.


Добавлено:
Anton T
Все правильно. У тебя при изменении каждого текстбокса происходит чтение данных из таблицы с проверкой только по этому текстбоксу.

Код: strFilt = TB1.Text
strFiltLen = Len(strFilt)
...
If strFilt = Left(r.Cells(1).Text, strFiltLen) Then
...
...
strFilt = TB2.Text
strFiltLen = Len(strFilt)
...
If strFilt = Left(r.Cells(5).Text, strFiltLen) Then
Автор: SERGE_BLIZNUK
Дата сообщения: 11.02.2007 07:55
Anton T
я не могу помочь вам решить вашу проблему (пока)
- но точно могу сказать в чём проблема:
в функции TB1_change устанавливается фильтр по TB1.Text, в TB2_change — по TB2.Text... Таким образом, когда вы уставливаете фильтр по фамилии, то фильтр по адресу уже не задействован...

исправить ситацию можно приблизительно так (в TB1_change):

Код:
strFiltAdr = TB2.Text
strFiltAdrLen = Len(strFiltAdr)
...
If (strFilt = Left(r.Cells(1).Text, strFiltLen) ) _
and (strFiltAdr = Left(r.Cells(5).Text, strFiltAdrLen)) Then
Автор: Anton T
Дата сообщения: 11.02.2007 18:51
Yuk, SERGE_BLIZNUK
Спасибо!
Автор: kandi
Дата сообщения: 12.02.2007 10:08
Не знаю, в каком топике постить вопрос, поэтому задаю в обоих: "Excel VBA" и "Excel FAQ".
Пожалуйста, помогите решить такую задачу.
На листе Excel расположено N-ое количество однотипных табличек с данными. Возле каждой из них находится управляющий элемент - ActiveX command button, по нажатию на который происходит обработка данных соответствующей таблички, строится отчет и выводится на принтер. Задача в том, чтобы каким-то образом определить до обработки данных и построения отчета КАКОЙ именно ActiveX command button был нажат, т.е. либо в переменной, либо в произвольной ячейке получить уникальный идентификатор нажатой кнопки.
Автор: dunamis
Дата сообщения: 12.02.2007 11:00
посоветуйте хорошие курсы VBA в киеве. спасибо
Автор: Pantera3587
Дата сообщения: 12.02.2007 16:02

Ребята, помогите, пожайлуста, написать код, в выделенном диапазоне которого числа имеющие точку между разрядами заменялись на числа, имеющие запятую между разрядами (т.е. точку надо заменить на запятую). Функция Заменить не подходит, т.к. надо производить замену по одной ячейке, а надо сразу во всех ячейках, где есть числа. Например, вот в такой таблице:
Артикул Наименование Цена 1 Цена 2
47212 Процессор AMD 903.88
47213 Процессор AMD 1054.92 1025.42
47184 Процессор AMD 1348.74 1309.8
55336 Процессор AMD 1253.16
Автор: Troitsky
Дата сообщения: 12.02.2007 16:27
Pantera3587
так попробуй

Код: For Each c In Selection.Cells
c.Value = c.Text
Next
Автор: djdtyfhu
Дата сообщения: 12.02.2007 17:58
А я вот слышал, что Microsoft хочет убрать VBA из всех своих продуктов Office. Кто что знает по этому поводу?
Автор: The Invisible
Дата сообщения: 12.02.2007 18:57
помогите плиз надо осуществить следующее :

есть несколько больших файлов *.xls
файлы в виде отчетов допустим с такими колонками:
имя / фамилия / место / дата

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

и надо чтоб взяло соответствующие данные из всех файлов *.xls
и представило в виде одного файла или предложило бы сохранить в виде *.xls

как такое осуществить ?

запостил так же в теме про ексель и аксес
не сочтите за флуд

Автор: serb78
Дата сообщения: 12.02.2007 19:58
Подскажите как создать письмо с вложенным файлом, которое бы отправлялось по времени, к пимеру мне нужно отправлять отчет ежесуточно в 9:00 на один и тот же адресс?
Автор: LevT
Дата сообщения: 12.02.2007 20:34

Абсолютный новичок в экселе, но неплохо владел когда-то OO-техникой под вордом и акцесом.

Хочу поместить в "ЭтаКнига" и в "Лист1" некоторые свои свойства и методы. Как получить ссылку на них в общем случае (то есть заранее неизвестно, откуда - известно только, что запущен эксель в контексте некоторого макроса, и в этом экселе открыта моя книга)? Имена и типы заранее известны - то есть вопрос не имеет отношения к перечислению typelib. Просто вот добавить бы в код объекта "Лист1" (Workbooks("MyBook").Sheets("MySheet").CodeName) переменную Public MyCustomSheetProperty As String и дергать ее снаружи по мере нужды. Как?

Update.
В листы добавлять проперти научился, теперь бы ЭтаКнига победить. Ну никак нигде не вижу там своих методов.
Автор: Pantera3587
Дата сообщения: 12.02.2007 20:42
Troitsky
Спасибо за отклик. Все работает.
Автор: The okk
Дата сообщения: 13.02.2007 06:01
LevT
Переменные и процедуры, объявленные, как Public, видны из любого модуля. Зачем их нужно добавлять именно в Листы и Книгу (объекты, в общем случае, для этого не предназначенные)?
Автор: LevT
Дата сообщения: 13.02.2007 09:28
The okk

Ну вот надо. По опыту ворда придумывал изящные OO-решения таким образом. А то, что не предназначенные, неверно. Только нужна революция в мозгах, чтобы этим воспользоваться.

А Public метод в ЭтаКнига не виден через Workbooks("Name"), по крайней мере.
Автор: The okk
Дата сообщения: 13.02.2007 09:53
LevT

Цитата:
А то, что не предназначенные, неверно. Только нужна революция в мозгах, чтобы этим воспользоваться

Чтобы записать объявления переменных Public в объект Лист или Книга революция не нужна - я тоже так поначалу делал (да и любой новичок пишет Public переменные туда, куда рука дотянется ). Разницы-то никакой. Они везде видны будут.

Цитата:
А Public метод в ЭтаКнига не виден через Workbooks("Name")

Public - это глобальная вещь. Зачем его видеть через Workbooks("Name"), если можно просто обратиться к нему по названию откуда угодно? Пишешь Call <название_процедуры>. Зачем обращаться именно как к методу?

Цитата:
По опыту ворда придумывал изящные OO-решения таким образом

По опыту Excel... ничем подобным не занимался . Ибо вообще не представляю, какие преимущества может дать объявление переменных в Листе или Книге. Ну правда, зачем, например, это делать в Excel? Что можно таким образом получить?

P.S.: Если уж тебе действительно это нужно, то вместо
Код: Workbooks("Name").метод
Автор: LevT
Дата сообщения: 13.02.2007 11:34

Public - это для примера, чтобы проще было показать. Дальше сам разберусь. А вот еще связанный вопрос. Сделал в буке класс, Instancing = PublicNotCreatable

Как его дергать? Через Workbooks("Name") нифига не видать.


Добавлено:


Цитата:
Лист1.метод вместо Worksheets("Лист1").метод.


Это все хорошо, но мне нужно дергать этот метод в произвольном контексте. И лист может быть совсем другой (предполагается, что метод в нем определен).

Автор: The okk
Дата сообщения: 13.02.2007 12:28
LevT

Цитата:
Как его дергать? Через Workbooks("Name") нифига не видать.

Зачем что-то дергать из коллекции Workbooks? Классов в книге нет. - По библиотеке посмотри: они не в Excel, а в VBAProject.
Создал класс и работай с ним, как с обычным классом.
Код: Dim objTest As Class1
Автор: LevT
Дата сообщения: 13.02.2007 12:40


Цитата:
В таком случае, зачем вообще прописывать эту процедуру/метод в объект Лист?


Ради эстетизма. ПолиморфизЬм, панимаешь... инкапьсуляцыя тудаже.

Для кого-то вообще проще классами не пользоваться или пользоваться ими как модулями.
Автор: The okk
Дата сообщения: 13.02.2007 12:57
LevT

Цитата:
Ради эстетизма. ПолиморфизЬм, панимаешь... инкапьсуляцыя тудаже.

В целях эстетизма принято всю глобальность выводить в отдельный модуль, обозвать там все переменные через Public, сделать к ним комменты (в каких процедурах используется и зачем) и спокойно использовать по мере надобности.
Но в любом случае это не так важно - объявляй процедуры и переменные, как глобальные - и сможешь вызывать их независимо от контекста.

Цитата:
Для кого-то вообще проще классами не пользоваться или пользоваться ими как модулями.

Единственный случай, когда мне нужны были классы, это кнопки на форме, имеющие одну процедуру обработки. Если бы классы давали прирост в быстродействии, я бы их чаще использовал.
Автор: LevT
Дата сообщения: 13.02.2007 13:06
The okk

ЭстетизЬма у всех разная. Моя с твоей просто не совпала. Ж)

А вопросы остаются. Или эксель еще меньше ОО, чем ворд? C вордом я когда-то так натренировался (можно считать, заново открыл ОО и рефакторинг - это когда слова такого еще не было, одновременно с придумавшим его Фаулером), что переходы к VB6 (дайте мне Interface!) и далее на .NET прошли совсем безболезненно.


Добавлено:


Вот здесь http://support.microsoft.com/kb/555159

прочел, что надо добавить ссылку на библиотечную книгу через Tools-> References. Почему-то не получается (у меня открыт воркспейс с этой книгой). В качестве альтернативы там предлагается позднее связывание (и запуск еще одного экселя?) через application.Run

Что, и впрямь все так грустно?



Добавлено:

И еще вопрос по отладчику. Я среду VBA уже изрядно подзабыл, но привык к тому, что в VB6 можно установить уровень перехвата ошибок в классах. Не помню даже, есть ли это в ворде, а в экселе?

Автор: The okk
Дата сообщения: 13.02.2007 14:11

Цитата:
А вопросы остаются.

Как обратиться к ЭтаКнига? - Так и обращайся ЭтаКнига.
Как обратиться к глобальной процедуре, записанной где-либо (в книге, модуле, листе, форме)? - Просто: Call <имя процедуры>.
Какие вопросы?

Цитата:
How one VBA project can use an object declared in the class module of another project

А откуда ты его вызывать собираешься? Разве не из того же проекта?

Если ты из одного проекта собрался работать с процедурами, классами и т.д. другого, может, имеет смысл все внешнее запихать в dll и вызывать уже оттуда?
Автор: LevT
Дата сообщения: 13.02.2007 14:45

Цитата:

Как обратиться к ЭтаКнига? - Так и обращайся ЭтаКнига.


Меня интересует общий случай для произвольного контекста. Сейчас у меня открыто в воркспейсе три книги, соответственно и три проекта в VBE




Добавлено:


Цитата:

Если ты из одного проекта собрался работать с процедурами, классами и т.д. другого, может, имеет смысл все внешнее запихать в dll и вызывать уже оттуда?


Хочу сначала выжать максимум из самого экселя - заодно и в нем самом разобраться чуток. А то можно было бы сразу создать проект в VS.NET Tools для Officе и шаманить, так ни разу экселя вручную не запустив...



Добавлено:

Ага, проекты можно переименовать. И тогда ясно, куда галку ставить в Tools->References. Уже что-то.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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