Jen dodám, že toto bude fungovat pouze v případě, kdy v centru zabezpečení bud nastaveno
Důvěřovat přístupu k objektovému modelu projektu VBA
Protože je to nastavení aplikace, které se nedá zapnout a vypnout programově, tak nedoporučuji.
Pokud toto chcete ovšem takto řešit, než začnete měnit kód kódem, požádejte uživatele, ať tuto volbu zapne a po skončení kódu zase vypne.
Ano, přesně jak píše lubo.
Někdy se stačí zamyslet, jak funguje excel a dá se vymyslet spousta triků, jak si ulehčit práci a bez VBA.
Toto je jeden z nich ;)
Je to ten obrázek?
http://wall.cz/upload/postatt/18629_screen.png
Dostalo se to do jiného vlákna ;))
Musíte vložit do modulu, který se jmenuje
ThisWorkbook
a ne do
Module1
Vložil jste kód do modulu sešitu?
Zamykat list před zavřením nemá smysl, pokud celý sešit neuložíte. Proto musíte uzamčení provést před uložením, tedy v proceduře BeforeSavePrivate Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
ThisWorkbook.Worksheets("List2").Protect Password:="1234"
End SubToto by ovšem znamenalo, že se vám při každém uložení list zamkne a vy jej budete muset odemknout, aby bylo možno v něm dále pracovat. Dalo by se to snad vyřešit následujícím kódemPrivate Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim bEvents As Boolean
bEvents = Application.EnableEvents
Application.EnableEvents = False
Cancel = True
With ThisWorkbook
Dim bLocked As Boolean
bLocked = .Worksheets("List2").ProtectContents
If Not bLocked Then
.Worksheets("List2").Protect Password:="1234"
End If
.Save
If Not bLocked Then
.Worksheets("List2").Unprotect Password:="1234"
End If
End With 'ThisWorkbook
Application.EnableEvents = bEvents
End Sub
Nemám otestováno, psáno z brucha.
To tu dávám jen jako poznámku, protože nevím zda je to tento případ. bloom nenapsal, zda ostatní uživatelé data ze sešitu pouze čerpají (čtou) nebo zda je i mění.
Pokud by pouze čerpali, jedno řešení by tu bylo a to uložit sešit na konkrétním listě a nastavit pouze pro čtení.
Pokud by byla makra povolena, nešel bych cestouPrivate Sub Workbook_Open()
...
End Sub alePrivate Sub Workbook_BeforeSave((ByVal SaveAsUI As Boolean, Cancel As Boolean))
...
End SubTo proto, že následující uživatel už vždy otevře sešit na tomto listu.
Lze také využít příkaz
O.POLÍČKU=ZLEVA(O.POLÍČKU(6;List1!A1);1)="="
Ale protože se jedná o Excel4Macro, tak je to v podstatě totéž jako ALem definovaná UDF
Takže nejjednodušší řešení je to, co napsal AL
CTRL+G (resp. F5) -> Jinak... - Zaškrtnout vzorce - OK
Už jsem tu dlouho nic nenapsal, tak abyste na mně nezapomněli ;)
@Opičák
Select :(
2 řádky a to jen proto, že se může stát, že tam žádný vzorec není:Sub subFormulas()
On Error Resume Next
ActiveSheet.UsedRange.SpecialCells(xlCellTypeFormulas).Interior.Color = vbYellow
End Sub
Tohle je opravdu jen technická a hlavně principiální poznámka. Jsou jazyky, které by vás takto ani nepustily dále.
Pokud máte, že i může být od 1 do x
pak by to i mělo být stejného typu jako x právě proto, že i může nabýt kterékoliv hodnoty od 1 do x. Tedy když budete mít x = 300 a u i nastavíte byte, tak i=256 vám vyhodí chybu.
Máte napsánoFor i = 3 To lastRw Step 3a pravděpodobnost, že číslo řádku bude vyšší než 255 tu je.
@AL
Jen technická. Když máte lastRw Long, potom i by mělo být taky Long ;)For i = 3 To lastRw
@Opičák
Jen technická. Kód je samozřejmě funkční, ale vzhledem k tomu, že jsme schopni říct, na kterou pozici se má položka přidat, tak zbytečně načítáte do pole, které pak seřazujete.
Můžete to udělat rovnou
Sub nacistSeznam4()
Dim sCellValue As String, i As Integer, j As Integer
With UserForm1.ComboBox1
For i = 1 To Range(Range("B3"), Range("B3").End(xlDown)).Cells.Count Step 3
sCellValue = CStr(Range(Range("B3"), Range("B3").End(xlDown)).Cells(i).Value)
If .ListCount = 0 Then
.AddItem sCellValue
Else
For j = 0 To .ListCount - 1
If .List(j) > sCellValue Then
.AddItem sCellValue, j
Exit For
ElseIf j = .ListCount - 1 Then
.AddItem sCellValue
End If
Next j
End If
Next i
.ListIndex = 0
End With 'UserForm1.ComboBox1
UserForm1.Show
End Sub
Asi jste kvůli tomu nemusel zakládat nové vlákno, ale pokračovat v původním.
Zase jenom nabídnu latu. Pořád totiž úplně nechápu, jak vám to vlastně funguje a z těch obrázků to asi nepochopím ;)).
TextBox2.Text = Replace(Format(Cells(i + 1, 3), "h:mm:ss.0"), ".0", vbNullString)
edit:
aha - tak musel, protože je to zamknuté ;))
Poslední formátování se vám nahoru přesune proto, že se týká celé oblasti A4:K250 a ty ostatní 3 jsou pouze její podmnožinou (sloupce v této oblasti). To znamená, že musíte pro sloupce BCD zvlášť nastavit 2 formátování - duplicitu a "x". Potom vyberte ostatní sloupce v oblasti a nastavete pro ně zvlášť podmínku "x". Pak se vám to přesouvat nebude, protože každá oblast bude mít své formátování a nebudou na sobě závislé.
Jestli je to správné chování, těžko říct ;)
Zkusil jsem udělat přílohu - snad to bude pochopitelnější.
Dobře - nebudu se zamotávat a zkusím nabídnout - vyzkoušejte Format, jestli to nepomůže
Me.TextBox1.Text = Format(ActiveCell.Value, "h:mm:ss.0")
tak to nepomohlo - nepodařilo se mi nasimulovat tu tečku ;)))
pořád tam mám čárku
tak musim zadat u setin tecku, at se to spravne zobrazi, tak jak chci. u vysledku se skrytymi setinami
tomuhle nerozumím - tu tečku tam dáváte vy ručně nebo se tam dostane jak?
V tom formuláři máte textbox a ten pracuje s textem.
Takže abychom správně poradili, museli bychom vidět kód, kterým se ta hodnota načítá a kód, kterým se přenáší do listu.
Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.
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.