[Решено] Формулы заменить на макрос.

Автор bsi, 1 февраля 2017, 11:06

0 Пользователи и 1 гость просматривают эту тему.

bsi

Привет форумчане. Так как знаний  у меня в программировании нет, прошу строго не судить.
Во вложенном файле в стобцах А, I и J есть формулы. Если у кого-то есть свободное время и желание, то прошу, результат работы формул, сделать макросом. Всем спасибо.

economist

bsi - практически всегда правильнее уходить от программирования в сторону использования формул.
Если тут перфекционизм - просто защитите ячейки, скрыв формулу - и НИКТО не догадается, что считает результат не макрос, а формула.

Грамотно написанная формула на защищенном листе - практически неубиваема никакими действиями. Защита листа - должна быть на любой серьезный документ, тупо от кривых рук. У меня есть доплата коллегам за грамотно защищенные ими документы, понемногу работает... 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

bsi

Наоборот я хочу уйти от варианта с защитой листа. Меня просили это сделать для великовозрастных женщин, которые очень плохо знают комп. В Excel я это сделал, но у них на компах стоит LO, а тут я в макросах ноль. Длина этой таблицы будет выходить за пределы диапазона, указанного в этом файле, диапазон тут  я указал как пример. Поэтому хотелось бы все макросом.

rami

Цитата: bsi от  1 февраля 2017, 10:47Меня просили это сделать для великовозрастных женщин, которые очень плохо знают комп.
Но они хорошо знают как... :o ой, я просто боюсь за вас.

Вот вариант, но я не уверен, что это правильный путь.

bsi

Да, все вроде хорошо, но еще бы так : если в столбце G удаляем данные, то столбцах H, I, J данные доже удалялись, сейчас данные удаляются только в I и J. В Excele у меня вот такой код For i = 6 To Range("A" & Rows.Count).End(xlUp).Row
If Cells(i, "G") <> 0 Then
Cells(i, "j") = Cells(i, "G") / 100 * Cells(i, "H") - (Cells(i, "G") / 100 * Cells(i, "H") * 0.13)
Cells(i, "I") = Cells(i, "G") - Cells(i, "J")
Else
Cells(i, "j") = ""
Cells(i, "I") = ""
Cells(i, "H") = ""
End If
Next

Спасибо большое. Как бы в этот макрос вместо формул в столбце А автонумерацию сделать кодом ?

bsi

Цитироватьесли в столбце G удаляем данные, то столбцах H, I, J данные доже удалялись, сейчас данные удаляются только в I и J
С этим я разобрался и исправил. Осталось заменить формулы на код в столбце А.

rami

Цитата: bsi от  1 февраля 2017, 17:30Осталось заменить формулы на код в столбце А.
Попробуйте добавить в Case 1 строку oEvent.Spreadsheet.getCellByPosition(0,y).Value=y-4      'номер записи в ячейке A:
Case 1 'Колонка B - значение меняем с помощью функции Upper
oEvent.Spreadsheet.getCellByPosition(0,y).Value=y-4 'номер записи в ячейке A
oEvent.setString(oFuncAcc.callFunction("Upper", Array(oEvent.String)))

bsi

ЦитироватьПопробуйте добавить в Case 1 строку oEvent.Spreadsheet.getCellByPosition(0,y).Value=y-4
Да нумерация работает, но если внутри заполненного диапазона в столбце В удалить данные или удалить строку внутри заполненного диапазона, то пересчет нумерации не происходит. С формулой IF(ISBLANK(B17);"";COUNTA($B$6:B17)) этого недостатка нет. В Excel у меня такой код Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Автонумерация
Range("A7:A" & Range("B" & Rows.Count).End(xlUp).Row).FormulaR1C1 = "=IF(RC2="""","""",MAX(R1C1:R[-1]C)+1)"
Worksheets("Лист1").Range("A6").Value = 1 End Sub

rami

Цитата: bsi от  2 февраля 2017, 07:35Да нумерация работает, но если внутри заполненного диапазона в столбце В удалить данные или удалить строку внутри заполненного диапазона, то пересчет нумерации не происходит. С формулой IF(ISBLANK(B17);"";COUNTA($B$6:B17)) этого недостатка нет.
У формул есть механизм "зависимых" и "влияющих" ячеек, при изменении ячейки происходит перерасчёт всех связанных формул. В макросе это будет слишком громоздко, нужно будет пересчитывать весь диапазон.

bsi

ЦитироватьВ макросе это будет слишком громоздко
Плоховато.
И еще один вопрос по этой таблице. Есть ли возможность ту сделать, чтобы при активации ячейки в столбце В раскладка клавиатуры автоматом переключалась на латиницу, а при переходе на столбец С вновь включалась кириллица? В Excele это делал так Private Declare Function ActivateKeyboardLayout _
    Lib "user32" (ByVal HKL As Long, ByVal flags As Long) As Long
Const kb_lay_ru As Long = 68748313, kb_lay_en As Long = 67699721
Sub ВключитьРусскуюРаскладку()
    ' Переключить на русский язык
    x = ActivateKeyboardLayout&(kb_lay_ru, 0)
End Sub
Sub ВключитьАнглийскуюРаскладку()
    ' Переключить на английский язык
    x = ActivateKeyboardLayout&(kb_lay_en, 0)
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  'переключение раскладки
    Select Case Target.Column    ' в зависимости от номера столбца активной ячеки
        Case 2: 
            ВключитьАнглийскуюРаскладку
        Case 3:
            ВключитьРусскуюРаскладку
        Case Else:    ' ничего не делаем (оставляем текущую раскладку)
    End Select
End Sub
.
Огромное спасибо за помощь.

rami

Цитата: bsi от  2 февраля 2017, 08:36И еще один вопрос по этой таблице. Есть ли возможность ту сделать, чтобы при активации ячейки в столбце В раскладка клавиатуры автоматом переключалась на латиницу, а при переходе на столбец С вновь включалась кириллица?
Это обсуждали в отдельной теме, но я ничем помочь не могу, у меня Мак и нет ни Excel, ни соответствующих библиотек.

bsi

Ещё раз спасибо. Удачного дня.