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

» Excel VBA (часть 2)

Автор: AndVGri
Дата сообщения: 28.05.2007 19:16
gyurza2000
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Worksheets(1).Range("C1,E1:G1,I1:L1,A3:B13,D3:U13").ClearContents
End Sub
Автор: gyurza2000
Дата сообщения: 28.05.2007 19:33
Спасибо большое
Автор: Iriadna
Дата сообщения: 28.05.2007 23:52
Подскажите, плиз.
Изначальная задача была - написать программу в excel по обращению матриц.
Прогу написала в качестве макроса.
Изменили задачу: сделать в качестве функции.
Вставила в перечнь функций, ввод выбора дипозона сделала.
не поможете с выводом?в выделенный на листе диапазон.

и еще вопрос, если изменить в изначальном макросе ввод и вывод, а тело программы оставить таким же, в теории работать будет? Или для функции надо писать принципиально подругому?
Автор: AndVGri
Дата сообщения: 29.05.2007 00:53
Iriadna

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

Будет.

Код:
Public Function MatrixInvert(Byval inMatrix As Variant) As Variant
Dim rMatrix() As Double
'...
Redim rMatrix(1 To UBound(inMatrix.Value, 1), 1 To UBound(inMatrix.Value, 2))
'...
MatrixInvert = rMatrix
End Fuction
Автор: Iriadna
Дата сообщения: 29.05.2007 01:22
Спасибо большое)
А что делает UBound?

Да, есть.
Но нам дали задание написать это на VBA, хотя у нас вообще нет программирования и никогда не было и не будет.
Макрос я написала сама.
а вот переделать это в функцию никак не получается...уже несколько дней сижу.
Автор: AndVGri
Дата сообщения: 29.05.2007 02:04
Iriadna

Цитата:
что делает UBound?

Определяет значение верхнего индекса массива соответствующего измерения.
Так UBound(inMatrix.Value, 1) возвращает верний индекс массива данных по строкам, а UBound(inMatrix.Value, 2) - по столбцам). Данные в функцию передаются (при выделении нескольких ячеек) как объект Range, значения которого представляют собой двумерный массив типа Variant.
То есть, на входе двумерный массив inMatrix.Value(i, j), на выход матрица с той же размерностью rMatrix(i, j). Собственно осталось только обратить inMatrix.Value в rMatrix

Добавлено:
Iriadna
Наиболее просто

Код:
Public Function MatrixInvert(ByVal inMatrix As Variant) As Variant
MatrixInvert = Application.WorksheetFunction.MInverse(inMatrix.Value)
End Function
Автор: Iriadna
Дата сообщения: 29.05.2007 08:59
0_о и это все?! так просто..
у меня в макросе программа на 2листа А4... все ручками расписывала...

Спасибо огромное)))

и еще маленький вопрос, в VBA же есть список как бы встроенных функций,таких же, как MatrixInvert, например поиск определителя матрицы. Не подскажите, где можно посмотреть этои функции?
Автор: alin
Дата сообщения: 29.05.2007 09:13
Помогите, пожалуйста.
Имеется папка с файлами *.xls в каждом файле страницы с именем d.m (дата.месяц) на каждой странице находятся сводные данные(этой страницы): [more=здесь]
Наим-е Пок-тель1 Пок-тель2 Пок-тель3 Пок-тель4 Пок-тель5 Итого:
AL23    AM23     AN23   AO23     AP23     AQ23     СУММ(AM23:AQ23)
AL24    AM24     AN24     AO24     AP24     AQ24     СУММ(AM24:AQ23)
…     …     …     …     …     …     …
AL28    AM28     AN28     AO28     AP28     AQ28     СУММ(AM28:AQ28)[/more]
Как сделать, чтобы формировалась итоговая таблица из файлов и страниц в этих файлах такого вида за декаду, месяц, квартал, год (в отдельном файле):[more=здесь]
d.m Наим-е Пок-тель1 Пок-тель2  Пок-тель3 Пок-тель4 Пок-тель5    Итого:
…    AL23    AM23     AN23     AO23     AP23     AQ23     СУММ(AM23:AQ23)
…    AL24    AM24     AN24     AO24     AP24     AQ24     СУММ(AM24:AQ24)
…    …     …     …     …     …     …     …
…    AL28    AM28     AN28     AO28     AP28     AQ28     СУММ(AM28:AQ28)
…    ...     …     …     …     …     …     …[/more]
Например, на конец декады (месяца, квартала, года), я запускаю макрос, который просматривал в папке файлы (в них листы) и формировал отчётный файл.
Заранее благодарен.
Автор: AndVGri
Дата сообщения: 29.05.2007 10:28
alin
Может ты примерный набор файлов куда-нибудь выложишь? А то, как-то без исходных данных не думается, а фантазировать на эту тему не хочется.
Автор: alin
Дата сообщения: 29.05.2007 12:24
AndVGri
Вот, пожалуйста, образец с данными
PS: Файлы именуются датами для удобства, если есть необходимость можно присвоить им другие имена.
Автор: Sashun4ik
Дата сообщения: 29.05.2007 12:46
Привет всем.
Прошу срочненько ответить на мой вопрос, кто знает.
Мне необходимо с помощью VBA выделять ячейки так, чтобы после нажатия на кнопку формы я могла выделить необходимую мне ячейку на Листе, и её координаты запомнились в какие-то переменные.
Мне предложили такой вариант активирования ячейки и её поименования:
Cells(i, j).Activate
Selection.Name = "cx"

но при этом надо каким-то образом в i, j записать значения, а как?
Автор: AndVGri
Дата сообщения: 29.05.2007 13:14
Sashun4ik
Никто не знает как
Цитата:
Мне необходимо с помощью VBA выделять ячейки так

чтобы
Цитата:
выделить необходимую мне ячейку на Листе

так что выделять ячейку, ячейки, на основании какого критерия это всё выбирается? Не, никто не знает, думаю что и ты
Автор: Sashun4ik
Дата сообщения: 29.05.2007 13:20
Я неправильно объяснила, наверно.
Мне надо выбрать ячейку, чтобы потом с ней работать дальше, но я заранее не знаю адреса ячейки, т.е. не могу выдлить конкретную ячейку например А2. Мне нужно создать кнопку, которая будет давать мне возможность вручную выделить ячейку на Листе, с которой я в дальнейшем буду делать преобразования.
Автор: AndVGri
Дата сообщения: 29.05.2007 13:55
Sashun4ik
А тогда понятно. Кнопка на форме? Форма по-умолчанию запускается как модальная. Тогда поставь свойство формы ShowModal в False, тогда сможешь взаимодействовать с рабочим листом, что-то там выделить, и даже не прибегая к специальной кнопке. Или запускай форму из процедуры вызова
UserForm1.Show vbModeless
Автор: Sashun4ik
Дата сообщения: 29.05.2007 14:17
Большое спасибо за помощь!
Автор: Iriadna
Дата сообщения: 29.05.2007 20:43
Подскажите пожалуйста, как заставить матрицу считываться с диапазона?
т.е. в любом месте листа excel есть матрица, выделяешь ее диапазон. Необходимо, чтобы программа дальше работала именно с выделенной матрицей, выделенным диапазоном. Причем диапазон этот выделяется в диалоговом окне функции. Подскажите, плиз, как сделать?
Автор: AndVGri
Дата сообщения: 30.05.2007 00:49
Iriadna

Цитата:
выделяется в диалоговом окне функции
??? Вроде как существует стандартный диалог мастера функций, а это какой?
Автор: Litium75
Дата сообщения: 30.05.2007 19:23
Подскажите пожалуйста, как создать функцию которая вычисляет сумму значений ячеек, которые выделены зелёным цветом фона ячейки и самое главное чтобы сумма пересчитывалась автоматически после каждого случая изменения цвета фона ячейки.

Создать фунцию у меня получилось, но привязать обновление значения вычисляемой суммы так и не удалось, т.к. нет такого события в стандартном перечне событий, как изменение цвета фона ячейки.
Автор: AndVGri
Дата сообщения: 31.05.2007 03:33
Litium75

Цитата:
т.к. нет такого события в стандартном перечне событий

Так если нет, то как? И на F9 не желает пересчитывать, увы, повторный ввод в область данных функции. Или создаёшь кнопку и вешаешь на неё процедуру полного пересчёта

Код:
Public Sub Refresh
Application.CalculateFull
End Sub
Автор: Litium75
Дата сообщения: 31.05.2007 10:27
Спасибо за ответ, но всётаки хотелось бы создать новое событие
можно ли с помошью создания нового класса объявить новое событие (изменение цвета фона ячейки)?

если кто нибудь что нибудь знает по этому вопросу подскажите пожалуйста.
Автор: AndVGri
Дата сообщения: 31.05.2007 10:39
Litium75

Цитата:
но всётаки хотелось бы создать новое событие

Обратись в Microsoft
Автор: Litium75
Дата сообщения: 31.05.2007 10:41
ведь тогда функция будет работать как обычная функция без нажатия каждый раз кнопок или повторных вводов данных.

очень нужно подскажите пожалуйста
Автор: AndVGri
Дата сообщения: 31.05.2007 12:04
Litium75
[more=Внимательно прочти]
RaiseEvent Statment Example
The following example uses events to count off seconds during a demonstration of the fastest 100 meter race. The code illustrates all of the event-related methods, properties, and statements, including the RaiseEvent statement.

The class that raises an event is the event source, and the classes that implement the event are the sinks. An event source can have multiple sinks for the events it generates. When the class raises the event, that event is fired on every class that has elected to sink events for that instance of the object.

The example also uses a form (Form1) with a button (Command1), a label (Label1), and two text boxes (Text1 and Text2). When you click the button, the first text box displays "From Now" and the second starts to count seconds. When the full time (9.84 seconds) has elapsed, the first text box displays "Until Now" and the second displays "9.84"

The code for Form1 specifies the initial and terminal states of the form. It also contains the code executed when events are raised.

Option Explicit

Private WithEvents mText As TimerState

Private Sub Command1_Click()
Text1.Text = "From Now"
Text1.Refresh
Text2.Text = "0"
Text2.Refresh
Call mText.TimerTask(9.84)
End Sub

Private Sub Form_Load()
Command1.Caption = "Click to Start Timer"
Text1.Text = ""
Text2.Text = ""
Label1.Caption = "The fastest 100 meters ever run took this long:"
Set mText = New TimerState
End Sub

Private Sub mText_ChangeText()
Text1.Text = "Until Now"
Text2.Text = "9.84"
End Sub

Private Sub mText_UpdateTime(ByVal dblJump As Double)
Text2.Text = Str(Format(dblJump, "0"))
DoEvents
End Sub

The remaining code is in a class module named TimerState. Included among the commands in this module are the Raise Event statements.

Option Explicit
Public Event UpdateTime(ByVal dblJump As Double)
Public Event ChangeText()

Public Sub TimerTask(ByVal Duration As Double)
Dim dblStart As Double
Dim dblSecond As Double
Dim dblSoFar As Double
dblStart = Timer
dblSoFar = dblStart

Do While Timer < dblStart + Duration
If Timer - dblSoFar >= 1 Then
dblSoFar = dblSoFar + 1
RaiseEvent UpdateTime(Timer - dblStart)
End If
Loop

RaiseEvent ChangeText

End Sub
[/more]
как организована работа и вызов событий, подумай, стоит ли задавать нужно-вопрос?


Добавлено:
Если уж очень невмоготу, то сходи сюда, организуй таймер по вызову пересчёта через заданный промежуток времени или воспользуйся SelectionChange
Автор: Dementei
Дата сообщения: 31.05.2007 14:20
Народ помогите тугодуму.
Есть столбец, в нем 5 строк.
В них как положительные так и отрицательные числа.
Нужно не обращая на знаки внимания найти максимальное из них.
Дополнительный столбец в кот. модули можно записать и уже из него находить максимальное не катит.
Надо чтоб был тока один столбец.
Спасибо.
Автор: AndVGri
Дата сообщения: 31.05.2007 14:45
Dementei
Ну, так и напиши свою функцию, которая будет искать максимальное по модую
Автор: Dementei
Дата сообщения: 31.05.2007 15:34
Как ее написать-то?
Я нуб в excele.
Автор: AndVGri
Дата сообщения: 31.05.2007 15:43
Dementei
У-гу, и не в том разделе спрашиваешь (Excel FAQ)
Автор: SERGE_BLIZNUK
Дата сообщения: 01.06.2007 06:20

Цитата:
организуй таймер по вызову пересчёта через заданный промежуток времени или воспользуйся SelectionChange

мне кажется, таймер - это очень жестоко по потреблению ресурсов!
через SelectionChange эта задача решается достаточно просто.
Единстенные недостаток - после изменения цвета ячейки с неё надо уйти на любую другую (иначе SelectionChange не отработает!)
Автор: Oyger
Дата сообщения: 01.06.2007 12:00
Подскажите.
С помощью макроса поиском нахожу ячейку с нужной мне инфой. Она становится выделенной - select.
А как мне выдрать из текущей ячейки ее координаты:
x - строка выделенной ячейки;
y - столбец выделенной ячейки.
Всем спасибо.
Автор: GFSGF
Дата сообщения: 01.06.2007 12:10
Добрый день. Как сделать чтобы открытая книга автоматически сохранялась , допустим каждые 10 минут. Почему то в параметрах , в отличии от Word , этого нет. Я имею ввиду не автовостановление , а автосохранение .Спасибо

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

Предыдущая тема: Написание своего HyperTerminal для считывания данных


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