Т.к. при удалении двух и более строк возникает ошибка не много подредактировал код:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo ErrorHandler
If Not Intersect(Target.Offset(-1), Me.ListObjects(1).ListColumns(3).Range) Is Nothing Then
Target.Offset(0, -2).Resize(, 2) = Array(Format(Now, "dd mmmm yyyy"" г."), Format(Now, "hh:nn"))
End If
ErrorHandler:
Exit Sub
End Sub
Доброго времени суток. В файле: Лист2 Таблица2 - все нормально код рабочий. Также нужно и в Таблица1 Лист1. Вся проблема в том, что на листе 1 заполняем первую строку (столбец 3), а она пустая. Т.Е. последняя заполненная строка rngCell = Nothing. Событие должно наступать при Worksheet_Change. Спасибо.
А ваш ответ чем отличается? Я думал вы серьезный человек, результат тот же. Жаль.
Мои вопросы риторические. Здесь место для конкретики, а не для бла-бла. К стати с оружием аккуратнее. У меня был один "умник", все знал все умел, а на деле полный ноль. Самоутвердится у него так и не получилось. Ствол в рот, затылок и содержимое черепа на бетоне. 7,62 - хороший калибр.
Здоровья всем. Ответа на задачу, думаю не получу. Только пустышки.
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
buchlotnik написал: я вам уже развернутую версию в #11 привёл
этот код вы добавили позже, я его не видел. Спасибо, дело пошло. Но в нем тоже не все так. Если с аргументами x и y в функциях понятно, то формула - как аргумент функции ФакториалXY(x-y) - ? То и имя функции, которую мы вызываем, должно быть соответственно Function ФакториалXY(x-y) As Double В коде ниже функция ФакториалXY(k) не рабочая, т.к. значения X и Y не определены или не связаны с основной функцией Число_сочетаний. Опять стопор, полумеры?
Код
Function Число_сочетаний(ByVal x As Long, y As Long) As Double
Dim k As Double
k = x - y ' результата не дает
Число_сочетаний = ФакториалX(x) / ФакториалY(y) / ФакториалXY(k) ' пишем ФакториалXY(k) потому что в "Function ФакториалXY(x-y)" аргумент функции не может быть формулой
End Function
Function ФакториалX(ByVal x As Long) As Double
Dim i As Long
If x < 1 Then Exit Function
ФакториалX = 1
For i = 2 To x
ФакториалX = ФакториалX * i
Next
End Function
Function ФакториалY(ByVal y As Long) As Double
Dim i As Long
If y < 1 Then Exit Function
ФакториалY = 1
For i = 2 To y
ФакториалY = ФакториалY * i
Next
End Function
Function ФакториалXY(k) As Double ' косяк с вычислением последнего аргумента??????
Dim i As Long
Dim x As Long, y As Long
k = x - y
If k < 1 Then Exit Function
ФакториалXY = 1
For i = 2 To k
ФакториалXY = ФакториалXY(k) * i ' если функцию записать как ФакториалXY(x-y) тоже нет смысла, т.к. значения X и Y не определены
Next
End Function
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
"Число_сочетаний" и "Факториал" В моем, а точнее справки VBA
Код
Факториал = Факториал(n) * (n + 1)
слово "факториал" - это название пользовательской функции, которое может быть любым, При этом обратите внимание что перед знаком равно и после него используется одно и тоже слово. А у вас, извините ..... Поймите правильно, я пытаюсь найти истину решить задачу, может я что-то не понимаю? Но вокруг вашего ответа я истины и решения не вижу.
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
Очень сильно я не хотел в циклы лезть. Но видимо не обойтись. Примеров видел массу, но везде как у Вас - только один факториал n! Дальше сложнее. Т.е. Вы имеете ввиду, что с начала получить через вложенные циклы три переменные: n!, m! и (n-m)! Ну и затем простая арифметика: Число_сочетаний = k/p*h, где k = n!, p = m! и h = (n-m)! Както так?
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
Вообще не понятно. Вы наверно имели ввиду штатную функцию Excel: = ФАКТР(C5)/ФАКТР(A5)*ФАКТР(C5-A5) а я говорю о VBA. Сразу оговорюсь что записанный макрос:
Вычисление в пользовательской функции VBA простого факториала n! понятно
Код
Function Факториал(ByVal n As Long) As Double
n = n - 1
If n = 0 Then
Факториал = 1
Exit Function
End If
Факториал = Факториал(n) * (n + 1)
End Function
а вот если нужно найти скажем число сочетаний: n!/m!(n-m)!
Самым простым способом было бы записать макрос, но к сожалению функция, как процедура, не работает. Каким образом можно адаптировать функцию выше не понимаю? Подскажите кто знает. Спасибо.
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
Sub NumbersWords(control As IRibbonControl)
Dim tmp As String
tmp = ActiveCell.FormulaR1C1
ActiveCell.FormulaR1C1 = "=СУММАПРОПИСЬЮ()"
Application.Dialogs(xlDialogFunctionWizard).Show
If IsError(ActiveCell) Then ActiveCell.FormulaR1C1 = tmp
End Sub
если искать не причины, а способы!
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
Когда закрываем диалоговое окно пользовательской формы и надстройки кнопкой ОК конструкция Application.Dialogs(xlDialogFunctionWizard).Show воспроизводит как ИСТИНА и закрывает окно вставляя в активную ячейку формулу, но если при этом мы не ввели адрес вычисляемой ячейки в поле "n"диалогового окна, то естественно получаем ошибку типа #знач . Попробовал решить задачу через обработчик ошибок:
Код
Sub NumbersWords(control As IRibbonControl)
Dim tmp As Variant
tmp = ActiveCell.FormulaR1C1
On Error GoTo Error_User
ActiveCell.FormulaR1C1 = "=СУММАПРОПИСЬЮ()"
Application.Dialogs(xlDialogFunctionWizard).Show
Error_User:
ActiveCell.FormulaR1C1 = tmp
End Sub
Теперь активная ячейка очищается даже если введен адрес ячейки в поле "n"? Что-то здесь не так? Подскажите плиз.
На всякий случай приложу файл надстройки.
В файле закоментирована предидущая верся процедуры NumbersWords
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
Не много доработал, т.к. все как-то коряво. Если передумаешь вводить данные в ячейке остается #знач и формула в строке формул. Так будет по лучше --->
Код
Sub NumbersWords(control As IRibbonControl)
ActiveCell.FormulaR1C1 = "=СУММАПРОПИСЬЮ()"
If Application.Dialogs(xlDialogFunctionWizard).Show = False Then ActiveCell = ""
End Sub
Я бы хотел написать ActiveCell.Delete но формула остается в ячейке пока она активна. Если кто-нибудь подскажет правильнее буду признателен.
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
у меня есть файл, там формула вычисления сторон треугольника, все прописано в одном файле с поддержкой макросов - без надстройки. Так вот когда я вызываю функцию кнопкой из ленты то открывается диалоговое окно для вставки аргументов. "Моя вкладка" кнопка "Формула S№1"
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
Доброго времени суток! Пытаюсь сделать надстройку и сразу ступор. Есть функция - число в текст. Надстройку подключил. При клике на кнопке "Цифры прописью" вкладка "CATHARSIS" функция вставляется в ячейку, а должно открываться диалоговое окно функции для ввода аргументов. По крайней мере так работает алгоритм без надстройки. Помогите разобраться, в чем проблема? В приложении файл надстройки. Спасибо.
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
При запуске Excel, по умолчанию, предлагаются заранее определенные пункты списка -> Личная вкладка -> По умолчанию при запуске. Здесь у меня два решения этой задачи с помощью dropDown. Но теперь при выборе пункта меню возникает ошибка? Не пойму чего не хватает. Результат должен быть как с comboBox --> Лента-> При выборе пункта. Дело в том, что dropDown не предполагает onChange. А onAction вызавает ошибку. Хотя мне кажется, что дело в самом теле процедуры ClickItemID вызываемой onAction. Ribbon XML:
Option Explicit
Public MyRibbon As IRibbonUI
'Пример 1
Sub get_id(control As IRibbonControl, _
ByRef ID)
ID = "item3"
End Sub
'Пример 2
Sub CallbackDDGetSelectedItemID(control As IRibbonControl, _
ByRef ID)
Select Case control.ID
Case "Пример2"
ID = "item13"
End Select
End Sub
Sub ClickItemID(control As IRibbonControl, _
Text As String)
ActiveWorkbook.Worksheets("Лист1").Cells(1, 1) = Text
End Sub
Спасибо.
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
С конструкцией Таблица12[[#Итоги];[4]] - проблем нет, но не все так просто.
Дело в том, что эта формула стоит в другой умной таблице, где Таблица12 не константа а переменная. Т.е. имя таблицы из которой я хочу получить данные находится в ячейке с выпадающим списком (списком таблиц). Список получаем через Данные - Проверка данных - Тип данных - Список (источник данных вида =ДВССЫЛ(R12C1&"[Наименование]")) Другими словами формула, как мне казалось, должна выглядеть так:
R[-2]C[[#Итоги];[4]] - где R[-2]C - ссылка на ячейку с именем умной таблицы из которой получаем данные итоговой строки. Так ведь нет, не получается. Как только не пробывал - результата нет. Формулы ДВССЫЛ(), ВПР(), Т() задачу не решают.
Как получить данные Итогов в моем случае? Спасибо.
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
Вот и всё, как всегда. Кому интересно - что делает этот код: Меняем выбранные значения из Умной таблицы сразу в двух таких таблицах.через форму vba.
Код
Private Sub CommandButton4_Click()
Dim myTable As Worksheet, myTableA4 As Worksheet
Dim x As Long
Dim n, myArray
Dim ListObj As ListObject, ListObjA4 As ListObject
Dim ListRow As ListRow, ListRowA4 As ListRow
n = GeneralForm1.ComboBox1.Value
Set myTable = Worksheets("Накладная")
Set myTableA4 = Worksheets("Накладная")
Set ListObj = myTable.ListObjects("Nakladnaya")
Set ListObjA4 = myTableA4.ListObjects("NakladnayaA4")
myArray = ListObj.DataBodyRange
For x = LBound(myArray) To UBound(myArray)
Set ListRow = ListObj.ListRows(x)
Set ListRowA4 = ListObjA4.ListRows(x)
If n = myArray(x, 2) Then
Call SheetActivate
ListRow.Range(2) = GeneralForm1.TextBox3.Value
ListRow.Range(3) = GeneralForm1.TextBox2.Value
ListRow.Range(4) = GeneralForm1.TextBox1.Value
ListRowA4.Range(2) = GeneralForm1.TextBox3.Value
ListRowA4.Range(3) = GeneralForm1.TextBox2.Value
ListRowA4.Range(4) = GeneralForm1.TextBox1.Value
End If
Next x
End Sub
Я так понимаю, что myArray это "Лист Накладная- Объект Nakladnaya- Данные таблицы- конкретная строка и столбец" Соответственно туда я и пытаюсь передать данные при наступлении определённых условий из формы. Или не так? Тогда как?
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
Доброго времени соток. Весь мозг взорвал. Не вижу - в чём проблема?
Код
Private Sub CommandButton4_Click() ' внесение изменений в бланки
Dim myTable As ListObject, myTableA4 As ListObject
Dim x As Long
Dim n, myArray
n = GeneralForm1.ComboBox1.Value
Set myTable = Worksheets("Накладная").ListObjects("Nakladnaya")
Set myTableA4 = Worksheets("Накладная").ListObjects("NakladnayaA4")
myArray = myTable.DataBodyRange
For x = LBound(myArray) To UBound(myArray)
If n = myArray(x, 2) Then
Call SheetActivate
myArray(x, 2) = GeneralForm1.TextBox3.Value
myArray(x, 3) = GeneralForm1.TextBox2.Value
myArray(x, 4) = GeneralForm1.TextBox1.Value
End If
Next x
End Sub
Почему при нажатии на кнопку ничего не происходит? Спасибо.
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
Родил. Кому будет интересно вот код (исключительно с Умной таблицей):
Код
Private Sub ComboBox1_Change()
Dim myTable As ListObject
Dim x As Long
Dim n As String
Dim myArray As Variant
n = ComboBox1.Text
Set myTable = ActiveSheet.ListObjects("Таблица2")
myArray = myTable.DataBodyRange
For x = LBound(myArray) To UBound(myArray)
If myArray(x, 2) = n Then
myTable.DataBodyRange.Rows(x).Select
End If
Next x
End Sub
Забыл, есть нюанс: Данный код будет обрабатывать первую строку - шапку и последнюю - итоги. Здесь я ни чего не делал, чтобы убрать их, т.к. я их исключил в другом коде см. прикреплённый файл.
Private Sub ComboBox1_Change()
Dim n As String
Dim i As Long
Dim lLastRow As Long
'Dim rgResult As Range
Dim rgResult As Object
lLastRow = Cells(Rows.Count, 2).End(xlUp).Row - 1
n = ComboBox1.Text
'Set rgResult = Range("B7:B14").Find(n, , xlValues)
Set rgResult = Workbooks("Лист Microsoft Excel1.xlsm").Worksheets("Накладная").ListObjects("Таблица1").ListColumns("Наименование").DataBodyRange.Address
For i = 7 To lLastRow Step 1
If rgResult = n Then
rgResult.Select
End If
Next
End Sub
Доброго времени суток! Как обратиться к диапазону Умной таблицы. Написал код - он рабочий. Но на мой взгляд так писать не совсем верно.
Код
Private Sub ComboBox1_Change()
Dim n As String
Dim i As Long
Dim lLastRow As Long
Dim rgResult As Range
lLastRow = Cells(Rows.Count, 2).End(xlUp).Row - 1
n = ComboBox1.Text
Set rgResult = Range("B7:B14").Find(n, , xlValues)
For i = 7 To lLastRow Step 1
If rgResult = n Then
rgResult.Select
End If
Next
End Sub
Я имею ввиду диапазон Range("B7:B14"). Дело в том что у нас есть объект Умная таблица "Таблица1" внутри которой именованный диапазон/массив "Наименование", а мы обращаемся к колонке активного листа. А если в колонке "В" над таблицей будут записи? ... Или колонка "В" не закончится на 14 строке?.... Можно, конечно написать Range("B7:B"), но опять обращаемся к колонке листа. А что если взять и переместить таблицу внутри листа со смещением? И такое может быть.
Справка VBA так и предлагает обращаться Range("Test")? в моём случае Range("Наименование"), или Application.Goto "Test" - как бы не так??? Ни чего не выходит. Объявлял объект, присваивал значения - ни чего и ни как?
Кто знает - подскажите. Спасибо. -
Кто хочет — ищет способы, кто не хочет — причины (Сократ)