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

» Excel VBA

Автор: tec4
Дата сообщения: 06.03.2007 04:41

Цитата:
tec4
Вот такой макрос повесь на кнопку (кнопку ты сам на лист поставь ):

Код:Sub itog()
Cells(Rows.Count, 1).End(xlUp).Offset(1) = _
WorksheetFunction.Sum(Columns(1))
End Sub

Жирные единички - это номер столбца. Для столбца B будет 2, C -3 и т.д.


Спасибо большое! Попробую.
Автор: ivanovoleg79
Дата сообщения: 06.03.2007 15:56
Имеется следующий макрос

Sub FiveMinutDiagramUpdate()
i = 6
StartRange1 = StartRange1Base + DataCount * i
StartRange2 = StartRange2Base + DataCount * i
StartRange3 = StartRange3Base + DataCount * i
TextRange0 = "R181C1:R211C1"
Worksheets(1).Activate
Set SeriesRange0 = Range(Cells(StartRange1, 1), Cells(StartRange1 + DataCount, 1))
Set SeriesRange1 = Range(Cells(StartRange1, 2), Cells(StartRange1 + DataCount, 2))
Set SeriesRange2 = Range(Cells(StartRange2, 2), Cells(StartRange2 + DataCount, 2))
Set SeriesRange3 = Range(Cells(StartRange3, 2), Cells(StartRange3 + DataCount, 2))
Charts(1).Activate
ActiveChart.SetSourceData Source:=Union(SeriesRange0, SeriesRange1, SeriesRange2, SeriesRange3), PlotBy:=xlColumns
End Sub
~~~
для простоты переменная, значение которой вводится пользователем заменена на i
~~~
В таком виде работает и у пользователей вроде пока еще нет замечаний, но ....
Меня неудовлетворяют следующие строки (хотелось бы без них обойтись)
Worksheets(1).Activate
Charts(1).Activate
Три дня пытаюсь что-то сделать - ошибки...
Автор: The okk
Дата сообщения: 06.03.2007 17:07
ivanovoleg79

Цитата:
Sub FiveMinutDiagramUpdate()
i = 6
StartRange1 = StartRange1Base + DataCount * i
StartRange2 = StartRange2Base + DataCount * i
StartRange3 = StartRange3Base + DataCount * i
TextRange0 = "R181C1:R211C1"
Worksheets(1).Activate
Set SeriesRange0 = Range(Cells(StartRange1, 1), Cells(StartRange1 + DataCount, 1))
Set SeriesRange1 = Range(Cells(StartRange1, 2), Cells(StartRange1 + DataCount, 2))
Set SeriesRange2 = Range(Cells(StartRange2, 2), Cells(StartRange2 + DataCount, 2))
Set SeriesRange3 = Range(Cells(StartRange3, 2), Cells(StartRange3 + DataCount, 2))
Charts(1).Activate
ActiveChart.SetSourceData Source:=Union(SeriesRange0, SeriesRange1, SeriesRange2, SeriesRange3), PlotBy:=xlColumns
End Sub


Цитата:
Меня неудовлетворяют следующие строки (хотелось бы без них обойтись)

Только эти?

Код: Sub FiveMinutDiagramUpdate()
i = 6
StartRange1 = StartRange1Base + datacount * i
StartRange2 = StartRange2Base + datacount * i
StartRange3 = StartRange3Base + datacount * i
TextRange0 = "R181C1:R211C1"
With Worksheets(1)
Set SeriesRange0 = .Cells(StartRange1, 1).Resize(datacount, 2)
Set SeriesRange2 = .Cells(StartRange2, 2).Resize(datacount)
Set SeriesRange3 = .Cells(StartRange3, 2).Resize(datacount)
End With
Charts(1).SetSourceData Source:=Union(SeriesRange0, _
SeriesRange2, SeriesRange3), PlotBy:=xlColumns
End Sub
Автор: ivanovoleg79
Дата сообщения: 06.03.2007 18:08
The okk, большое спасибо (сегодня уже начал читать про Resize & Offset)
Как всегда решение на поверхности, которое сам не увидел.
Автор: olinka1986
Дата сообщения: 06.03.2007 20:36
Ogromnoe vsem spasibo...Ja razobralas..urraa..zarabotalo!! ))
Автор: tavit1
Дата сообщения: 07.03.2007 05:30
Всем привет!
пишу в UserForm2:
обьявляю глобально:
Public r As Date

затем:
Private Sub MonthView1_DateClick(ByVal DateClicked As Date)
r = UserForm2.MonthView1.Value
Unload UserForm2
End Sub

теперь в модуле:
Private Sub Макрос2()
UserForm2.Show
n = UserForm2.r
MsgBox n
End Sub

В итоге выдаёт 0:00:00 а должна быть нажатая в календаре дата,где ошибка?
Автор: The okk
Дата сообщения: 07.03.2007 05:59
tavit1

Код: Private Sub MonthView1_DateClick(ByVal DateClicked As Date)
UserForm2.Hide
End Sub

Private Sub Макрос2()
MsgBox UserForm2.MonthView1.Value
End Sub
Автор: tavit1
Дата сообщения: 07.03.2007 11:40
Спасибо UserForm2.Hide не хватало
А всё-таки если нужно будет выгрузить форму и оставить в памяти переменную
на моём примере как это будет выглядеть ?

пробовал в UserForm2:

Private Sub MonthView1_DateClick(ByVal DateClicked As Date)
Static r As Date
r = UserForm2.MonthView1.Value
Unload UserForm2
End Sub

теперь запускаю форму из модуля:

Private Sub Макрос2()
UserForm2.Show
n = UserForm2.r
MsgBox n
End Sub

переменной r нет в памяти.
Автор: The okk
Дата сообщения: 07.03.2007 12:08
tavit1

Цитата:
А всё-таки если нужно будет выгрузить форму

А зачем?

Цитата:
оставить в памяти переменную
на моём примере как это будет выглядеть ?

На твоем наверное никак, поскольку в данном коде:

Цитата:
Private Sub MonthView1_DateClick(ByVal DateClicked As Date)
Static r As Date

r (статическая) будет локальной переменной и не может быть использована в других процедурах (в частности, в Макрос2()). Её значение сохраняется только для процедуры, в которой она объявлена.
Вообще, я не советую использовать static, если можно прекрасно обойтись без него.
Автор: Pantera3587
Дата сообщения: 07.03.2007 17:12
Кто подскажет? В экселевской книге есть два листа:Комплектующие и периферия, где дан список (данная таблица занимает диапазон А:F) и Оглавление, где в столбце А указаны категории, например, Серверы НИКС, Компьютеры NIX на базе Intel и т.д. Вообще то это прайс NIX.zip, который скачан с www.nix.ru. Оглавление создано в виде гиперссылок, при нажатии на которые открывается лист Комплектующие и периферия (записей 6829) и выделяется диапазон согдасно оглавления (записей 351).
Вопрос. Кто поможет написать код (если это конечно, возможно), чтобы при выделении гиперссылки(оглавление) это оглавление (название) добавлялось бы в выделенный диапазон по столбцу I. А было бы лучше, если бы сразу при нажатии, например, кнопки Присвоить категорию, всему списку по столбцу I добавилась бы соответствующая категория (оглавление).
Данный прайс используется в акцесевской базе (связь с экселевским файлом), где нужно, чтобы комплектующим и периферии была присвоена соответствующая категория (оглавление). Это нужно для дальнейшего создания базы.

Помогите, пожайлуста!
Автор: Pantera3587
Дата сообщения: 08.03.2007 16:46
Дополнение к предыдущему вопросу. Делаю форму, куда помещаю ListBox (ListBox1) и кнопку (CommandButton1). Для кнопки назначаю код:
Private Sub CommandButton1_Click()
Dim UsedRange As Range
Dim w As Variant
Dim w1 As Variant
Dim i As Integer
Dim j As Integer
Set w = Sheets("Комплектующие и периферия")
Set w1 = Sheets("Оглавление")

j = ListBox1.Text
For i = 1 To w.UsedRange.Rows
w.Cells(UsedRange.Rows, 7).Value = j
Next i
End Sub
Не могу сообразить, как мне назначить для выделенного текста из списка соответствующее значение с листа Оглавление. Смысл в следуюущем: выделяя соответствующий текст в в списке и нажимая кнопку должен выделится соответствующий диапазон на листе Комплектующие и периферия и рядом с выделенным диапазоном (в столбце F) вставится текст выделенный в списке во все ячейки выделенного диапазона листа Ком и пер..
Автор: DonkeyHottt
Дата сообщения: 08.03.2007 20:38
Есть макрос, хранящийся в "Личной книге макросов" При его выполнении в ячейки одного (активного) листа книги, например A1 F3 H8, записываются данные, например x y z, а мне нужно, чтобы все повторилось также во всех активных листах всех открытых книг - в те же ячейки - те же данные. Что нужно дописать в этом макросе? Заранее спасибо.
Автор: SERGE_BLIZNUK
Дата сообщения: 09.03.2007 05:53
DonkeyHottt
Все ссылки вида Thisworkbook. или у которых не указана книга совсем (например ActiveWorkSheet) нужно заменить (дополнить) на ActiveWorkBook.
для иллюстрации моих слов, попробуйте поместить в вашу книгу с макросами код:
NameThis = ThisWorkbook.Name
NameActive = ActiveWorkbook.Name
MsgBox " NameThis = " & NameThis & " NameActive = " & NameActive
и выполнить его, находясь в рабочей книге.
Автор: AndVGri
Дата сообщения: 09.03.2007 13:35
DonkeyHottt

Организуй цикл

For i = 1 To Workbooks.Count
If TypeName(Workbooks(i).ActiveSheet) = "Worksheet" Then
Workbooks(i).ActiveSheet.Range("A1").Value = x
...
End If
Next i

Автор: DonkeyHottt
Дата сообщения: 09.03.2007 20:15
SERGE_BLIZNUK
Спасибо! Однако узость моего мышления, применительно к VBA, к сожалению выставила Ваш, я уверен, ценный совет, за рамки моего восприятия. Но всеравно спасибо за Ваше постоянное участие и помощь в моих проблемах! Ближе моему пониманию оказался совет AndVGri
AndVGri
Все работает! Большое спасибо! Я понимал, что нужен цикл от первой до последней, но не знал синтаксиса команд. Скачал книжку "Использование макросов в Excel" С.Роман. Буду разбираться понемногу.
Спасибо всем еще раз!
Автор: SERGE_BLIZNUK
Дата сообщения: 10.03.2007 08:04
DonkeyHottt
Цитата:
Спасибо! Однако узость моего мышления, применительно к VBA, к сожалению выставила Ваш, я уверен, ценный совет,
эк загнул... ;-)))
Цитата:
Но всеравно спасибо за Ваше постоянное участие и помощь в моих проблемах! Ближе моему пониманию оказался совет AndVGri
Извини, если не понял твою проблему...
Просто код, который перебирает все открытые книги я уже тебе приводил здесь.
т.е. вышеуказанный AndVGri код можно записать и так:
Код:
For Each w In Workbooks
w.ActiveSheet.Range("A1").Value = x
Next
Автор: Yuk
Дата сообщения: 10.03.2007 08:57
Pantera3587
Если я правильно понял задачу, примерно так:

Код: Private Sub CommandButton1_Click()
Dim w As Worksheet
Dim w1 As Worksheet
Dim c As Range, sel As Range
Dim j As Integer
Dim hAddr As Variant

Set w = Sheets("Комплектующие и периферия")
Set w1 = Sheets("Оглавление")

j = ListBox1.ListIndex + 1
hAddr = Split(w1.Hyperlinks(j).SubAddress, "!")
Set sel = w.Range(hAddr(1))
sel.Select
For Each c In sel.Offset(0, 8).Resize(sel.Rows.Count, 1)
c.Value = ListBox1.Text
Next
Unload Me 'Это для выгрузки формы, если надо. Или отдельную кнопку для закрытия.
End Sub
Автор: Pantera3587
Дата сообщения: 10.03.2007 20:51
Yuk
Большое спасибо за помощь. То, что надо.
Автор: Lexy4ka
Дата сообщения: 10.03.2007 23:27
Здравствуйте!
в университете задали задание по программированию для Excel в VBA
По правде говоря в этом деле я свосем не сильна. Но уж очень не хочется упасть в грязь лицом. половину задания знаю как делать а вот с оставшейся хуже.
задание следующее:
1.    Разработать форму и элементы управления для табулирования значений функции:
a.    y= a*Sin(sin(x+Tg x )).
2.     Для ввода аргумента функции использовать его начальное, конечное значение и шаг изменения. Если начальное значение больше конечного выдавать сообщение со значением шага.
3.     Таблицу - результат поместить на новый лист существующей книги, который назвать «Табулирование».
4.    Найти среднее гармоническое, тех из данных, которые > 0 (или слово “ нет”), число данных, больших среднего гармонического тех из данных, которые > 0 и помес-тить их под таблицей.
5.     Заголовок разместить над таблицей, выделив его полужирным шрифтом размером 14.
6.    Произвести форматирование таблицы: к столбцам «аргумент» и «функция» применить различную заливку.
___________________________________________________
не могу понять как сделать чтобы вводя в форме начальное и конечное значения а так же шаг, заполнялся один столбец в пределах этих значений с соответствующим шагом в документе с excel.

поготи пожалуйста, заранее очень благодарна
Автор: gyurza2000
Дата сообщения: 10.03.2007 23:40
Помогите решить задачку:
Есть 2 таблицы (А и Б), в А вводятся исходные данные (в одну строку), в Б отображаются конечные результаты вычислений(тоже в одной строке). Как сделать что бы при вводе новых данных в таблицу А, результат дописывался в таблицу Б в следующую строчку (то есть на строку ниже предыдущего результата) ?
Автор: AndVGri
Дата сообщения: 11.03.2007 05:03
gyurza2000


Цитата:
(то есть на строку ниже предыдущего результата) ?

Не совсем понял эту часть.
Вариант для ввода данных в "А" и вывода результата в такую же строку для "Б", если что не так, то можно изменить по аналогии.

Для листа "А" (в редакторе VBA своенный щелчёк в менеджере объектов на листе, в который вводятся данные) прописываем следующее:

Private resSheet As Excel.Worksheet 'Лист результата
Private meName As String 'имя этого листа с !R

'МЕТОД: обработка события изменение
'данных в ячейках листа
Private Sub Worksheet_Change(ByVal Target As Range)
'константная часть ссылки на ячейку листа данных
Dim part As String
'Пусть последнее данное в исходной таблице
'вводится в колонке C (номер 3)
If Target.Column = 3 Then
'проерка инициализации листа результата
If resSheet Is Nothing Then
'Пусть лист результата называется Б
Set resSheet = ThisWorkbook.Worksheets("Б")
meName = Me.Name & "!R"
End If

'Пример для суммы трёх чисел текущей строки ввода
'от колонки A до C
part = meName & CStr(Target.Row)
resSheet.Cells(Target.Row, 1&).FormulaR1C1 = "=SUM(" & part _
& "C1:" & part & "C3)"
End If
End Sub

Если вывод жёстко в следующую за последней строку листа, то, как вариант:
resSheet.Cells(1&, 1&).End(xlDown).Offset(1&, 0&).FormulaR1C1 = _
"=SUM(" & part & "C1:" & part & "C3)"


Добавлено:
Lexy4ka

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


Где-то так

Private Sub CommandButton1_Click()
'Пусть начальное значение в TextBoxBegin
'конечное значение в TextBoxLast
'шаг приращения в TextBoxStep
Dim vBegin As Double, vLast As Double, vStep As Double
Dim i As Long, vCount As Long
'получим численные данные
vBegin = CDbl(TextBoxBegin.Text)
vLast = CDbl(TextBoxLast.Text)
vStep = CDbl(TextBoxStep.Text)
'проверить на соответствие
'...
'...
'вычислим число приращений
vCount = VBA.Fix((vLast - vBegin) / vStep)
i = 0&
'пусть вывод значений начинается со строки 2 в столбце 1
Do
Cells(i + 2&, 1&).Value = vBegin + CDbl(i) * vStep
i = i + 1&
Loop Until i > vCount
'проверка на кратность
If Cells(i + 1&, 1&).Value < vLast Then Cells(i + 2&, 1&).Value = vLast
End Sub
Автор: Lexy4ka
Дата сообщения: 11.03.2007 12:25
AndVGri
спасибо большое.

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

ужас какой-то ничего не понимаю...а главное не понмиаю зачем нам это задуют. очень сомневаюсь что мне когда-нибудь придет в голову при работе с экселем писать что-нибудь в VBA....


AndVGri
еще раз спасибо большое
Автор: maratino
Дата сообщения: 11.03.2007 13:28
Помогите пожалуйста!
........A....................B..........................C...................D..........................F....................G
17017-4 5шт 900 17017-3 4шт 850
30017-4 5шт 900 30017-3 5шт 850
17017-4 2шт 900 17017-5 1шт 850
17017-4 5шт 900 17017-3 4шт 850
17017-3 4шт 850
17017-3 4шт 850
A.B.C. Это первоначальный прайс поставщика.
D.F.G Это окончательный. Но там есть нестыковки в значениях(разница)
Нужен макрос, который проведет синхронизацию между A.B.C. и D.F.G
и как то обозначит разницу, и еще в D.F.G больше наименований чем должно было, и
эту разницу, больше или меньше как то высветит
Заранее благодарю
Автор: olik22
Дата сообщения: 11.03.2007 14:25
Хотел бы вашей консультации, возможно ли такое. Есть формула, которая делает проверку по ключевым словам, если находит слово, то использует одни значения если другое то другие.Возникла проблемка, Можно ли как нибудь изменять ключевые слова автоматически, т.е не вручную.возможно ли такое
Автор: ZORRO2005
Дата сообщения: 12.03.2007 00:53
olik22
ВПР
Автор: AndVGri
Дата сообщения: 12.03.2007 04:34
Lexy4ka

Private Const halfPi As Double = 1.5707963267949
'Метод, вычисляющий среднегармоническое и число
'значений функции больших среднегармонического
'предполагается, что аргументы функции расположены
'в столбце 1, начиная со строки 2
Public Sub HarMeanReport()
Dim vLast As Long, vCount As Long, i As Long
Dim Result() As Double, vCurrent As Double
Dim GreateCount As Long
'определяем последнюю строку с данными
vLast = Cells(2&, 1&).End(xlDown).Row
ReDim Result(0& To vLast - 2&)
vCount = 0&
'цикл вычисления функции
For i = 2& To vLast
'проверим на (n + 1 / 2) * Pi
vCurrent = Cells(i, 1&).Value / halfPi
If ((vCurrent - VBA.Fix(vCurrent)) = 0&) And ((VBA.Fix(vCurrent) Mod 2&) = 0&) Then
Cells(i, 2&).Value = "НЕТ"
Else
Cells(i, 2&).Value = Math.Sin(Math.Sin(Cells(i, 1&).Value) * Math.Tan(Cells(i, 1&).Value))
'заносим значения функции > 0 в массив
If Cells(i, 2&).Value > 0# Then
Result(vCount) = Cells(i, 2&).Value
vCount = vCount + 1&
End If
End If
Next i
'отсечка по числу значений > 0
ReDim Preserve Result(0& To vCount - 1&)
'получить и сохранить среднегармоническое
vCurrent = Application.WorksheetFunction.HarMean(Result)
Cells(vLast + 2&, 2&).Value = vCurrent
'определить и сохранить число значенией больших среднегармонического
GreateCount = 0&
For i = 0& To vCount - 1&
If Result(i) > vCurrent Then GreateCount = GreateCount + 1&
Next i
Cells(vLast + 3&, 2&).Value = GreateCount
End Sub
Автор: The okk
Дата сообщения: 12.03.2007 07:12
AndVGri
А зачем & ставить после цифр? Я, конечно, понимаю, что это делает из Integer Long, но влияет ли это на быстродействие?

Добавлено:
maratino
А зачем тут макрос? Задача целиком решается с помощью функции ВПР и условного форматирования. Лучше этот вопрос задать в теме по Excel (ссылка в шапке)
Автор: AndVGri
Дата сообщения: 12.03.2007 10:25
The okk

Цитата:
А зачем & ставить после цифр? Я, конечно, понимаю, что это делает из Integer Long, но влияет ли это на быстродействие?

Да так, просто старая дурацкая привычка. Переполз на VB c Pascal, а там как-то нарвался на неверный результат из-за того, компилятор посчитал константу как integer а не Longint. Вот с тех пор и типизирую
Автор: The okk
Дата сообщения: 12.03.2007 10:47
AndVGri

Цитата:
Переполз на VB c Pascal, а там как-то нарвался на неверный результат из-за того, компилятор посчитал константу как integer а не Longint.

Ясно. Сам раньше с паскалем работал. В VB раньше то же самое было. В некоторых случаях, когда работаешь со строками, % может и сейчас пригодиться.
Кстати, в VBA обращение к ячейке со смещением выглядит так:

Код: Cells(vLast, 2&).Offset(3&).Value = GreateCount
Автор: LevT
Дата сообщения: 12.03.2007 11:11

Объясните, почему


Код: Range("C29").CurrentArray.FormulaArray = "=TRANSPOSE('[Книга.xls]" + CStr(1) + "'!"
+ Target + ")"

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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