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

» Excel VBA

Автор: kiVAR
Дата сообщения: 30.03.2007 14:36
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False

Dim iRow As Long

iRow = Target.Row 'получаем строку ввода и только для неё проводим изменения

For iRow = 2 To 10
If Target.Column = 2& Then
If IsNumeric(Cells(iRow, 3&).Value) And IsNumeric(Cells(iRow, 2&).Value) Then
Cells(iRow, 3&).Formula = "=" & Cells(iRow, 3&).Value & "-" & Cells(iRow, 2&).Address
End If
ElseIf Target.Column = 1& Then
If IsNumeric(Cells(iRow, 1&).Value) And IsNumeric(Cells(iRow, 3&).Value) Then
Cells(iRow, 3&).Formula = "=" & Cells(iRow, 3&).Value & "+" & Cells(iRow, 1&).Address
End If
End If
Next iRow
Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub
Автор: AndVGri
Дата сообщения: 30.03.2007 14:50
kiVAR

Цитата:
For iRow = 2 To 10
- а это зачем? Цикл как раз
Цитата:
ну всё равно, ввожу я в другую строку, а он мне все значения пересчитывает
- уберите цикл и тогда изменения будут выполняться только для той строки, в которой выполнен ввод в столбец А или В.
Может вы по детальнее напишете, что надо сделать?
Автор: kiVAR
Дата сообщения: 30.03.2007 15:12
Всё. вроде получилось.
AndVGri большое спасибо
страна тебя не забудет
Автор: Olive77
Дата сообщения: 30.03.2007 15:34
kiVAR
Application.Calculation было бы не вредно вернуть назад
Автор: Tellme
Дата сообщения: 31.03.2007 11:43
ПРивет! Вот моя проблемка...
Мне необходимо, в зависомости от введённого числа, допустим в ячейку А1 , заполнить столько ячеек, какое число было введено в А1 в столбце B , по определённой формуле, в которой фигурирует переменная для каждой следующей ячейки стобца B её значение увеличивается на единицу и к ней прибавляются знаения из столбца С, такимобразом, что в В1 будет сумма С1 и нашей переменной, в В2 будет сумма С2 и нашей переменной(увеличенной на единицу), в столбце В3- сумма С3 и нашей переменной увеличенной на единицу, относительно значения, занесённого в В2 и т.д. до В с индексом равным значению ячейки А1.
Уже несколько дней туплю . А диплом-то не ждёт! Помогите, плиз, если кто знает как!
Автор: AndVGri
Дата сообщения: 31.03.2007 12:33
Tellme

Цитата:
несколько дней туплю

Это видно

Цитата:
какое число было введено в А1 в столбце B
- как?

Цитата:
по определённой формуле

то есть: b(i)=c(i) + a(1) + (i - 1), для i = 1..n, где n = a(1)? Почётче, если возможно
Автор: Tellme
Дата сообщения: 31.03.2007 15:00
1. В ячейку А1 вводится число n или просто просят ввести n с помощью окошка Inbox.
2. В ячейку В1 вводится значение 0.
3. В ячейку В2 вводится значение формулы: В1+С1+1*3
4. В ячейку В3 вводится значение формулы: В2+С2+2*3
...
n+1. В ячейку Вn вводится значение5 формулы:В(n-1)+ С(n-1)+(n-1)*3

Так понятней?
Автор: AndVGri
Дата сообщения: 31.03.2007 15:34
Tellme

Цитата:
Так понятней?
Аха;)
[more]

Код:
Public Sub WriteMyFormula()
Dim i As Long, vCount As Long

If IsNumeric(Range("A1").Value) Then
vCount = CLng(Range("A1").Value)
If vCount < 1& Then
MsgBox "Нечего считать", vbExclamation, "Ошибка"
ElseIf vCount > 65535 Then
MsgBox "Некуда считать", vbExclamation, "Ошибка"
Else
Range("B1").Value = 0&
Range("B2").Formula = "=B1+C1+(ROW()-1)*3"
For i = 3& To vCount
Range("B2").Copy Cells(i, 2&)
Next i
End If
Else
MsgBox "Мама, мама, что мы будем делать? " & VBA.vbLf & CStr(Range("A1").Value), vbQuestion, "Вопрос"
End If
End Sub
Автор: SERGE_BLIZNUK
Дата сообщения: 31.03.2007 22:25
Tellme
AndVGri
Только, с позволения уважаемого AndVGri,
я бы заменил
Код:
For i = 3& To vCount
Range("B2").Copy Cells(i, 2&)
Next i
на код
Range("B2").Copy Range(Cells(3, 2), Cells(vCount, 2))
Автор: AndVGri
Дата сообщения: 01.04.2007 03:07
SERGE_BLIZNUK
Спасибо. Живу - учусь
Автор: SERGE_BLIZNUK
Дата сообщения: 01.04.2007 09:08
AndVGri
;-) Вы не поверите, я тоже в этом форуме больше учусь, чем отвечаю ;-))) Ну 50 на 50...
И ещё, я уверен, что Вы только на форуме junior (пока ;-)), но в программировании на VBA - отнюдь не новичок!!

p.s. пример с переносом данных и копированием целого диапазона был тут давно на форуме. Так что - ВЕК ЖИВИ, ВЕК УЧИСЬ или
"Накорми голодного рыбой и он погибнет, научи его ловить рыбу и ты спасешь его."(R)
Автор: le3ch
Дата сообщения: 02.04.2007 07:00
Добрый день уважаемые.
Возможно ли определить к какому листу в книге относится именованный диапазон? Замучался уже искать ответ, выручайте бывалые .
Автор: AndVGri
Дата сообщения: 02.04.2007 07:45
le3ch

Dim pos As Long
Dim vRefers As String

vRefers = ActiveWorkbook.Names("Имя диапазона").RefersTo
pos = VBA.InStr(vRefers, "!")
Debug.Print Mid$(vRefers, 2&, pos - 2&)
Автор: The okk
Дата сообщения: 02.04.2007 07:54
le3ch
Вот такая вот UDF получается:

Код: Function ИМЯ_ЛИСТА(RangeName As String) As String
Application.Volatile
ИМЯ_ЛИСТА = Names(RangeName).RefersToRange.Parent.Name
End Function
Автор: le3ch
Дата сообщения: 02.04.2007 07:57
AndVGri
большое спасибо!
Автор: The okk
Дата сообщения: 02.04.2007 07:57
AndVGri
Привет! Не люблю строковые операции.
А что касается копирования формулы (предыдущий код). Формулу в таких случаях вводят двумя способами: вводят формулу в одну ячейку и запускают метод AutoFill, либо:
Range(<наш диапазон>).FormulaR1C1 = "<наша формула в стиле R1C1>". Последний способ мне нравится больше, поскольку он быстрее и в одно действие
Автор: AndVGri
Дата сообщения: 02.04.2007 17:02
Вот и у меня вопрос появился
Имею форму, на ней фрейм. На него динамически вывожу кнопки-переключатели (ToggleButton). Надо чтобы при нажатии на одну из кнопок другие сбрасывались в состояние отжата. В доке написано, что если свойству GroupName таких кнопок присвоить некоторое общее имя, то это обеспечит требуемое поведение.
Пробовал в качестве GroupName задавать имя фрейма, другую строку, но нарываюсь на ошибку 387 - set not permited. Как обойти и в чём проблема? Да, ещё - Excel 2003

Private Const ButtonProgID As String = "Forms.ToggleButton.1"

Private Sub UserForm_Initialize()
Dim Added As MSForms.ToggleButton
...
'frmImages - объект класса Frame, btName - уникальное название кнопки-переключателя
Set Added = frmImages.Controls.Add(ButtonProgID, btName)
With Added
.GroupName = frmImages.Name
...
End With
...
End Sub
Автор: Olive77
Дата сообщения: 02.04.2007 17:46
AndVGri
пока могу только сказать, что свойство GroupName применяется к CheckBox и OptionButtоn.
У ToggleButton этого свойства нет.
Придется, по-видимому, программировать.
Автор: AndVGri
Дата сообщения: 02.04.2007 18:01
Olive77
В принципе, да спасибо. Проглядел, что, несмотря на то, что для ToggleButton в VBE свойство GroupName имеется, но официально нет.
Тогда как подцепить какое-нибудь событие, чтобы отслеживать изменение состояния кнопок-переключателей, учитывая то, что они добавляются динамически? Какого-нибудь свойства OnClick и ему подобного не нашёл, чтобы указать метод-обработчик.
Автор: Olive77
Дата сообщения: 02.04.2007 18:09
ToggleButton1_Click, ToggleButton2_Click, ...
организовать цикл по frmImages.Controls, используя тип, ...

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

В модуль приходилось когда-то, а в форму нет (по аналогии должно быть то же).
Да и не программист я.

Программисты есть?
Автор: AndVGri
Дата сообщения: 02.04.2007 18:28
Olive77

Цитата:
ToggleButton1_Click, ToggleButton2_Click, ...
у меня этих кнопок 2562. Можно, в принципе, на создавать кода, используя VBE для них всех, но стоит ли овчинка выделки?
Я собственно для себя самого пишу. Надёргал FaceID из стандартных изображений на кнопках Excel, чтобы использовать на своих. В форме выводяться кнопки с этими изображениями, а я из списка пользовательских панелей и соответствующего списка кнопок на них по нажатой кнопке-переключателю задаю нужное мне изображение. Только ведь можно пропустить где уже нажал, а где не отжал. Буду внимательнее.
Автор: Olive77
Дата сообщения: 02.04.2007 18:33

Цитата:
у меня этих кнопок 2562

А как ты их на форме все разместил?
Автор: AndVGri
Дата сообщения: 02.04.2007 18:37
Olive77
Так Scroll для Frame сделал 12 штук в ряд, а остальные во фрейме прокручиваются. Если интересно, то могу файлик выложить
Автор: Olive77
Дата сообщения: 02.04.2007 18:46
Понятно.
непонятно - целесообразность сего занятия, но раз для себя то все можно. -
Автор: le3ch
Дата сообщения: 03.04.2007 05:58
Посоветуйте как лучше запрограммировать сверку каждого значения из одного именованного диапазона с каждым значением из другого именованного диапазона. Именованные диапазоны могут располагаться на разных листах и иметь разное количество строк и столбцов.
Заранее всем спасибо.
Автор: The okk
Дата сообщения: 03.04.2007 06:01
AndVGri
Создай класс кнопок. Тогда достаточно будет одной обработки On_Click на все кнопки. Пример можно найти у Уокенбаха. multiple_buttons называется.
Кстати, у того же Уокенбаха есть надстройка Face_Id - она не решает твою проблему? В окне показываются все фэйсы, а когда наводишь на какой-нибудь из них курсор, появляется его ID. Есть открытые исходники.

Добавлено:
le3ch
Какими должны быть итоги сверки?
Автор: le3ch
Дата сообщения: 03.04.2007 06:18
Выделить цветом одинаковые значения.
Автор: The okk
Дата сообщения: 03.04.2007 07:00
le3ch
Т.е. выделить в одном списке ячейки со значениями, которые хотя бы раз встречаются во втором списке (а во втором, соответственно, те, которые встречаются в первом)?
Если границы диапазонов не меняются, это решается условным форматированием без VBA.
Автор: le3ch
Дата сообщения: 03.04.2007 07:08
The okk
Все верно. Необходимо найти значения из первого диапазона которые встречаются во втором, для того чтобы подчистить список.
Привязываться надо к именам диапазонов, а диапазоны соответсвенно могут иметь самые различные адреса. Если это возможно без VBA, то как? Что то не догоню .
Автор: The okk
Дата сообщения: 03.04.2007 07:17
le3ch

Цитата:
Если это возможно без VBA, то как?

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

Если бы диапазон, где нужно выделять значения, имел бы постоянный адрес, можно было бы просто использовать Условное Форматирование с формулой типа: =ЕСЛИ(ПОИСКПОЗ();ИСТИНА;ЛОЖЬ). Но в данном случае, насколько я понимаю, неизвестен заранее диапазон, где нужно применить условное форматирование. Или известен?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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