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

» Excel VBA

Автор: kandi
Дата сообщения: 19.02.2007 09:28
Оставил вопрос еще 12-02-2007. Прождал неделю. Неужели такая сложная задача, что никто не может помочь?
Прошу прощения за назойливость и повторяю вопрос еще раз:

Цитата:
На листе Excel расположено N-ое количество однотипных табличек с данными. Возле каждой из них находится управляющий элемент - ActiveX command button, по нажатию на который происходит обработка данных соответствующей таблички, строится отчет и выводится на принтер. Задача в том, чтобы каким-то образом определить до обработки данных и построения отчета КАКОЙ именно ActiveX command button был нажат, т.е. либо в переменной, либо в произвольной ячейке получить уникальный идентификатор нажатой кнопки.
Автор: The okk
Дата сообщения: 19.02.2007 12:34
kandi
Просто не ясна суть вопроса - при нажатии на кнопку вызывается назначенный ей макрос. Т.е. определять что-либо, по сути, не нужно.

З.Ы.: Народ, как называется функция минимума в ВБА?
Автор: aar
Дата сообщения: 19.02.2007 13:06
The okk

Цитата:
З.Ы.: Народ, как называется функция минимума в ВБА?

http://www.visualbasic.happycodings.com/Applications-VBA/code8.html

[more=Functions for calculating the Min, Max and StdDev]Functions for calculating the Min, Max and StdDev

The following functions can be used to calculate the minimum, maximum and standard deviation of a list of arguments.

Option Explicit


'Purpose : Returns the Minimum value from a parameter Array
'Inputs : avValues() as Variant
'Outputs : The Min Value contained within the input (excluding empty values)

'Notes : Examples:
' Min(1,2,empty,-1) Returns -1
' Min(Array(1,2,-1),-4,-9.9) Returns -9.9
' Min(1/Jan/99,2/Jan/99) Returns 1/Jan/99
'Revisions :

Function Min(ParamArray avValues() As Variant) As Variant
Dim vThisItem As Variant, vThisElement As Variant

On Error Resume Next
For Each vThisItem In avValues
If IsArray(vThisItem) Then
For Each vThisElement In vThisItem
Min = Min(vThisElement, Min)
Next
Else
If vThisItem < Min Then
If Not IsEmpty(vThisItem) Then
Min = vThisItem
End If
ElseIf IsEmpty(Min) Then
Min = vThisItem
End If
End If
Next
On Error GoTo 0
End Function

'Purpose : Returns the Maximum value from a parameter Array
'Inputs : avValues() as Variant
'Outputs : The Max Value contained within the input (excluding empty values)
'Notes : Examples:
' Max(1,2,empty,-1) Returns 2
' Max(Array(1,2,-1),-4,-9.9) Returns 2
' Max(1/Jan/99,2/Jan/99) Returns 2/Jan/99
'Revisions :

Function Max(ParamArray avValues() As Variant) As Variant
Dim vThisItem As Variant, vThisElement As Variant

On Error Resume Next
For Each vThisItem In avValues
If IsArray(vThisItem) Then
For Each vThisElement In vThisItem
Max = Max(vThisElement, Max)
Next
Else
If vThisItem > Max Then
If Not IsEmpty(vThisItem) Then
Max = vThisItem
End If
ElseIf IsEmpty(Max) Then
Max = vThisItem
End If
End If
Next
On Error GoTo 0
End Function


'Purpose : Returns the Average of many things, they could be dates or numbers.
'Inputs : avValues A 1D Array of Values to evaluate
'Outputs : The average value of the input parameters


Function Average(ParamArray avValues() As Variant) As Variant
Dim vTotal As Variant, lThisItem As Variant, vThisElement As Variant, lItems As Long

For Each lThisItem In avValues
If IsArray(lThisItem) Then
For Each vThisElement In lThisItem
If Not IsEmpty(vThisElement) And IsNumeric(vThisElement) Then
vTotal = vTotal + vThisElement
lItems = lItems + 1
End If
Next
ElseIf Not IsEmpty(lThisItem) And IsNumeric(lThisItem) Then
vTotal = vTotal + lThisItem
lItems = lItems + 1
End If
Next
If lItems Then
Average = vTotal / lItems
End If
End Function

'Purpose : Calculate the Standard Devation of a population
'Inputs : avValues. A 1D Array of Values.
' [avWeights]. A 1D Array of weights. If supplied the function
' will calculated a weighted standard deviation.
'Outputs : The Standard Deviation or N/A if less than three values


Function StdDevP(avValues As Variant, Optional avWeights) As Variant
Dim dThisWeight As Double, lThisItem As Long
Dim dValue1 As Double, dValue2 As Double, dSumWeights As Double

On Error GoTo ErrFailed
If UBound(avValues) - LBound(avValues) >= 3 Then
'Have more than three values
dThisWeight = 1
For lThisItem = LBound(avValues) To UBound(avValues)
If IsArray(avWeights) Then
dThisWeight = avWeights(lThisItem)
End If
dValue1 = dValue1 + (dThisWeight * avValues(lThisItem) * avValues(lThisItem))
dSumWeights = dSumWeights + dThisWeight
dValue2 = dValue2 + (dThisWeight * avValues(lThisItem))
Next
dValue1 = dValue1 / dSumWeights
dValue2 = (dValue2 / dSumWeights) ^ 2
'Abs prevents a run time if round errors occur
'which make the number negative
StdDevP = Abs(dValue1 - dValue2) ^ 0.5
Else
'Require three values
StdDevP = "N/A"
End If
Exit Function

ErrFailed:
Debug.Print "Error in StdDevP: " & Err.Description
StdDevP = "N/A"
End Function[/more]

Добавлено:
(c) Google
Автор: The okk
Дата сообщения: 19.02.2007 13:14
aar
Спасибо, но функцию минимума-максимума написать я могу самостоятельно написать на любом языке.
Думаю, в случае Excel быстрее уложить массив на лист и найти через WroksheetFunction максимум и минимум.
Я спрашивал про "родной" метод VBA. А то даже включив показ скрытых мемберов, не нашел в object browser ничего похожего.
Автор: aar
Дата сообщения: 19.02.2007 13:26
The okk
http://www.google.ru/search?q=min+vba+function
http://www.avdf.com/apr98/art_ot003.html

Цитата:
VBA doesn't have a Max or Min function
Автор: kandi
Дата сообщения: 19.02.2007 22:30
The okk
Макрос действительно вызывается. Но таких кнопок очень много, а макрос очень длинный и одинаковый для всех кнопок, за исключением кучи ссылок. Предполагаю, что есть возможность подставлять в каждый макрос не абсолюные адреса ячеек, а вычислять их, используя уникальный идентификатор кнопки. Но для этого его надо получить. Как?
Автор: RMKusto
Дата сообщения: 20.02.2007 11:00
Всем привет!

Кто может помочь решить такую задачку:

Существует база в экселе в одном файле...

Пример:
Дата Номер Категория и ещё полей 5-6

1.02.06 44 Фото ...
1.02.06 44 Текст ...
2.02.06 45 Фото ...
2.02.06 45 Текст ...



Нужно в другом файле сделать отчёт. По например первому числу и только фото и нужные поля, и второй отчёт по первому числу и только тексту с нужными полями.

Вопрос:

1) Какой коммандой открыть другой файл?
2) Какой коммандой Сделать поиск по базе с учётом даты/номера и категории.
3) Какой коммандой Скопировать нужные поля по отношению к запросу и вставить в нужную строку отчёта.
4) Когда все поля где сходится дата/номер и нужная категория скопированы, какой коммандой прекратить операцию.
5) Какой коммандой сохранить резултатты отчёта в новом файле, и назвать его по номеру и категории: например 44foto, 44tekst. Сам файлик отчёта оставить пустым, чтобы можно было и далее одной кнопкой делать нужный отчёт.

Прошу прощения, если эти вопросы уже обсуждались.

Автор: dunamis
Дата сообщения: 20.02.2007 12:03
Подскажите плиз! Можно ли данные из сводной таблицы преоброзавать а обычную таблицу, если данные в свобдную таблицу заносятся из аксес?
Автор: gince
Дата сообщения: 20.02.2007 16:10
Zdrastvuite.
Neobizaites za latinskie bukvy.
V UserForms1 naxoditsia tri OptionButton(1-3). Pri otkrytii Excel vypolniaetsia UserForm1.Show.
Vapros takoi:
- nado cto aktivnym vsegda byl Sheet1, kak vkliucion OptionButton1 ili inace vkliucalsia OptionButton1.
- pri vkliucenii OptionButton2 dolzen pod UserForn1 otkrytsia Sheet2 i stat aktivnym
- pri vkliucenii OptionButton3 dolzen pod UserForn1 otkrytsia Sheet3 i stat aktivnym
- i kuda eto vsio polozit ( otdelnyi modul, workbook, userform)
Автор: gince
Дата сообщения: 21.02.2007 08:31
Zdrastvuite
OptionButton atkryvaet Shett'y .Sdelal sam. Akazyvaetsia eto prosto. No drygoi vapros:
Nna toi ze UserForm1 est ListBox1, kotoryi imeet dannye s diapazona A2:D40. B Propertie ja specialno neykazal c kokovo Sheet'a brat dannye, potomu cto nado pri vkliucenii OptionButton1 (atkryvaetia Sheet1) v ListBox'e videt dannye s Sheet1 A2:D40, pri vkliucenii OptionButton3 (atkryvaetia Sheet2) v ListBox'e videt dannye s Sheet2 A2:D40.
A u menia Sheet'y perekliucajutsia, a dannye ne meniajutsia.

P.S. est neskolko eBook po etomy dely:
(E-Book)_Excel_2002_Power_Programming_With_Vba_By_John_Wiley_&_Sons.pdf,(ENG)
McGraw.Hill.Osborne.Excel.VBA.Macro.Programming.eBook-LiB.chm(ENG)
Profisionallnoe programirovanie VBA Excel 2002.pdf (RU)
Mozet komy nado. Kuda ich kinut? JKa sam po Angliski neponimaju, probuju vcio i takim obrazom probuju naiti to cto nado
Автор: Anton T
Дата сообщения: 21.02.2007 09:15
RMKusto

Цитата:
2) Какой коммандой Сделать поиск по базе с учётом даты/номера и категории.

посмотри предыдущие несколько страниц, я делал фильтр.
Автор: Troitsky
Дата сообщения: 21.02.2007 12:49
Maxximus75

Цитата:
...ячейка с датой напротив фамилии окрашивается в красный цвет (условным форматированием).
...
Игрался вот с этим но ничего не получается

разумеется, при использовании условного форматирования, формат ячейки в случае его срабатывания не изменяется, т.е. заливка ячейки (свойство .Interior.ColorIndex) какой была такой и осталась.

Цитата:
Вопрос: Как на VBA выполнить поиск людей у которых вышли проверки скопировать фамилии данных людей и вставить в другой столбец.

Одно из решений, как говорится, в лоб: не мудрить и все те проверки, которые делаются при условном форматировании, выполнить в VBA.


Добавлено:
kandi

Цитата:
Макрос действительно вызывается. Но таких кнопок очень много, а макрос очень длинный и одинаковый для всех кнопок, за исключением кучи ссылок. Предполагаю, что есть возможность подставлять в каждый макрос не абсолюные адреса ячеек, а вычислять их, используя уникальный идентификатор кнопки. Но для этого его надо получить. Как?

В VBA, в отличие от VB, отсутствует возможность создавать массивы элементов управления и использовать для обработки их событий одну процедуру Поэтому не совсем понятно, что подразумевается под "уникальным идентификатором кнопки"?
Автор: Dima11111
Дата сообщения: 21.02.2007 14:22
Привет свем !
Помогите пожалуйста решить приметивную задачку, я в VBA полный профан.

Есть лист Excel, две колонки - первая с числами, вторая с датами. Есть два выпадающих списка и кнопочка, по нажатию которой нужно посчитать сумму чисел для диапазона дат находящихся между двумя выбранными в выпадающих списках. Кнопочку и списки повесил, а как пробежаться и проссумировать не знаю. Помогите пожалуйста.
Автор: jONES1979
Дата сообщения: 21.02.2007 15:57

Цитата:
kandi

Цитата:Макрос действительно вызывается. Но таких кнопок очень много, а макрос очень длинный и одинаковый для всех кнопок, за исключением кучи ссылок. Предполагаю, что есть возможность подставлять в каждый макрос не абсолюные адреса ячеек, а вычислять их, используя уникальный идентификатор кнопки. Но для этого его надо получить. Как?


а нельзя оставить одну кнопку и вызывать из её обработчика тот же макрос, но с разными параметрами, в зависимости от текущей активной "критичной" ячейки ?
Автор: Maxximus75
Дата сообщения: 21.02.2007 16:22
Troitsky

Dim r As Range

Application.FindFormat.Interior.ColorIndex = 3

Set r = Cells.Find(What:="", after:=ActiveCell, SearchFormat:=True)
If Not r Is Nothing Then r.Copy

Range("J2").Insert
Range("J2").ClearFormats
Application.FindFormat.Clear

End Sub

Чего то не очень понял как это свойство .Interior.ColorIndex не изменяется, там ищется формат ячейки с помощью вот этого Application.FindFormat.
тоесть если .Interior.ColorIndex = 3 то он останавливается на этой ячейки и копирует ее, потом надо все это зациклить и пустить по всему листу в поисках нужных ячеек красного цвета. Попробуй сам этот макрос, он найдет первую ячейку с форматом красного цвета скопирует ее и вставит в J2, но дальше он так и будет вставлять эту красную ячейку в J3, J4, итд. тоесть дальше поиска не происходит. Я просто не понимаю как работает эта функция Application.FindFormat.
Автор: Troitsky
Дата сообщения: 21.02.2007 17:43
Maxximus75
Объясняю еще раз. Ты применил к ячейке условное форматирование и в случае его срабатывания изменился цвет ячейки, но заливка ячейки какой была такой и осталась, т.е. свойство .Interior.ColorIndex не изменилось. Попробуй сделать вручную то, что ты пытаешься программно реализовать, и увидишь, что все не так просто
Автор: Yuk
Дата сообщения: 22.02.2007 00:04
kandi
Определить положение кнопки можно, например, так:

Код: Set tlc = CommandButton1.TopLeftCell
Set brc = CommandButton1.BottomRightCell
Set areaaround = CommandButton1.TopLeftCell.CurrentRegion
Автор: AndVGri
Дата сообщения: 22.02.2007 07:56
Yuk


Цитата:
Вот что я не нашел, так это как обратиться к кнопке (или другому ActiveX контролю) на листе через процедуру, то есть не зная имя контроля. Me как ни странно возвращает ссылку на сам лист, а не на контроль. Может через класс можно?
Без этого надо в код каждой кнопки вставлять CommandButton1, CommandButton2 и т.д.


Не совсем понял Ваш вопрос. Можно приблизительно так.

1. Если кнопка вставлена на лист из группы "Формы"
Тогда циклом по
Set wks = Worksheets(k)
wks.Buttons(i).Name
находим нужную кнопку по имени

2. Если кнопка была вставлена из редактора VBA, то есть как OLE объект

тогда цикл будет

Set wks = worksheets(k)
....
If wks.OLEObjects(i) Is CommandButton Then
If wks.OLEObjects(i).Name = "CommandButton1"
....
End If

Необходимые проверки пропустил, извините за лень
Автор: The okk
Дата сообщения: 22.02.2007 08:37
AndVGri

Цитата:
Не совсем понял Ваш вопрос.

Имелось в виду обращение к объекту не как к элементу (массива, класса, коллекции), а как к контексту (как Me для формы или ЭтаКнига для книги).

kandi
А макрос с параметром вызывается так:
'Макрос "параметры" '
Т.е. вся запись в одинарных кавычках ('), а сами параметры - в двойных ("").
Каждой кнопке назначаешь один и тот же макрос только каждый раз подставляешь нужные параметры.
Но если кнопок порядка сотни, лучше сделать цикл в VBA и в нем, как советовал Yuk пройтись по всем участкам ,если, конечно, имеет место отделение одной таблицы от другой пробелами.
Автор: w25
Дата сообщения: 22.02.2007 12:31
Можно написать макрос, чтоб скопировать все названия листов в столбик на 1 листе?
Автор: The okk
Дата сообщения: 22.02.2007 12:40
w25

Код: Sub CopySheetNames()
Dim ws As Worksheet

With Application
.ScreenUpdating = False
For Each ws In Worksheets
Cells(Rows.Count, 1).End(xlUp).Offset(1) = ws.Name
Next ws
.ScreenUpdating = True
End With
End Sub
Автор: w25
Дата сообщения: 22.02.2007 12:59
The okk
Спасибо.
Автор: aar
Дата сообщения: 22.02.2007 13:44
Подскажите, пожалуйста.

Хочу использовать пару десятков цветов — оттенков, скажем, зеленого — для выделения ячеек. По умолчанию в книге есть 56 предопределенных цветов. Пытаюсь их заменить на свои:

Код:
For I = 1 To 56
ActiveWorkbook.Colors(I) = RGB(0, I * 4, 0)
Next I
Автор: Yuk
Дата сообщения: 22.02.2007 17:53
aar
Почему же не получается?
Попробуй:
Код: Sub TestColors()
For Each c In Range("A1:A56")
c.Value = c.Row
c.Interior.ColorIndex = c.Value
c.Font.ColorIndex = 56 - c.Value
Next c
End Sub
Автор: aar
Дата сообщения: 22.02.2007 21:46
Yuk
Верно, все работает. Большое спасибо!
Смутило, что в менюшке цвета куда попало, на цвете ячеек не стал пробовать.
Автор: olik22
Дата сообщения: 23.02.2007 23:45
Доброй ночи всем, у меня возникла такая проблема, помогите...
Есть 2 листа, на одном 8 таблиц(они одинаковы, но там разные формулы и значения). На другом листе находится 8 combobox, в которых названия етих 8 таблиц. Возможно ли сделать так 4то при выборе в comboboxe грузились разные таблицы
Срочно нужна помощь


Вроде нашел выход, но возникла другая проблема, ексел нормально не копирует формулы, у меня все формулы по сбивались

Select Case ComboBox1.ListIndex

Case 0
Worksheets("Paskirstymas").Range("B4:N40").Copy _
Worksheets("Paskirstymas").Range("B4:N40")
Case 1
Worksheets("Paskirstymas").Range("B45:N81").Copy _
Worksheets("Paskirstymas").Range("B4:N40")
Case 2
Worksheets("Paskirstymas").Range("B86:N122").Copy _
Worksheets("Paskirstymas").Range("B4:N40")
Case 3
Worksheets("Paskirstymas").Range("B127:N163").Copy _
Worksheets("Paskirstymas").Range("B4:N40")

может кто подскажет как сделать 4то бы ексел нормально копировал формулы?
Автор: kandi
Дата сообщения: 25.02.2007 11:53
jONES1979, Yuk, AndVGri, The okk
Большое спасибо за советы. Попробую переварить и реализовать. Потом поделюсь.
Автор: Olive77
Дата сообщения: 26.02.2007 12:54
Кто знает?
Как можно проверить, есть ли соединение с интернетом (в общем случае)?
Автор: saurian
Дата сообщения: 26.02.2007 14:55
кто подскажет как выслать готовый документ на конкретно заданный ящик
Допустим activedocument нужно отправить на 123@mail.net
пробовал sendmail, но вроде он не позволяет в параметрах указать конкретный ящик или я чего-то не углядел.
Автор: Troitsky
Дата сообщения: 26.02.2007 15:29
Olive77

Цитата:
есть ли соединение с интернетом (в общем случае)?

http://www.vbnet.ru/subscribe/showsubscribe.asp?id=56#cunning1

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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