Notifications
Clear all

VBA - Alternativa ao "IF" statement

4 Posts
3 Usuários
0 Reactions
1,165 Visualizações
(@miguexcel)
Posts: 167
Estimable Member
Topic starter
 

Olá a todos,

Tenho um arquivo bastante grande, com muitos empregados.

O arquivo contém toda a informação do empregado, incluindo seus salários. No entanto, na minha empresa foram criadas zonas (ZonaA, ZonaB, ZonaC, ZonaD) para saber onde fica posicionado o salário do empregado. Essas zonas têm valores de salário de referência definidos.

Criei um código em VBA que indica o valor para cada uma das zonas, de acordo com vários critérios:
Critério 1: NIvel
Critério 2: Grupo
Critério 3: Grelha de Referência

Nesse código, criei um conjunto de "IFs" / "Condições" para preencher estas colunas, mas acho que este processo fica muito lento quando o número de empregados aumenta e penso que existe outra forma de otimizar meu código. A ideia é fazer tudo em VBA e não utilizar no arquivo tabelas de apoio...

Alguém me pode ajudar a melhorar este código? O arquivo que envio é apenas um exemplo da grande base de dados que tenho.

Obrigado

 
Postado : 20/07/2016 2:00 pm
(@vbajr10)
Posts: 34
Eminent Member
 

Amigo, boa noite!

Não li seu código, mas não seria melhor nesse caso Select Case?

 
Postado : 20/07/2016 3:50 pm
(@miguexcel)
Posts: 167
Estimable Member
Topic starter
 

Possivelmente.. Pensei nisso, mas não sei trabalhar bem com select case. E em alguns casos, o código mete algumas condições 'And' ou 'Or'

 
Postado : 20/07/2016 4:02 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Em uma rápida olhada, a utilização do Nível parece ser desnecessária, já que os grupos salariais são únicos.
Há uma sobreposição de grupos , o que acarreta duplo processamento.
Apesar de não querer utilizar tabelas, e aconselhavel utiliza-las, pois qualquer alteração das faixas salariais(inclusão/exclusão e alteração de valores), acarretará necessidade de edição da rotina para isso, mas se tiver "tabelado" qualquer pessoa pode alterar.
Experimente:
Com Select Case

Sub Zonas()
Dim x As Long, LastR As Long, StartR As Long
Dim ZonaA As Integer, ZonaB As Integer, ZonaC As Integer, ZonaD As Integer
Dim Grupo As Integer
Dim Reference As String

StartR = 2
LastR = Worksheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row

ZonaA = Application.Match("Zona A", Range("1:1"), 0)
ZonaB = Application.Match("Zona B", Range("1:1"), 0)
ZonaC = Application.Match("Zona C", Range("1:1"), 0)
ZonaD = Application.Match("Zona D", Range("1:1"), 0)

For x = StartR To LastR

Reference = Cells(x, Application.Match("Grelha Referência", Range("1:1"), 0))
'Nivel = Cells(x, Application.Match("Nivel", Range("1:1"), 0)).Value
Grupo = Cells(x, Application.Match("Grupo", Range("1:1"), 0)).Value

    Select Case Grupo
        Case 70, 71
            Cells(x, ZonaA).Value = 13500
            Cells(x, ZonaB).Value = 16350
            Cells(x, ZonaC).Value = 21000
            Cells(x, ZonaD).Value = 26000
        Case 68, 69
            Cells(x, ZonaA).Value = 10000
            Cells(x, ZonaB).Value = 13000
            Cells(x, ZonaC).Value = 17000
            Cells(x, ZonaD).Value = 20000
        Case 66, 67
            Cells(x, ZonaA).Value = 9500
            Cells(x, ZonaB).Value = 11000
            Cells(x, ZonaC).Value = 14000
            Cells(x, ZonaD).Value = 18500
        Case 63, 64, 65
            Cells(x, ZonaA).Value = 7000
            Cells(x, ZonaB).Value = 9000
            Cells(x, ZonaC).Value = 11500
            Cells(x, ZonaD).Value = 13000
            Case 60, 61, 62
        If Reference = "A" Then
            Cells(x, ZonaA).Value = 5000
            Cells(x, ZonaB).Value = 6000
            Cells(x, ZonaC).Value = 7000
            Cells(x, ZonaD).Value = 9000
        ElseIf Reference = "B" Then
            Cells(x, ZonaA).Value = 5000
            Cells(x, ZonaB).Value = 6000
            Cells(x, ZonaC).Value = 7500
            Cells(x, ZonaD).Value = 10000
        End If
        Case 57, 58, 59
        If Reference = "A" Then
            Cells(x, ZonaA).Value = 3500
            Cells(x, ZonaB).Value = 4000
            Cells(x, ZonaC).Value = 5500
            Cells(x, ZonaD).Value = 7000
        ElseIf Reference = "B" Then
            Cells(x, ZonaA).Value = 4000
            Cells(x, ZonaB).Value = 7000
            Cells(x, ZonaC).Value = 8000
            Cells(x, ZonaD).Value = 11000
        End If
        Case 56
        If Reference = "A" Then
            Cells(x, ZonaA).Value = 3000
            Cells(x, ZonaB).Value = 4000
            Cells(x, ZonaC).Value = 5200
            Cells(x, ZonaD).Value = 6000
        ElseIf Reference = "B" Then
            Cells(x, ZonaA).Value = 4000
            Cells(x, ZonaB).Value = 5800
            Cells(x, ZonaC).Value = 7000
            Cells(x, ZonaD).Value = 8350
        End If
        Case 54, 55
        If Reference = "A" Then
            Cells(x, ZonaA).Value = 2250
            Cells(x, ZonaB).Value = 3000
            Cells(x, ZonaC).Value = 3800
            Cells(x, ZonaD).Value = 4900
        ElseIf Reference = "B" Then
            Cells(x, ZonaA).Value = 3000
            Cells(x, ZonaB).Value = 4000
            Cells(x, ZonaC).Value = 5000
            Cells(x, ZonaD).Value = 7050
        End If
        Case 53
        If Reference = "A" Then
            Cells(x, ZonaA).Value = 1950
            Cells(x, ZonaB).Value = 2600
            Cells(x, ZonaC).Value = 3700
            Cells(x, ZonaD).Value = 4200
        ElseIf Reference = "B" Then
            Cells(x, ZonaA).Value = 2800
            Cells(x, ZonaB).Value = 3500
            Cells(x, ZonaC).Value = 4500
            Cells(x, ZonaD).Value = 6000
        End If
        Case 51, 52
        If Reference = "A" Then
            Cells(x, ZonaA).Value = 1650
            Cells(x, ZonaB).Value = 1890
            Cells(x, ZonaC).Value = 2600
            Cells(x, ZonaD).Value = 3700
        ElseIf Reference = "B" Then
            Cells(x, ZonaA).Value = 2200
            Cells(x, ZonaB).Value = 2900
            Cells(x, ZonaC).Value = 3600
            Cells(x, ZonaD).Value = 4400
        End If
        Case 50
        If Reference = "A" Then
            Cells(x, ZonaA).Value = 1500
            Cells(x, ZonaB).Value = 2000
            Cells(x, ZonaC).Value = 2400
            Cells(x, ZonaD).Value = 2900
        ElseIf Reference = "B" Then
            Cells(x, ZonaA).Value = 2100
            Cells(x, ZonaB).Value = 2400
            Cells(x, ZonaC).Value = 2900
            Cells(x, ZonaD).Value = 3200
        End If
    End Select

Next x

End Sub

Comm If

Sub Zonas()
Dim x As Long, LastR As Long, StartR As Long
Dim ZonaA As Integer, ZonaB As Integer, ZonaC As Integer, ZonaD As Integer
Dim Grupo As Integer
Dim Reference As String

StartR = 2
LastR = Worksheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row

ZonaA = Application.Match("Zona A", Range("1:1"), 0)
ZonaB = Application.Match("Zona B", Range("1:1"), 0)
ZonaC = Application.Match("Zona C", Range("1:1"), 0)
ZonaD = Application.Match("Zona D", Range("1:1"), 0)

For x = StartR To LastR

Reference = Cells(x, Application.Match("Grelha Referência", Range("1:1"), 0))
'Nivel = Cells(x, Application.Match("Nivel", Range("1:1"), 0)).Value
Grupo = Cells(x, Application.Match("Grupo", Range("1:1"), 0)).Value

    If Grupo = 70 Or Grupo = 71 Then
        Cells(x, ZonaA).Value = 13500
        Cells(x, ZonaB).Value = 16350
        Cells(x, ZonaC).Value = 21000
        Cells(x, ZonaD).Value = 26000
    ElseIf Grupo = 68 Or Grupo = 69 Then
        Cells(x, ZonaA).Value = 10000
        Cells(x, ZonaB).Value = 13000
        Cells(x, ZonaC).Value = 17000
        Cells(x, ZonaD).Value = 20000
    ElseIf Grupo = 66 Or Grupo = 67 Then
        Cells(x, ZonaA).Value = 9500
        Cells(x, ZonaB).Value = 11000
        Cells(x, ZonaC).Value = 14000
        Cells(x, ZonaD).Value = 18500
    ElseIf Grupo >= 63 And Grupo <= 65 Then
        Cells(x, ZonaA).Value = 7000
        Cells(x, ZonaB).Value = 9000
        Cells(x, ZonaC).Value = 11500
        Cells(x, ZonaD).Value = 13000
    ElseIf Grupo >= 60 And Grupo <= 62 Then
        If Reference = "A" Then
            Cells(x, ZonaA).Value = 5000
            Cells(x, ZonaB).Value = 6000
            Cells(x, ZonaC).Value = 7000
            Cells(x, ZonaD).Value = 9000
        ElseIf Reference = "B" Then
            Cells(x, ZonaA).Value = 5000
            Cells(x, ZonaB).Value = 6000
            Cells(x, ZonaC).Value = 7500
            Cells(x, ZonaD).Value = 10000
        End If
    ElseIf Grupo >= 57 And Grupo <= 59 Then
        If Reference = "A" Then
            Cells(x, ZonaA).Value = 3500
            Cells(x, ZonaB).Value = 4000
            Cells(x, ZonaC).Value = 5500
            Cells(x, ZonaD).Value = 7000
        ElseIf Reference = "B" Then
            Cells(x, ZonaA).Value = 4000
            Cells(x, ZonaB).Value = 7000
            Cells(x, ZonaC).Value = 8000
            Cells(x, ZonaD).Value = 11000
        End If
    ElseIf Grupo = 56 Then
        If Reference = "A" Then
            Cells(x, ZonaA).Value = 3000
            Cells(x, ZonaB).Value = 4000
            Cells(x, ZonaC).Value = 5200
            Cells(x, ZonaD).Value = 6000
        ElseIf Reference = "B" Then
            Cells(x, ZonaA).Value = 4000
            Cells(x, ZonaB).Value = 5800
            Cells(x, ZonaC).Value = 7000
            Cells(x, ZonaD).Value = 8350
        End If
    ElseIf Grupo = 54 Or Grupo = 55 Then
        If Reference = "A" Then
            Cells(x, ZonaA).Value = 2250
            Cells(x, ZonaB).Value = 3000
            Cells(x, ZonaC).Value = 3800
            Cells(x, ZonaD).Value = 4900
        ElseIf Reference = "B" Then
            Cells(x, ZonaA).Value = 3000
            Cells(x, ZonaB).Value = 4000
            Cells(x, ZonaC).Value = 5000
            Cells(x, ZonaD).Value = 7050
        End If
    ElseIf Grupo = 53 Then
        If Reference = "A" Then
            Cells(x, ZonaA).Value = 1950
            Cells(x, ZonaB).Value = 2600
            Cells(x, ZonaC).Value = 3700
            Cells(x, ZonaD).Value = 4200
        ElseIf Reference = "B" Then
            Cells(x, ZonaA).Value = 2800
            Cells(x, ZonaB).Value = 3500
            Cells(x, ZonaC).Value = 4500
            Cells(x, ZonaD).Value = 6000
        End If
    ElseIf Grupo = 51 Or Grupo = 52 Then
        If Reference = "A" Then
            Cells(x, ZonaA).Value = 1650
            Cells(x, ZonaB).Value = 1890
            Cells(x, ZonaC).Value = 2600
            Cells(x, ZonaD).Value = 3700
        ElseIf Reference = "B" Then
            Cells(x, ZonaA).Value = 2200
            Cells(x, ZonaB).Value = 2900
            Cells(x, ZonaC).Value = 3600
            Cells(x, ZonaD).Value = 4400
        End If
    ElseIf Grupo = 50 Then
        If Reference = "A" Then
            Cells(x, ZonaA).Value = 1500
            Cells(x, ZonaB).Value = 2000
            Cells(x, ZonaC).Value = 2400
            Cells(x, ZonaD).Value = 2900
        ElseIf Reference = "B" Then
            Cells(x, ZonaA).Value = 2100
            Cells(x, ZonaB).Value = 2400
            Cells(x, ZonaC).Value = 2900
            Cells(x, ZonaD).Value = 3200
        End If
    End If

Next x

End Sub

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 21/07/2016 9:27 am