< návrat zpět
MS Excel
Téma: VBA - IF
Zaslal/a lukasek000 11.7.2016 21:25
zdravím, už nějakou chvilku se párám s tímto kódem a nemůžu ho dodělat..
Má špatně IF, ale nemůžu přijít jak to porovnat..
jde jen o to, že v "i" mám načtený text, který se shoduje s názvy listů a pouze potřebuji porovnat, jestli ten list existuje v celém sešitu, pokud ano, uzamkne buňku viz. příklad
Sub zamknout()
Dim ws As Worksheet
i = Sheets("seznam").range("b2:b4")
For Each ws In Worksheets
If i = ws.Name Then
ws.range("B1:B4").Locked = False
End If
Next ws
End Sub
vovka.h(11.7.2016 23:13)#032025 Nebude to tím, že Range.Locked = False tu oblast odemyká, místo toho, aby se zamkla (jak si asi přejete)?
citovat
eLCHa(12.7.2016 8:30)#032026 No, to taky. Ale hlavně
i = Sheets("seznam").range("b2:b4")načítá pole a proto
i = ws.Namemusí házet chybu.
Zkuste něco takového
Sub subZamknout()
Dim ws As Worksheet
For Each ws In Worksheets
If Not ws.Name = "seznam" Then
If Not WorksheetFunction.CountIf(Sheets("seznam").Range("b2:b4"), ws.Name) = 0 Then
ws.Range("B1:B4").Locked = True
End If
End If
Next ws
Set ws = Nothing
End Subcitovat
lukasek000(12.7.2016 8:42)#032027 eLCHa: mnohokrát děkuji, funguje suprově
citovat
xlnc(12.7.2016 17:13)#032028 A je v daném případě potřeba vůbec nějaký cyklus? Předpokládám, že hledaný název je jen jeden. Proč to tedy nenastavit právě u tohoto listu a použít nad tím On Error, kdyby náhodou v sešitu neexistoval?
citovat
eLCHa(12.7.2016 17:47)#032029 Rozumím tomu, že je to seznam listů. Takže buď projede všechny listy nebo všechny buňky. Takže se bez cyklu neobejde. Vzhledem k malému počtu položek to na rychlost asi nemá vliv. "Rychlejší" bude asi druhá možnost, prakticky je to asi jedno.
citovat
lukasek000(12.7.2016 19:32)#032031 xlnc napsal/a:
A je v daném případě potřeba vůbec nějaký cyklus? Předpokládám, že hledaný název je jen jeden. Proč to tedy nenastavit právě u tohoto listu a použít nad tím On Error, kdyby náhodou v sešitu neexistoval?
jde o to, že do seznamu se načte například 20listů a příkaz provede u všech listů, které jsou v seznamu. Cyklus je tedy na místě :)
citovat
daal(12.7.2016 22:28)#032032 lukasek000 napsal/a:
jde o to, že do seznamu se načte například 20listů a příkaz provede u všech listů, které jsou v seznamu. Cyklus je tedy na místě :)
Nechápu proč v cyklu znovu číst oblast z listu seznam.
Moc taky nechápu k čemu to máte. Nepíšete nic o odemčení/uzamčení listů.
@xlnc: takto nějak?
Viz. příloha
Příloha: 32032_checkandlock.txt (2kB, staženo 24x) citovat
xlnc(13.7.2016 0:36)#032033 eLCha: Těžko říct, co tím básník vůbec myslel...
citovat
eLCHa(13.7.2016 7:48)#032034 @DAAL
něco takového by mělo stačit
Sub test()
Dim rCell As Range
For Each rCell In Sheets("seznam").Range("B2:B11").Cells
If Not IsError(Evaluate("='" & rCell.Value & "'!A1")) Then
Sheets(rCell.Value).Range("B1:B4").Locked = True
End If
Next rCell
Set rCell = Nothing
End SubSamozřejmě máte pravdu, bez zamknutí listu nemá zamknutí buněk celkem smysl. Nicméně to nebylo součástí dotazu a tak předpokládám, že si to OP dořeší sám.
citovat
aDAAL(13.7.2016 9:31)#032035 Přesun do pole a čtení z pole pomocí For.. Next bude rychlejší než průchod oblastí buněk pomocí For Each Next. Přestože cyklus For Each..Next je rychlejší než For..Next.
Netestoval jsem, ale tipují, že se to projeví až ve čtení desítkách až stovkách - tisíc řádků.
Takže určitě stačí, hezký zápis.
citovat