2015-10-05 5 views
1

Я пытаюсь написать этот Sub, который обновляет таблицу (известного) определенного количества столбцов, но неопределенное количество строк. У меня есть значения в последней строке таблицы и в первом столбце таблицы, которые мне нужны для вычисления. Это мой код до сих пор: (Это работает только работает очень медленно)VBA Excel Sub работает очень медленно

Sub updateMySheets() 

Application.DisplayAlerts = False 
Application.ScreenUpdating = False 
Application.EnableEvents = False 
Application.Calculation = xlCalculationManual 

Dim x, y As Integer 

'Looks dynamically for the largest row & column index 
numrows = Range("C2", Range("C2").End(xlDown)).Rows.Count 
numcols = Range("C2", Range("C2").End(xlToRight)).Columns.Count 

Range("C2").Select 

Dim discount, margin As Double 

For x = 1 To numrows - 1 

    discount = ActiveCell.Offset(0, -1).Value 
    For y = 1 To numcols 

    margin = ActiveCell.Offset(numrows - x, y - 1).Value 

    If margin - discount <= 0.0001 Then 

     'Hier noch ggf. die Cell farbig anpassen 
     ActiveCell.Offset(0, y - 1).Value = "" 

    Else 

     ActiveCell.Offset(0, y - 1).Value = discount/(margin - discount) 

    End If 

Next 

    ActiveCell.Offset(1, 0).Select 

Next 

Application.Calculation = xlCalculationAutomatic 
Application.DisplayAlerts = True 
Application.ScreenUpdating = True 
Application.EnableEvents = True 

End Sub 

Помощь была бы оценена

+2

Опишите, что вы пытаетесь достичь с помощью этого кода? Нам может быть проще, чем пытаться прочитать ваш код. – Marc

+0

Как настроены ваши вложенные петли 'For', этот процесс выполняет действие для каждой ячейки в используемом диапазоне вашей книги. Вы можете оптимизировать, будучи более избирательным, над какими ячейками вы действительно должны выполнять вычисления и модификации. Другая вещь, которая может помочь в скорости, - использовать ActiveCell.Offset (1,0). Активировать' вместо 'ActiveCell.Offset (1,0). Выбрать'. Я обнаружил, что «выбор» вещей в Excel VBA медленнее, чем «активация» их (я понятия не имею, почему). – CactusCake

+0

В первом столбце указаны потенциальные цены, а в последней строке - поля определенных продуктов. То, что я хочу рассчитать, - это увеличение объема, которое необходимо достичь, чтобы сохранить определенный запас. Формулы - это всего лишь эмпирическое правило, а не точное. но этого достаточно для моей цели. –

ответ

2

Попробуйте это, я пометил свои комментарии с '// и прокомментировал свой существующий код Стандарт '

Sub MM() 

'// You can use "," to Dim multiple variables but you still 
'// need to declare the data type otherwise it will default 
'// to type "Variant" which can cause issues later in your code. 
Dim x As Integer, y As Integer 
Dim discount As Double, margin As Double 

''Looks dynamically for the largest row & column index 
'numrows = Range("C2", Range("C2").End(xlDown)).Rows.count 
'numcols = Range("C2", Range("C2").End(xlToRight)).Columns.count 

For Each sh In ActiveWorkbook.Sheets 

With sh 
    '// Get the row number of the last row in C and minus 1 for the header. 
    numRows = .Cells(.Rows.count, 3).End(xlUp).Row - 1 

    '// Same logic for the columns 
    numCols = .Cells(2, .Columns.count).End(xlToLeft).Column - 1 

    '// Never need to ".Select" anything 
    'Range("C2").Select 

    'Dim discount, margin As Double (See first comment) 

    For x = 1 To numRows - 1 

     '// Just use x to determine the row number. 
     'discount = ActiveCell.Offset(0, -1).value 
     discount = .Cells(x + 1, 2).value 

     For y = 1 To numCols 
      margin = .Cells(x + 1, 3).Offset(numRows - x, y - 1).value 

      If margin - discount <= 0.0001 Then 
       .Cells(x + 1, 3).Offset(0, y - 1).value = "" 
      Else 
       .Cells(x + 1, 3).Offset(0, y - 1).value = discount/(margin - discount) 
      End If 
     Next 

    Next 

End With 

Next 

End Sub 
+0

Большое спасибо! похоже, это трюк! Я действительно должен заглянуть в это целое «не используя select/activate» -thing. Спасибо снова! –

+0

Не беспокойтесь, не забудьте отметить как ответ, если это поможет. –

+0

Мне нужно запустить этот sub на 8 разных листах. как я могу это сделать без активации каждого листа? –

Смежные вопросы