Příspěvky uživatele


< návrat zpět

Strana:  « předchozí  1 2 3 4 5 6 7 8 9   další » ... 10

Včera mi to nevzalo xml přílohu, což jsem si nevšiml. Takže jsem ji zazipoval a přidal k včerejšímu příspěvku

Ahoj, tak to mně zajímá.
V příloze je soubor xml, který dovedu otevřít excelem, ale při tom se mně to ptá jestli to chci otevřít jako tabulku XML, nebo jako sešit jen pro čtení anebo použít podokno úloh. Nevím, tak volím první možnost, excel hlásí, že vytvoří schéma. Pak se ten soubor otevře v krásné tabulkové podobě. Ale když tam pozměním nějaká data (třeba výrobní číslo v prvním sloupci), tak už mi to nejde uložit jako nový soubor xml, hláška je: Nelze uložit či exportovat data XML. Mapování XML v tomto sešitu není možné exportovat.
Co dělám blbě anebo jak to udělat správně?

Ahoj vespolek,

Ohledně automatického zálohování (abychom neztratili neuloženou práci) už zde příspěvek byl, ale toto je něco jiného. Už roky používám u důležitých souborů, (kde to má význam) cyklické zálohování. Určím, že v určitém adresáři bude n (10 nebo klidně i 100) záloh, které se budou cyklicky přepisovat (tedy vždy ta nejstarší záloha), pokud od času uložení poslední zálohy uplyne jistý čas (např. 2 hod nebo 2 dny).
Jaký to má význam? Třeba po čase zjistím, že mi někdo (nebo třeba i já) omylem něco smazal nebo pozměnil. Tak jdu do seznamu záloh a tam to najdu ještě v původním stavu a mám to podle čeho obnovit - pokud mám správně zvolený ukládací interval a počet záloh. Procedura se sama spouští při otevírání souboru (v některých případech i při zavírání). Už mi to párkrát významně pomohlo, tak třeba se to někomu hodí...
Sub ZalohaSouboru()
'na definovaném místě vytvoří n záložních souborů a do toho nejstaršího vždy uloží aktuální zálohu
'zálohu to vytváří pouze pokud od datumu/času poslední uložené zálohy uplynula nějaká doba
'tato časová konstanta (sgInterval) je v této proceduře nastavena na 2 dny (48 hodin)

Const n As Integer = 9 'n = počet záložních souborů, které budeme používat
Const sgInterval As Single = 2 '2 dny = 48 hodin. Tím pádem hloubka historie je n * sgInterval = 9 * 2 = 10 dnů

Dim strNazev As String, strPath As String, strName As String
Dim dDatum As Date, dDatum_Max As Date, dDatum_Min As Date
Dim i As Integer, iNejstarsi As Integer, iNejmladsi As Integer
Dim Cas As Double, Rozdil As Double
Dim boVytvoreno As Boolean

'pokud je soubor jen pro čtení, přeskoč tvorbu zálohy
If ThisWorkbook.ReadOnly = True Then
MsgBox "Tento soubor je otevřen jen pro čtení, takže nebudu vytvářet zálohu"
Exit Sub
End If

'název tohoto souboru
strName = ThisWorkbook.Name
'odřezat příponu
strName = Left(strName, Len(strName) - 5)
'cesta, kam se budou ukládat zálohy
strPath = ThisWorkbook.Path & "\MojeVykazy\Zalohy\"

'kdybychom otevírali záložný soubor, ať se nic neděje
If Left(strName, 4) = "Zal_" Then Exit Sub

'nejdřív zkontrolujeme, jestli adresář pro zálohy existuje, pokud ne, tak ho vytvoř
If Dir(strPath, vbDirectory) = "" Then
MkDir strPath
End If

'teď zkontrolujeme, zdali zálohy existují. Pokud ne, tak je rovnou vytvoř
For i = 1 To n
strNazev = strPath & "Zal_" & strName & "_" & i & ".xlsm"
If Dir(strNazev) = "" Then
'nápis ve stavovém řádku
Application.DisplayStatusBar = True
Application.StatusBar = "Vytvářím soubor zálohy: " & "Zal_" & strName & "_" & i & ".xlsm"
'vytvoř číslovaný soubor zálohy
ThisWorkbook.SaveCopyAs strPath & "Zal_" & strName & "_" & i & ".xlsm"
boVytvoreno = True
End If
Next i

If boVytvoreno Then GoTo FiNito 'pokud jsi vytvářel nějaký chybějící soubor zálohy, tak není nutné pokračovat

dDatum_Max = Now()
dDatum_Min = 0

'nazev založního souboru bez indexu a přípony
strName = ThisWorkbook.Name
strName = "Zal_" & Left(strName, Len(strName) - 5)


'tento cyklus projede všechny očíslované záložné soubory a zjistí _
který je nejstarší a nejmladší
i = 1
Do
strNazev = strPath & strName & "_" & i & ".xlsm"
If Dir(strNazev) = "" Then Exit Do
dDatum = FileDateTime(strNazev)

If dDatum < dDatum_Max Then
If dDatum > dDatum_Min Then
dDatum_Min = dDatum
iNejmladsi = i
End If
dDatum_Max = dDatum
iNejstarsi = i
Else
If dDatum_Min < dDatum Then
dDatum_Min = dDatum
iNejmladsi = i
End If
End If
i = i + 1
Loop

'kdyby nebyl nalezen žádný takový soubor, dej hlášku
If i = 1 Then
MsgBox "na místě " & strPath & vbCr _
& " nebyly nalezeny soubory záloh"
Exit Sub
End If

'Nastavení minimálního intervalu zálohování 1 = 1 den
'porovnáme čas uložení nejmladšího a nynější čas
Cas = CDbl(FileDateTime(strPath & strName & "_" & iNejmladsi & ".xlsm"))
'zjisti rozdíl časů
Rozdil = Round(CDbl(Now) - Cas, 2)

'nápis ve stavovém řádku
Application.DisplayStatusBar = True
Application.StatusBar = "Poslední záloha byla uložena před " & 24 * Rozdil & " hod"

If Rozdil > sgInterval Then
'přepiš nejstarší zálohu
ThisWorkbook.SaveCopyAs strPath & strName & "_" & iNejstarsi & ".xlsm"
End If

FiNito:
'vrátime excelu kontrolu nad stavovým řádkem
Application.StatusBar = False
On Error GoTo 0

End Sub

Dá se to udělat nepřímo ignorováním chyby a pak jejím zpětným vyhodnocením.
Nejdřív si zjisti číslo chyby, co to vyhodí v případě, že je ten soubor používán.

Před "problémový" řádek kódu napiš
On Error Resume Next
tady bude kód pro otevření texťáku
A pak zkoumej, jestli ta chyba nastala:
If Err = 1234 then
Msgbox "Soubor je používán, procedura bude ukončena"
Exit Sub
ElseIf Err <> 0 then
Msgbox "Jiná chyba"
Exit sub
End If
On Error GoTo 0

Ale nevím o tom, že by soubor s příponou .txt byl nějak zablokovaný (na rozdíl od pdf, atd).
Napiš ten kód, co vyhazuje chybu

Ten uvedený kód pracuje s adresářovou strukturou Windows, kde jsou úrovně složek oddělovány zpětným lomítkem. Mám nejasné tušení, že Macbook používá normální lomítko.
Zkus v kódu nahradit \ za / a krokuj to pomocí F8 a v Locals Window si kontroluj hodnoty proměnných - takhle poznáš kde je problém

Pole s povolenými znaky je v tomto případě zbytečná technika, použil jsem to z existující funkce co používám pro nahrazování diakritiky. Pro účely RZ to plně postačí takto:
strPovoleneZnaky = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

'kontrola na povolené znaky (abecedu a číslice)
For x = 1 To Len(kj)
'znak po znaku se bude zkoumat jestli je ze seznamu (pole) povolených znaků
strX = Mid(kj, x, 1)
If InStr(1, strPovoleneZnaky, strX) = 0 Then
MsgBox strX & " není povolený znak pro SPZ!"
Exit Sub
End If
Next x

Nahraďte část svého kódu (po loop) tímto:
Sub Nova_KJ()

Dim kj As String
Dim jmeno As String, strX As String
Dim radek As Long, x As Integer, m As Integer
Dim aPovoleneZnaky As Variant
Dim boNalezeno As Boolean

aPovoleneZnaky = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0")

On Error Resume Next 'pokud uživatel stiskne klávesu ESC, kód skočí do řádku s "Exit Sub"

kj = InputBox("Zadejte novou RZ: (bez mezer, a speciálních znaků) - ukončit můžete klávesou ESC nebo kliknutím na křížek nebo na klávesu Cancel")

If Err.Number <> 0 Then 'pokud uživatel stiskne klávesu ESC, ukončí se makro
Exit Sub
End If

If kj = "" Then
Exit Sub
End If

'převeď to na velké a odstřel případné mezery
kj = Trim(UCase(kj))

'kontrola na počet znaků
If Len(kj) < 7 Then
MsgBox kj & vbCrLf & "to je příliš málo znakú pro RZ"
Exit Sub
End If

If Len(kj) > 7 Then
If vbNo = MsgBox(kj & vbCrLf & "Příliš mnoho znakú pro RZ!" & vbCrLf & "opravdu pokračovat?", vbYesNo) Then Exit Sub
End If

'kontrola na povolené znaky (abecedu a číslice)
For x = 1 To Len(kj)
'znak po znaku se bude zkoumat jestli je ze seznamu (pole) povolených znaků
strX = Mid(kj, x, 1)
boNalezeno = False
For m = LBound(aPovoleneZnaky) To UBound(aPovoleneZnaky)
If aPovoleneZnaky(m) = strX Then
boNalezeno = True
Exit For
End If
Next m
If boNalezeno = False Then
MsgBox strX & " není povolený znak pro SPZ!"
Exit Sub
End If
Next x

If Sheets("kj").Range("A2") = "" Then
radek = 2
Else
radek = Sheets("kj").Range("A" & Rows.Count).End(xlUp).Row + 1
End If
Sheets("kj").Range("A" & radek).Value = kj

tato podmínka je špatně:
If Not (IsUpper(kj) And _
IsNumeric(kj) And _
Len(kj) = 7 Or Len(kj) = 0 Or Len(kj) < 7) Then


za prvé kontrolovat velká malá písmena je zbytečná buzerace uživatele, u SPZ to kódem změňte na UCASE, u jména první velké a ostatní LCASE. Ale problém je IsNumeric(kj), což v případě SPZ nebude nikdy splněno

Tak jsem nakonec vygooglil kód, kterým se "plevelné" oblasti smažou:
Sub DeleteAllSheetNames()
Dim n As Name
For Each n In ThisWorkbook.Names
If Not n.Parent Is ThisWorkbook Then n.Delete
Next
End Sub

1

Fór je v tom, že na těch nově kopírovaných listech žádné oblasti (kromě oblasti tisku) nejsou. Přesto se do cílového souboru ze zdrojového překopírují úplně všechny oblasti co jsou v sešitu. Ještě budu testovat zdali se dají ty plevelné oblasti nějak automatizovaně mazat.
Ta myšlenka kódem tvořených dynamických oblastí zní zajímavě, ale zřejmě to přinese nutnost následných sekundárních změn v kódu. No nic, když to nepůjde jinak, tak to prubnu. Každopádně dík za radu

Taky se mi někdy stalo, že debugger hlásí tuto chybu a skočí na místo kódu, které s tím vůbec nesouvisí. A pak se ukáže, že jsem se uklepl někde jinde.

To nebyl kód na řazení, ale na zamčení listu tak, aby ho měl uživatel zamčený, ale pro kód aby zamčený nebyl. To getHSL1 je funkce, která vrací heslo, aby to o něco ztížilo hacknutí, takže místo toho tam musíš zadat heslo kterým se list odemyká. Ale samotný kód pro řazení je jiný, např. takhle
Sub TestRazeni()

Dim ws As Worksheet
Dim rOblast As Range

'zadefinuj zkratku pro list
Set ws = Worksheets("seznam")

'pokud tam je filtr, tak ho odepni
If ws.FilterMode Then ws.ShowAllData

'zadefinuj tabulku
Set rOblast = ws.Range("B2").CurrentRegion

'vzestupne razeni podle sloupce B a v druhem levelu sestupne podle sloupce D
rOblast.Sort Key1:=ws.Range("B2"), Order1:=xlAscending, Key2:=ws.Range("D2"), Order1:=xlDescending, Header:=xlYes

End Sub

Pokud to zamykáš ručně, tak i když tam je fajfka pro možnost Seřadit, tak to po zamčení řadit nejde ani podle jednoduchých kritérií, natož podle složitějších.

Ale pokud bys to chtěl řadit kódem, tak není problém. Dokonce to ani nemusíš odemykat, pokud to bude zamčeno kódem s atributem UserInterfaceOnly:=True. Třeba takhle:
ws.Protect GetHSL1, AllowFiltering:=True, UserInterfaceOnly:=True

Ahoj, mám excelový soubor pro správu citlivých dat, v němž používám neškodný vzorek vymyšlených osob.
Při uvolnění nové verze si do něj pak uživatel ručně nakopíruje "citlivé" listy z předchozí ostré verze - pomocí volby Přesunout nebo zkopírovat...
Jenomže s každým přikopírovaným listem dochází k duplikování pojmenovaných oblastí (i těch oblastí, které leží na jiných listech, než na tom kopírovaném). No a pak mu kolabují procedury, které pracují s pojmenovanými Range.

Co se s tím dá dělat? Dají se ty listy nakopírovat nějak jinak bez tohoto duplikačního efektu? Anebo třeba nějaký jiný trik jak procedurou ty blbé oblasti smazat?

Předem dík

Našel jsem radu proti tomuto efektu, akorát ještě nevím zdali to funguje, neboť ke zmenšování formuláře dochází sporadicky.

Že prý by mohlo pomoci v možnostech excelu zvolit na volbě Obecné - Při použití více monitorů volbu "Optimalizovat pro kompatibilitu". Neboť defaultně tam je volba "Optimalizovat pro vzhled".

Tak snad to pomůže...


Strana:  « předchozí  1 2 3 4 5 6 7 8 9   další » ... 10

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