Wątek przeniesiony 2021-09-16 10:16 z Inne języki programowania przez cerrato.

VBA optymalizacja/ uproszczenie instrukcji IF

0

Witam,

Czy ktoś mógłby mi podpowiedzieć jak uprościć to na razie jeszcze "proste" makro. Na ten moment jego działanie polega na tym bym po naciśnięciu przycisku w komórkach z zakresu C14:D18 zmieniać wartość komórki na "1". Po każdym naciśnięciu, kolejnej komórki z tego zakresu w przypadku jeśli poprzednia już ma taką wartość.

Czy da się jakoś ten kod skrócić? Ewentualnie wprowadzić do kodu jakieś określenie zakresu już na początku tak by nie trzeba było tego robić za każdym razem ręcznie zmieniając w kodzie wartości komórek w przypadku gdyby zakres miał się zmienić np. na E14:F18? I co wtedy zmienić w samym kodzie.

Cel poszukiwanego uproszczenia jest taki by w momencie kiedy, makro będzie bardziej rozbudowane i będzie odnosiło się do np. 20 takich zakresów po 10 komórek nie trzeba było tego za każdym razem edytować ręcznie w kodzie linijka po linijce nazw komórek a np. przekopiować część kodu i zmienić tylko zakres, w którym ma działać.

Mile widziane choćby wymienienie zagadnień naprowadzających na uzyskanie powyższego efektu.

Sub Aktywacja()
'
' Aktywacja Makro
' TEST
'

'
  
  
  If Range("C14").Value = 0 Then
  Range("C14").Value = 1
  Else
        
        If Range("D14").Value = 0 Then
        Range("D14").Value = 1
        Else
            
            If Range("C15").Value = 0 Then
            Range("C15").Value = 1
            Else
        
                If Range("D15").Value = 0 Then
                Range("D15").Value = 1
                Else
                
                    If Range("C16").Value = 0 Then
                    Range("C16").Value = 1
                    Else
        
                        If Range("D16").Value = 0 Then
                        Range("D16").Value = 1
                        Else
                        
                            If Range("C17").Value = 0 Then
                            Range("C17").Value = 1
                            Else
                                
                                If Range("D17").Value = 0 Then
                                Range("D17").Value = 1
                                Else
                                    
                                    If Range("C18").Value = 0 Then
                                    Range("C18").Value = 1
                                    Else
                                        
                                        If Range("D18").Value = 0 Then
                                        Range("D18").Value = 1
                                        Else
                                        MsgBox "Czas najwyższy"
        
                                        End If
                                         
        
                                    End If
                                    
                                End If
                                
                            End If
                        
                        End If
        
                    End If
        
                End If
        
            End If
        
        End If
  
  End If

End Sub

 

Z góry dziękuje za pomoc.

0

Pętla?

0

A którą w takim przypadku najlepiej zastosować?

Do While
Do Until
For Next
For Each Next ?

I czy taka pętla nie wypełni po naciśnięciu tylko jeden raz przycisku całego zakresu komórek danymi? Bo nie o taki efekt chodzi.

0

Coś nie bardzo wychodzi mi z tą pętlą

Na początku próbowałem uzyskać oczekiwany efekt dla jednej kolumny z zakresu L3:L6. Bo na tą chwilę zdefiniowanie zakresu dwu kolumnowego (np. L3:M6) tak żeby go później użyć to dla mnie czarna magia :)

Sub AktywacjaVer2()
'
' AktywacjaVer2 Makro
'

'
  

  Range("L3").Select
  
   
  Do Until Range("L6").Value = 1
   
   
  If Selection.Value = 0 Then
  Selection.Value = 1
  Else
  
  ActiveCell.Offset(1, 0).Select
  
  End If
    
  Loop
    
End Sub 

Jednak taki kod wypełnia z automatu wszystkie komórki L3:L6 wartościami 1. Zmodyfikowałem go więc o

 Sub AktywacjaVer2()
'
' AktywacjaVer2 Makro
'

'
  

  Range("L3").Select
  
   
  Do Until Range("L6").Value = 1
   
   
  If Selection.Value = 0 Then
  Selection.Value = 1
  Else
  
  ActiveCell.Offset(1, 0).Select
  
  End If
    
**  If ActiveCell.Value = 1 Then
  ActiveCell.Offset(1, 0).Select
  Exit Do
  End If**
    
  
    
  Loop
    
End Sub

Ale wtedy działa poprawnie tylko przez pierwsze dwa kliknięcia. To jest po pierwszym kliknięciu L3 ma wartość 1, po drugim kliknięciu L4 ma wartość 1 a przy kolejnym kliknięciu już się nic nie dzieje. Co należało by zmienić?

1 użytkowników online, w tym zalogowanych: 0, gości: 1