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

» Excel VBA

Автор: yuraskas
Дата сообщения: 20.11.2004 19:40
Troitsky
Спасибо за подсказку
Автор: Troitsky
Дата сообщения: 21.11.2004 11:56
Ну, если честно, то код удаления пункта меню при закрытии Excel'я малость кривоват: если в процессе работы с документом пользователю вздумается настроить менюшки под себя и пункт меню "Мой макрос" будет уже не последним пунктом меню "Данные", то удалитья все же последний пункт, а "Мой макрос" останется неудаленным.
Поэтому для получения универсального кода нужно индекс Excel.Application.CommandBars("Data").Controls.Count заменить на более подходящий - развивай идею
Кстати, сообща можно тут неплохой примерчик на эту темку состряпать Думаю, востребованным будет.
Автор: wtt
Дата сообщения: 08.12.2004 09:24
Подскажите пожалуйста:
1.Как определить кол-во непустых ячеек в строке/столбце?
2.Как упорядочить числа в массиве по убыванию/возрастанию?
Автор: Smog
Дата сообщения: 08.12.2004 12:08
wtt

Цитата:
1.Как определить кол-во непустых ячеек в строке/столбце?

stolb=1 'столбец А
sum=0
for i=1 to 20000 ' хватит столько?
if cells(i,stolb) <> '' then sum = sum +1
next i
msbox sum


Добавлено
wtt

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

Методом пузырька, например
Автор: slashuz
Дата сообщения: 08.12.2004 15:21

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

1 база данных храниться в экселевском файле( ~5000 элементов)
подключаюсь так
Set db = New ADODB.Connection
With db
.Provider = "MSDASQL"
.ConnectionString = "DSN=local_db;"
.CursorLocation = adUseClient
.Open
End With

Set records = New ADODB.Recordset
records.Open "Select * from [db$] where index = '112', db

этот запрос длиться около 2 минут, можно ускорить? или нужно переводить в что-нить типа DBF?

2 VBA код действует только на одной страничке экселя, если добвить новый лист, то там он уже не действует, так как он туда не переноситься, куда нужно писать код чтобы он действовал на каждом листе книги

3 Как добавить книгу со своим кодом в шаблоны?




Автор: Smog
Дата сообщения: 08.12.2004 17:07
slashuz

Цитата:
куда нужно писать код чтобы он действовал на каждом листе книги

в модули...
Автор: slashuz
Дата сообщения: 09.12.2004 06:25

Цитата:
в модули...


а можно пример? где они эти модули?

PS:Нашел модули, но у меня код находиться в обработчике

Private Sub Worksheet_Change(ByVal Target As Range)

End Sub

как его запихнуть в модули чтобы он для всех листов действовал?

Автор: SebSeb
Дата сообщения: 16.12.2004 23:39
Мне нужно в цикле обращаться к ячейкам с именами a_1, a_2,.....a_20.
Подскажите, плз, как это должно выглядеть, я написал так
For x = 1 To 20
Range (a_"x") = .......

Сам понимаю, что не правильно, а как сформировать имя из слова и переменной?
Автор: Tropin
Дата сообщения: 17.12.2004 09:32
SebSeb
А зачем так все усложнять?
не проще ли обращаться к ячейкам по их номерам, если уж все-равно нужно от 1 до 20...
Автор: SebSeb
Дата сообщения: 17.12.2004 09:37
Дело в том, что ячейки в разных местах на листе.
Автор: Tropin
Дата сообщения: 17.12.2004 09:42
slashuz
1. DBF - лучше, а еще лучше любая более менее нормальная СУБД (отличная от Microsoft
2. код можно запихнуть в модули, и ссылаться на него из Worksheet'ов, а также можно разместиить код в Workbook'е, чтобы придобавлении/удалении нового листа автоматически добавлялись функции...
3. А "сохранить как..." не получилось?
Автор: Smog
Дата сообщения: 17.12.2004 10:03
ошибся...
Автор: Tropin
Дата сообщения: 17.12.2004 10:33
SebSeb
тогда, наоборот ))

For x = 1 To 20
Range ("a_"+x) = ......
Автор: SebSeb
Дата сообщения: 17.12.2004 12:32

Tropin

For x = 1 To massiv.Count
aa = massiv.Item(x)
Range("cell_" + x) = aa
Next x

Дает ошибку
Правильно вместо + ставить &.
После этого работает, но теперь ошибка другая:
Method 'Range' of object '_Global' failed
Автор: Smog
Дата сообщения: 17.12.2004 13:11
SebSeb
Tropin
извиняюсь, думал поначалу, что a_1, a_2 - это адреса ячеек
Автор: SebSeb
Дата сообщения: 17.12.2004 13:39
Smog
Это я так объяснил Спасибо огромное, с этим вопросом разобрался. Ошибка возникала из-за отсутвтвующих адресов ячеек.
Автор: Troitsky
Дата сообщения: 06.01.2005 01:14
Месяца полтора назад возникло у меня желание написать код для добавления своего пункта меню, ассоциированного с макросом, в меню стандартное, да только вот времени тогда не было. Всвязи с праздниками свободная минутка выдалась.
Представляю тут получившийся код - может пригодится кому. Добавляемый таким образом пункт (последний пункт в меню Data/Данные) при завершении работы с Excel удалится автоматически.


Код:
Set MyMenu = Excel.Application.CommandBars("Data").Controls.Add _
(Type:=msoControlButton, ID:=850, Temporary:=True)

Dim strPicture As String ' Файл пиктограммы (16x16 *.bmp)
Dim strMask As String ' Файл маски (16x16 *.bmp)
strPicture = Application.ActiveWorkbook.Path & "\picture.bmp"
strMask = Application.ActiveWorkbook.Path & "\mask.bmp"

With MyMenu
.Style = msoButtonIconAndCaption
.Caption = "MyMacros" ' Наименование пункта меню
.OnAction = "Макрос1" ' Имя ассоциированного с ним макроса
.Picture = LoadPicture(strPicture) ' Пиктограмма пункта меню ...
.Mask = LoadPicture(strMask) ' ... и ее маска
.State = msoButtonUp
End With
Автор: pavel123
Дата сообщения: 07.01.2005 21:26
Помогите!
Имеются таблицы с данными. Нужен макрос, результат которого -
суммы и средние по столбцам и строкам . Размер таблиц разный.
То есть нужно одним нажатием кнопки ....
Автор: Tropin
Дата сообщения: 08.01.2005 13:02
pavel123

Цитата:
Имеются таблицы с данными.

Весь эксель и есть таблицы с данными... а поконкретнее, ну примерчик хотя б.

А то действительно, получается просьба вида: "напишите мне макрос, который сам макросы писать будет...."
Автор: wtt
Дата сообщения: 11.01.2005 20:47
Помогите.
В процессе выполнения программы требуется, что - бы она сама объявляла необходимое кол-во динамических массивов. Т.е. присваивала самостоятельно очередному массиву какое-нибудь имя (желательно в виде номера, если это возможно), задавала необходимую размерность.
Если кто-нибудь сталкивался с этим ,подтолкните в нужном направлении.
Сбросьте исходник с комментариями в мыло \ ПМ \ форум
Спасибо.
Автор: dneprcomp
Дата сообщения: 12.01.2005 01:19
wtt
В VB я бы попробовал об'явить data type, содержащий динамический массив
Type ааа
myArray() as integer
End Type
затем об'явил бы динамический массив
Dim sss() as aaa
Автор: wtt
Дата сообщения: 12.01.2005 11:16
dneprcomp
Про это я читал.Вопрос в том,как создать автоматически некоторое количество массивов(неизвестно какое кол-во,программа сама решает в результате сортировки данных),сохранить их в памяти на время работы програмы,а затем обработать их совместно...
Автор: Tropin
Дата сообщения: 12.01.2005 17:31
wtt
а влоб, что - памяти не хватает?
или на худой случай, что если воспользоваться дополнительным листом Экселя, который и будет представлять собой "некоторое количество массивов"...
Автор: wtt
Дата сообщения: 12.01.2005 20:39
Tropin
На счёт памяти размышлял,действительно объём данных может быть большой,но это всё-таки Long или Integer(в крайнем случае Single),и вообще как система работает,она что на жёстком диске место при необходимости не выделяет?
На листе экселя я работаю сейчас,выглядит всё это кривовато и медленнее чем могло бы без распечатывания,стоит задача от этого избавиться...

Добавлено
Уважаемые господа, попробую ещё раз конкретизировать:
В Visual Basic массивы определяются следующим образом:
Dim myArray (10) As Long
А можно ли вместо myArray вставить код\ссылку на код который бы возвращал всякий раз новое имя для очередного массива?
Вместо 10 вставить код\ссылку на код, который бы возвращал всякий раз новую размерность для очередного массива?
И таким образом создаются автоматически нужные массивы в необходимом количестве.
Автор: dneprcomp
Дата сообщения: 13.01.2005 00:23
wtt
Есть такая команда 'redim'
Я же специально об'явил безразмерные динамические массивы.
ReDim sss(3).myArray(10)
Можно задавать любую размерность массива, подставляя из переменных.
Т.о. массив myArray состоит из 10 переменных и таких массивов об'явлено 3.
Поиграйся с redim. Может можно сразу оба уровня назначать, а может надо последовательно. А может быть вообще так redim не сработает.
Можно еще использовать 'redim preserve'


Цитата:
новое имя для очередного массива

VB,как и все остальные языки програмирования, не работает с именами. Имена используются только в исходниках. После компиляции имен нет, одни ссылки.
Автор: Tropin
Дата сообщения: 13.01.2005 09:35
dneprcomp

Цитата:
как и все остальные языки програмирования

Это компилируемые, а VB - интерпретируемый. Я не знаю, но может в нем как в JS или Perl есть что-нибудь наподобе eval ну или что-то в этом роде, когда прямо в программе можно изменять саму программу...
Автор: wtt
Дата сообщения: 13.01.2005 11:24
dneprcomp

Цитата:
Т.о. массив myArray состоит из 10 переменных и таких массивов об'явлено 3.

То есть ты хочешь сказать,что можно одновременно объявить несколько массивов,и указать каждому свою собственную размерность...Это бы решило проблему.Будем посмотреть.
Автор: dneprcomp
Дата сообщения: 13.01.2005 11:30
Tropin
Я не знаю Perl и не знаю что делает eval.
Компьютер не работает с именами.
Цитата:
После компиляции имен нет, одни ссылки

Поэтому невозможно обратиться по имени к переменной, не описав ее и ее имя предварительно в исходнике. А вот выделить память и создать новую ссылку на эту область памяти можно. Правда не в VB, а, скажем, в С++.
Цитата:
когда прямо в программе можно изменять саму программу...
Честно говоря, не представляю себе такого.

Добавлено
wtt
Попробуй, потом расскажешь. Т.к. все это теоретические изыски
Цитата:
можно одновременно объявить несколько массивов
Я немного не точно описал. На самом деле это один массив. Просто каждый его член сам является массивом.
А вот размерность внутреннего массива myArray() наверное должна быть одинакова.




Добавлено
Можно еще посмотреть использование команды 'new'. Возможно, что лучше создать clas, а не type. И уже на его основе с помощью 'new' создавать новые массивы
Автор: Tropin
Дата сообщения: 13.01.2005 14:06
wtt
я конечно не ручаюсь за оптимальность, но посмотри это
Код: Private Type MyRecord
A() As Integer
End Type

Sub MySub()
Dim Mass() As MyRecord
n = 3 ' 4 массива

' Задаём размерность массива массивов
ReDim Mass(n)

' Задаём размерность 1-ого массива
k = 5
ReDim Mass(0).A(k)

' Задаём размерность i-ого массива
i = 1
k = 2
ReDim Mass(i).A(k)

' получаем массив из 4-х массивов
' обращаемся к ним как
i = 1 ' номер массива
j = 0 ' элемент i-ого массива
Mass(i).A(j) = 123

End Sub
Автор: dneprcomp
Дата сообщения: 14.01.2005 00:00
Tropin

Цитата:
Я не знаю, но может в нем как в JS или Perl есть что-нибудь наподобе eval ну или что-то в этом роде, когда прямо в программе можно изменять саму программу...


А сами вы по этим ссылкам смотрели? Вот по первой же _http://www.parser.ru/docs/lang/?opeval.htm дано определение:

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

Какое отношение имеет данный оператор к изменению программы прямо в программе и к задаче wtt?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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