< návrat zpět

MS Excel


Téma: VBA - IF rss

Zaslal/a 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

Zaslat odpověď >

#032025
avatar
Nebude to tím, že Range.Locked = False tu oblast odemyká, místo toho, aby se zamkla (jak si asi přejete)?citovat
icon #032026
eLCHa
No, to taky. Ale hlavněi = Sheets("seznam").range("b2:b4")načítá pole a protoi = ws.Namemusí házet chybu.
Zkuste něco takovéhoSub 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 Sub
citovat
#032027
avatar
eLCHa: mnohokrát děkuji, funguje suprově 10citovat
#032028
avatar
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
icon #032029
eLCHa
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
#032031
avatar

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
#032032
avatar

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: txt32032_checkandlock.txt (2kB, staženo 24x)
citovat
#032033
avatar
eLCha: Těžko říct, co tím básník vůbec myslel...citovat
icon #032034
eLCHa
@DAAL
něco takového by mělo stačitSub 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 Sub
Samozř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
#032035
avatar
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

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje