ID tematu: 811
 |
Funkcja IF |
Autor |
Wiadomość |
guss
Starszy Forumowicz

Posty: 43
|
Wysłany: 29-03-2007, 14:23 Funkcja IF
|
|
|
Mam takie makro na formie:
Private Sub CommandButton1_Click()
nr = Label2
If nr = 1 Then
kod
end if
If nr = 2 Then
kod
end if
itd
I tak 52 funkcje if ( dla konkretnych tygodni)
Każda funkcja się różni bo odnosi się do różnych arkuszy.
A czy można utworzyc procedurę która obejmowała kilka następujących po sobie funkcji if?
Spróbowałem przed wszystkimi funkcjami wpisac:
Label8 = a
Label9 = b
For nr = a To b Step 1
Next nr
gdzie a i b to zakres od a do b ale nic sie nie dzieje
Dziękuje za jakąkolwiek pomoc
Tomek |
|
 | ID posta:
4219
|
|
|
 |
|
|
|
Tajan

Pomógł: 5591 razy Posty: 12114
|
Wysłany: 29-03-2007, 20:05
|
|
|
Nie bardzo rozumiem, co ma się dziać, skoro między For i Next nie ma żadnego kodu?
Musisz tam umieścić instrukcje, które będą wykonywane dla kolejnych wartości przyjmowaną przez zmienną nr. Chociażby te, które masz na poczatku postu:
Kod: |
For nr = a To b
If nr = 1 Then
'kod
ElseIf nr = 2 Then
'kod
ElseIf nr = 3 Then
'kod
End If
Next nr
|
Jednak tego typu konstrukcje nie zawsze są konieczne, jeżeli instrukcje enigmatycznie nazwane przez Ciebie "kod" sa do siebie bardzo podobne, różniąc sie np. wartościami zależnymi od zmiennej "nr". Jeżeli, przykładowo, chcesz nadać wartość komórkom A1 wybranych arkuszy to możesz zrobić to tak:
Kod: |
For nr = a To b
If nr = 1 Then
Sheets("arkusz1").Range("A1")="wartość"
ElseIf nr = 2 Then
Sheets("arkusz2").Range("A1")="wartość"
ElseIf nr = 3 Then
Sheets("arkusz3").Range("A1")="wartość"
End If
Next nr
|
Ale taki sposób jest mało efektywny. Zamiast tworzyć wiele sekcji instrukcji If-ElseIf, wystarczy wykorzystać zmienną "nr" do utworzenia nazwy danego arkusza i całkowicie zrezygnować z instrukcji If:
Kod: |
For nr = a To b
Sheets("arkusz" & nr).Range("A1")="wartość"
Next nr
|
W ten sposób nasz kod zostanie wykonany tylko dla arkuszy, których nazwy określi nam zmienna "nr", zmieniając swoją wartość przy każdym przebiegu pętli. |
|
 | ID posta:
4228
|
|
|
 |
|
|
guss
Starszy Forumowicz

Posty: 43
|
Wysłany: 31-03-2007, 07:58
|
|
|
Witam
Widzisz Tajan jestem na etapie nagrywania makr i przerabiania ich dla własnych potrzeb.
Dzięki za pomoc (w zlym miejscu dawalem "next").
Mam jeszcze pytanie.Kod wygląda tak:
Kod: | If nr = 1 Then
Sheets(nr).Select
ActiveWorkbook.Names.Add Name:="kryt11", RefersToR1C1:="='1'!R5C1:R111C1"
ActiveWorkbook.Names.Add Name:="kryt21", RefersToR1C1:="='1'!R5C2:R111C2"
ActiveWorkbook.Names.Add Name:="kryt31", RefersToR1C1:="='1'!R5C3:R111C3"
ActiveWorkbook.Names.Add Name:="kryt41", RefersToR1C1:="='1'!R5C4:R111C4"
Sheets("suma").Select
Range("f5").Select
Selection.FormulaArray = _
"=IF(ISNA(INDEX(suma1,MATCH(4,(kryt11=RC[-5])+(kryt21=RC[-4])+(kryt31=RC[-3])+(kryt41=RC[-2]),0))),"""",INDEX(suma1,MATCH(4,(kryt11=RC[-5])+(kryt21=RC[-4])+(kryt31=RC[-3])+(kryt41=RC[-2]),0)))"
Selection.AutoFill Destination:=Range("f5:f111"), Type:=xlFillDefault
Else
End If
If nr = 2 Then
Sheets(2).Select
ActiveWorkbook.Names.Add Name:="kryt12", RefersToR1C1:="='2'!R5C1:R111C1"
ActiveWorkbook.Names.Add Name:="kryt22", RefersToR1C1:="='2'!R5C2:R111C2"
ActiveWorkbook.Names.Add Name:="kryt32", RefersToR1C1:="='2'!R5C3:R111C3"
ActiveWorkbook.Names.Add Name:="kryt42", RefersToR1C1:="='2'!R5C4:R111C4"
Sheets("suma").Select
Range("g5").Select
Selection.FormulaArray = _
"=IF(ISNA(INDEX(suma2,MATCH(4,(kryt12=RC[-6])+(kryt22=RC[-5])+(kryt32=RC[-4])+(kryt42=RC[-3]),0))),"""",INDEX(suma2,MATCH(4,(kryt12=RC[-6])+(kryt22=RC[-5])+(kryt32=RC[-4])+(kryt42=RC[-3]),0)))"
Selection.AutoFill Destination:=Range("g5:g111"), Type:=xlFillDefault
Else
End If |
Czyli definiuje zakresy i wkleja formułę.
Czy można zrobi to za pomocą jednej funkcji :if"? |
|
 | ID posta:
4297
|
|
|
 |
|
|
Trebor
Excel Expert

Pomógł: 1752 razy Posty: 4680
|
Wysłany: 31-03-2007, 09:28
|
|
|
Sprawdź coś takiego
Kod: |
ActiveWorkbook.Names.Add Name:="kryt1" & nr, RefersToR1C1:="='" & nr & "'!R5C1:R111C1"
ActiveWorkbook.Names.Add Name:="kryt2" & nr, RefersToR1C1:="='" & nr & "'!R5C2:R111C2"
ActiveWorkbook.Names.Add Name:="kryt3" & nr, RefersToR1C1:="='" & nr & "'!R5C3:R111C3"
ActiveWorkbook.Names.Add Name:="kryt4" & nr, RefersToR1C1:="='" & nr & "'!R5C4:R111C4"
Sheets("suma").Select
Cells(5, 5 + nr).FormulaArray = _
"=IF(ISNA(INDEX(suma" & nr & ",MATCH(4,(kryt1" & nr & "=RC1)+(kryt2" & nr & "=RC2)+(kryt3" & nr & "=RC3)+(kryt4" & nr & "=RC4),0))),"""",INDEX(suma1,MATCH(4,(kryt1" & nr & "=RC1)+(kryt2" & nr & "=RC2)+(kryt3" & nr & "=RC3)+(kryt4" & nr & "=RC4),0)))"
Cells(5, 5 + nr).AutoFill Destination:=Range(Cells(5, 5 + nr), Cells(111, 5 + nr)), Type:=xlFillDefault
|
Pozdrawiam |
_________________ Trebbor@wp.pl |
|
 | ID posta:
4298
|
|
|
 |
|
|
Tajan

Pomógł: 5591 razy Posty: 12114
|
Wysłany: 01-04-2007, 08:53
|
|
|
Dopowiem, że kodu Trebora możesz użyć tak:
Kod: | Private Sub CommandButton1_Click()
Dim nr As Long
nr = Label2
' tu kod
End Sub
|
lub tak:
Kod: |
Private Sub CommandButton1_Click()
Dim a As Long, b As Long, nr As Long
a = Label8
b = Label9
For nr = a To b Step 1
'tu kod
Next nr
End Sub
|
Pierwszy przykład wykona się tulko raz, dla numeru, który jest umieszczony w etykiecie Label2. Natomiast drugi przykład wykona się tyle razy, ile wynosi różnica między wartościami przypisanymi do Label8 i Label9. |
|
 | ID posta:
4320
|
|
|
 |
|
|
guss
Starszy Forumowicz

Posty: 43
|
Wysłany: 01-04-2007, 09:36
|
|
|
Bardzo dziękuję.Działa bez zarzutu. |
|
 | ID posta:
4322
|
|
|
 |
|
|
|
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Możesz ściągać załączniki na tym forum
|
Dodaj temat do Ulubionych Wersja do druku
|
|
Strona uĹźywa plikĂłw cookies.
Kliknij tutaj, Ĺźeby dowiedzieÄ siÄ jaki jest cel uĹźywania cookies oraz jak zmieniÄ ustawienia cookie w przeglďż˝darce.
KorzystajÄ
c ze strony uĹźytkownik wyraĹźa zgodÄ na uĹźywanie plikĂłw cookies, zgodnie z bieĹźÄ
cymi ustawieniami przeglÄ
darki.
SprawdĹş, w jaki sposĂłb przetwarzamy dane osobowe
|