Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2009, 15:29   #1
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию Упростить макрос

Как мона это упростить???
Код:
i = CLng(Left(Sheets(12).Range("D1"), 2))
If i = 1 Then выбор = 35
-----------------------
If i = 31 Then выбор = 1355
Значение, выбор, меняется с шагом 44

Последний раз редактировалось valerij; 19.12.2009 в 16:33.
valerij вне форума Ответить с цитированием
Старый 19.12.2009, 15:36   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код:
    i = CLng(Left(Sheets(12).Range("D1"), 2))
    выбор = 35 + (i - 1) * 44
PS: Тебе на лень было прописывать все эти строки вручную? На калькуляторе считал?
EducatedFool вне форума Ответить с цитированием
Старый 19.12.2009, 15:57   #3
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Тебе на лень было прописывать все эти строки вручную? На калькуляторе считал?
Игорь, какой калькулятор, а Excel, зачем, A1 = if i = 1, В1 = then выбор =, С1=35, С2 = С1+44, мышкой потянул до 31 и все! Копирую А1:С31 и в модуль.

Сбил меня!!
СПАСИБО!!!
Ну голова-ааа!!!

Последний раз редактировалось valerij; 19.12.2009 в 17:40.
valerij вне форума Ответить с цитированием
Старый 19.12.2009, 20:53   #4
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Все ли, так(я уже все подзабыл, большой перерыв был....)??
Код:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim iL%, i%, a%, b%
Application.EnableEvents = False
[a15] = Sheets(11).[L6]
[a16] = Sheets(11).[k6]
i = CLng(Left(Sheets(12).Range("D1"), 2))
If [h15] = "НЕТ" Then a = 1: b = 5: GoTo 1
If [h16] = "НЕТ" Then a = 6: b = 9: GoTo 1
GoTo 3
1:
выбор = 35 + (i - 1) * 44
        For iL = a To b
        хз = хз + Sheets(iL).Cells(выбор, 6)
        сумма = сумма + Sheets(iL).Cells(выбор, 12)
         With Sheets(12)
            .Cells(16, 2) = хз
                .Cells(16, 4) = сумма
                .Cells(15, 2) = .Cells(12, 2) - .Cells(16, 2)
            .Cells(15, 4) = .Cells(12, 4) - .Cells(16, 4)
         End With
        Next iL
3:
Application.EnableEvents = True
End Sub
valerij вне форума Ответить с цитированием
Старый 21.12.2009, 05:21   #5
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
Все ли, так??
Кроме Вас, этого не скажет никто. Другое дело, если Вам нужны советы по оптимизации кода.
1. Вместо функции CLng(...), в данном случае, лучше использовать функцию Val(...). Это не допустит возможную ошибку, в случае, если аргумент функции невозможно преобразовать в число. Т.е. текст и т.п.
2. По-возможности, не используйте оператор безусловного перехода GoTo. Это, во-первых, очень часто ни к чему, во-вторых, тормозит выполнение процедуры и расходует лишнюю память.
3. Держитесь подальше от функций без значка "$" таких как Left, Mid и т.п., т.к. они возвращают значение типа Variant. Обычные функции Left$ и Mid$ возвращают результат немедленно, без его неявного преобразования в Variant.
4. Все переменные лучше объявлять. В данном случае, если переменные выбор, хз и сумма не объявлены глобально, то нужно определить их тип в коде данной процедуры. (Убедитесь, что объявленные Вами переменные типа Integer будут действительно целыми числами и не превысят предел).
5. Рациональнее, сначала проверить условия, а затем выполнять (если это нужно) требуемые действия. У Вас же, выполняется действие безусловно (вычисление переменной i), а затем проверяются условия. При определенных условиях осуществляется выход из процедуры. Значит выполненное действие было ни к чему.
6. Учитывая все вышесказанное, Ваш код можно чуть оптимизировать (не с точки зрения уменьшения кода, а с точки зрения корректности и скорости), примерно так:
Код:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    Dim iL%, a%, b%, выбор%, хз As Double, сумма As Double: Application.EnableEvents = False
    [a15] = Sheets(11).[L6]: [a16] = Sheets(11).[k6]
    Select Case "НЕТ"
        Case [h15]: a = 1: b = 5
        Case [h16]: a = 6: b = 9
        Case Else: Application.EnableEvents = True: Exit Sub
    End Select
    With Sheets(12)
        выбор = 35 + (Val(Left$(.[D1], 2)) - 1) * 44
        For iL = a To b
            хз = хз + Sheets(iL).Cells(выбор, 6): сумма = сумма + Sheets(iL).Cells(выбор, 12)
            .[B16] = хз: .[D16] = сумма: .[B15] = .[B12] - .[B16]: .[D15] = .[D12] - .[D16]
    Next: End With: Application.EnableEvents = True
End Sub
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 21.12.2009 в 07:39.
SAS888 вне форума Ответить с цитированием
Старый 21.12.2009, 14:01   #6
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
если Вам нужны советы по оптимизации кода
Сергей!!!!!!!!
Огромное СПАСИБО!!!
______________
| ^^пиво^^ \\|""\\_,_
|___________||___|__|)
(@)(@)""*|(@)(@)**(@)
valerij вне форума Ответить с цитированием
Старый 20.01.2011, 11:22   #7
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Можно этот код, упростить и что бы формулы не светились, только значения?
Код:
With ActiveCell
    Range("N3").Select
    .FormulaR1C1 = _
        "='F:\Док_Офис\Офисный Учет\2010\4_Квартал\[Сбор 4 кв. 2010.xls]ОБЩИЕ'!R5C6"
    Range("N4").Select
    .FormulaR1C1 = _
        "='F:\Док_Офис\Офисный Учет\2010\4_Квартал\[Сбор 4 кв. 2010.xls]ОБЩИЕ'!R6C6"
    Range("N5").Select
    .FormulaR1C1 = _
        "='F:\Док_Офис\Офисный Учет\2010\4_Квартал\[Сбор 4 кв. 2010.xls]ОБЩИЕ'!R7C6"
    Range("N6").Select
    .FormulaR1C1 = _
        "='F:\Док_Офис\Офисный Учет\2010\4_Квартал\[Сбор 4 кв. 2010.xls]ОБЩИЕ'!R3C6"
    Range("N7").Select
    .FormulaR1C1 = _
        "='F:\Док_Офис\Офисный Учет\2010\4_Квартал\[Сбор 4 кв. 2010.xls]ОБЩИЕ'!R4C6"
    Range("N8").Select
    .FormulaR1C1 = _
        "='F:\Док_Офис\Офисный Учет\2010\4_Квартал\[Сбор 4 кв. 2010.xls]ОБЩИЕ'!R9C6"
    Range("N9").Select
    .FormulaR1C1 = _
        "='F:\Док_Офис\Офисный Учет\2010\4_Квартал\[Сбор 4 кв. 2010.xls]ОБЩИЕ'!R11C6"
End With

Последний раз редактировалось valerij; 20.01.2011 в 11:41.
valerij вне форума Ответить с цитированием
Старый 20.01.2011, 11:41   #8
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Попробуйте так:
Код:
Sub Main()
    Dim s As String, i As Integer, a(): Application.ScreenUpdating = False
    s = "='F:\Док_Офис\Офисный Учет\2010\4_Квартал\[Сбор 4 кв. 2010.xls]ОБЩИЕ'!"
    a = Array("R5C6", "R6C6", "R7C6", "R3C6", "R4C6", "R9C6", "R11C6")
    For i = 3 To 9: Cells(i, "N").FormulaR1C1 = s & a(i - 3): Next
    [N3:N9].Value = [N3:N9].Value
End Sub
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 20.01.2011, 12:10   #9
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
Попробуйте так
Сереж, как всегда, СУПЕР!!!!
Спасибо!!!!
valerij вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос постоянно обрабатывает события. При открытии другой книги макрос обрывается. Ples Microsoft Office Excel 8 17.12.2016 18:15
Можно упростить этот макрос? valerij Microsoft Office Excel 84 14.09.2014 16:17
Упростить SAS888 Microsoft Office Excel 4 25.08.2009 12:07
помогите упростить простой макрос frantic150 Microsoft Office Excel 2 23.06.2009 04:55
Упростить формулу Stif-rva Microsoft Office Excel 7 09.03.2009 11:03