Страницы: 1
RSS
как можно оптимизировать код VBA(слишком длинный код)?
 
Добрый день!  
Имеется несколько Sub, которые имеют одинаковые алгоритмы, но разные формулы:  
 
Public Sub sales(bill as Range)  
...  
...  
if ...  
...  
while ...  
 
bill.Value = "=Sales_source!F6"  
 
...  
...  
 
можно ли как-то передавать в Sub - формулы или названия ячеек?!  
 
чтобы было так  
 
call sales(bill, "=Sales_source!F6")  
call sales(bill, "=R[1]C*R[2]C*Initial!R25C5")
 
Т.е. чтобы Sub sales был один, а сейчас у меня их 30шт(каждый с разной формулой) и в каждом по 40строк кода?  
 
Могу выслать конкретный пример.  
Спасибо!
 
да
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Public Sub expenses_utilit(mon As Range, year As Range, per As Range, vvod As Range, data_sales As Range, utilit As Range)  
 
Dim x(12) As String  
Dim m As Integer  
Dim i As Integer  
Dim l As Integer  
Dim j As Integer  
Dim k As Integer  
Dim cnt As Integer  
Dim rost_sal As Integer  
Dim y As Integer  
Dim revenue(2) As Single  
 
revenue(0) = 0  
revenue(1) = 0  
 
 
y = year.Value  
 
x(0) = "Январь"  
x(1) = "Февраль"  
x(2) = "Март"  
x(3) = "Апрель"  
x(4) = "Май"  
x(5) = "Июнь"  
x(6) = "Июль"  
x(7) = "Август"  
x(8) = "Сентябрь"  
x(9) = "Октябрь"  
x(10) = "Ноябрь"  
x(11) = "Декабрь"  
 
n = UBound(x)  
   
 
For i = 0 To n - 1  
   If x(i) = mon.Value Then  
       m = i  
   End If  
Next  
 
k = n - m + n * (per.Value - 1)  
 
cnt = m  
index_infl = 0  
H = 4  
 
 
Do While k > 0  
 
   If (k <= n - m + n * (per.Value - 1) - data_sales.Value + 1) Then  
 
       utilit.FormulaR1C1 = "=R[1]C*R[2]C*Initial!R25C5"
       With utilit  
           .NumberFormat = "#,##0"  
           .Interior.ColorIndex = 15  
           .Font.Name = "Times New Roman"  
           .Font.Size = 10  
       End With  
 
    revenue(0) = revenue(0) + utilit  
 
       
   If (vvod.Value = "Год") Then  
       Columns(H).Hidden = True  
   Else  
       Columns(H).Hidden = False  
   End If  
 
Else  
       utilit.Formula = "0"  
       With utilit  
           .NumberFormat = "#,##0"  
           .Interior.ColorIndex = 15  
           .Font.Name = "Times New Roman"  
           .Font.Size = 10  
       End With  
       energy.Formula = "0"  
       With energy  
           .NumberFormat = "#,##0"  
           .Interior.ColorIndex = 2  
           .Font.Name = "Times New Roman"  
           .Font.Size = 10  
       End With  
 
   If (vvod.Value = "Год") Then  
       Columns(H).Hidden = True  
   Else  
       Columns(H).Hidden = False  
   End If  
 
End If  
 
       Set utilit = utilit.Offset(0, 1)  
 
   cnt = cnt + 1  
 
   If cnt >= n Then  
       H = H + 1  
       cnt = 0  
         
       utilit = revenue(0)  
       With utilit  
           .NumberFormat = "#,##0"  
           .Interior.ColorIndex = 15  
           .Font.Name = "Times New Roman"  
           .Font.Size = 10  
       End With  
 
       revenue(0) = 0  
         
       y = y + 1  
 
       Set utilit = utilit.Offset(0, 1)  
 
   End If  
 
       k = k - 1  
       H = H + 1  
 
Loop  
 
For l = k + 1 To 7 * 12  
 
   utilit.Clear  
   With utilit  
       .Interior.ColorIndex = 2  
   End With  
   Set utilit = utilit.Offset(0, 1)  
     
Next  
 
End Sub  
 
Вот код программы. В зависимости от заданных параметров выводит структуру по месяцам или по годам. Это издержки(затраты). В первой строчке у меня зарплаты - с января и 48 мес - выводятся зарплаты. Во второй строчке - оборудование тоже, самое, только там уже нужна формула(не ссылка на зп, как в первом случае).  
 
Получается, что для всех нужных строк будет одинаковый код, кроме самой формулы:  
utilit.FormulaR1C1 = "=R[1]C*R[2]C*Initial!R25C5"
 
В аргументе Sub формула не передается(либо я синтаксис плохо знаю), была идея рассчитать формулы и значения вписать в другие строки(скрытые), а потом просто передавать на формулу, а только значение ячейки - может можно проще все сделать?
 
Слишком уж вы много лишнего наворотили...  
 
Могу сказать только одно: вместо этого куска кода  
 
x(0) = "Январь"  
   x(1) = "Февраль"  
   x(2) = "Март"  
   x(3) = "Апрель"  
   x(4) = "Май"  
   x(5) = "Июнь"  
   x(6) = "Июль"  
   x(7) = "Август"  
   x(8) = "Сентябрь"  
   x(9) = "Октябрь"  
   x(10) = "Ноябрь"  
   x(11) = "Декабрь"  
 
   n = UBound(x)  
 
 
 
   For i = 0 To n - 1  
       If x(i) = mon.Value Then  
           m = i  
       End If  
   Next  
 
 
 
достаточно одной строки:    
m = Month(CDate("1 " & mon.Value)) ' получаем номер месяца из его названия  
 
Увы, остальное не осилил.  
Проще с нуля всё написать, чем в этом разбираться.
 
EducatedFool, спасибо за подсказку ))
 
If (vvod.Value = "Год") Then  
Columns(H).Hidden = True  
Else  
Columns(H).Hidden = False  
End If  
 
 
Columns(H).Hidden=Iif(vvod.Value = "Год",True,False)
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
А так?  
 
Columns(H).Hidden = vvod.Value = "Год"
 
>>А так?  
Здорово)  
 
44005
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
Страницы: 1
Читают тему
Наверх
Loading...