Příspěvky uživatele


< návrat zpět

Strana:  1 ... « předchozí  86 87 88 89 90 91 92 93 94   další » ... 140

Z toho co jsem četl - ono by to mohlo jít - ale nechtějte po nás, ať si vytváříme soubor, na kterém to budeme zkoušet. Pokud něco máte, šoupněte to sem. Pokud nemáte, něco vytvořte - stačí 20-30 řádků, ať je to na čem testovat. Už byste to asi měl.

@lubo
díky za dotažení ;)
ve středu už jsem neměl čas a pak už se mi nad tím nechtělo přemýšlet ;)
Schovám si to kdyby náhodou, protože jsem na netu žádné řešení nenašel. I když to pravděpodobně nikdy nepoužiju ;)

Máte asi novější verzi excelu než já (2007), protože můj nezná událost Workbook_AfterSave

Nejdříve jedna možná nepodstatná technická - není třebaRun "Module1.Pro_Otevrit"stačíCall Module1.Pro_Otevritcompilátor tak lépe ohlídá překlepy v názvech procedur
Pokud jde o zbytek - odpovím přesně na dotaz - děláte něco špatně ;))
A protože jste šikovný, určitě na to chcete přijít sám (já ještě nevím co to je, ale věřím Vám ;) )

3)

mike55 napsal/a:

"Funkce DoEvents vzdá spuštění makra tak, aby operační systém mohl zpracovávat další události. Funkce DoEvents předá řízení aplikací v operačním systému".
http://support.microsoft.com/kb/118468/cs

Toto jsem samozřejmě četl, ale trvalo mi dlouho, než jsem to skutečně pochopil.
Kód, který tu dal marjankaj (kp57 jsem nestudoval, ale bude to podobné) bude fungovat pro směrové šipky a na některých (většině) počítačích i pro klávesu ENTER - je to logické - DoEvents umožní systému zpracovat informaci o stisku směrové klávesy a tak posune kurzor - takové řešení mně samozřejmě taky napadlo a v podstatě to může být nejsnazší řešení pro Vás. Když už jsem se tím ale zabýval, chtěl jsem obecné řešení pro stisk jakékoliv klávesy, což se mi povedlo. Stačí jen dořešit zrušení stavu editace buňky a je možné si vybrat jakoukoliv klávesu či kombinaci kláves. Jsou tam ale ještě ale, které, jak už jsem psal dříve, kdybych to chtěl dotáhnout, tak to dotáhnu (Např. musí se zajistit, aby proběhlo UnhookWindowsHookEx hHook, jinak bude procedura fncKeyboardProc volána, i když samotný cyklus už dávno skončí.)

Osobně bych ale opravdu využil .NET, který má určitě objekt Klávesnice a v něm testuje, zda je stisknutá klávesa a která to je a tak ten kód bude jednodušší (VB6 je sice blíže VBA, ale editor je placený a když už bych se začal v něčem hrabat, tak v něčem modernějším - pro nás obyčejné laiky mi jako ideální přijde C#).

2)Teď k mému kódu. Na první pohled to vypadá stejně. Pokud spustíte kód na listu a stisknete mezerník, objeví se hláška a po jejím odkliknutí se přepne do editace buňky. Ano, protože jsem stiskl mezerník a instrukce DoEvents toto umožnila.Zároveň jsem ale přidal požadavek, že pokud dojde ke stisku klávesy, spustí DoEvents proceduru fncKeyboardProc a pokud ta stisknutá klávesa bude mezerník, tak proměnné bEnd (mohl jsem ji nazvat keypressed) přiřadí hodnotu True. A tak dojde k ukončení cyklu - tzn. doplnil jsem ten Váš chybějící krok přiřazení hodnoty. Rozdíl poznáte podle toho, že už nejsounabídky v liště šedivé - u mně se to projevilo až po kliknutí kdekoliv na list. Tzn - kód už neběží.
Procedura fncKeyboardProc se spustí po stisku jakékoliv klávesy a k přerušení dojde pouze při stisku mezerníku (ten jsem si vybral, protože je největší ;) )

@mike55
zkoušel jsem ten kód, ale laicky si stále myslím, že DoEvents prostě zareaguje na událost - stisknutí třeba mezerníku - a ukončí makro
Ne, tak to není a v následujících příspěvcích se Vám (a nejen Vám) to pokusím objasnit

1) - upravil jsem si Váš kód taktoSub test()
Dim i As Long, iMax As Long
i = 0
iMax = 100000

Do
i = i + 1
DoEvents
If Keypressed Or i >= iMax Then
Exit Do
End If
Debug.Print i
Loop
MsgBox "(.....sem už to nikdy nedojde)"
End Sub
a k MsgBoxu jsem se dostal. Je to proto, že jsem mu zadal alternativní konec cyklu.
Pokud stisknete klávesu na listu bez spuštěného kódu, co se stane? Začne editace buňky.
Pokud spustíte jakýkoliv kód, to se nestane, dokud kód neskončí.
Dal jsem tam DoEvents, čímž jste umožnil systému zpracovat jiné události (stisk klávesy) a tak dál už nepokračuje a ještě k tomu skočí zpět do EXCELU do editace buňky. Už vidíte tu logiku? V tuto chvíli běh kódu neskončil - on běží dál, ale mezitím se Vám excel přepnul do editace buňky. Problém je v tom keypressed - máte ho nedefinované a tak je to proměnná typu Variant a hlavně - nikde mu nepřiřazujete žádnou hodnotu a přitom testujete, zda se rovná True.If Keypressed then Exit DoAle hodnota je Empty a tak se Vám ten kód nikdy nezastaví.

mike55 napsal/a:

Co na to říct ? Omlouvám se stokrát za NEVHODNÉ, NEEXISTUJÍCÍ slovo keypressed. Sypu si popel na hlavu, jsem totální číňan, motám všechno dohromady. STAČÍ?
Chtěl jsem POUZE poradit, jak vyskočit z cyklu stiskem libovolné klávesy a ne tady vést nekonečnou, nesmyslnou debatu o slovu keypressed.

Já Vám rozumím od začátku. Chcete nahradit slovo keypressed něčím funkčním. Jenže VBA v tomto kontextu nic takového neobsahuje. Já chci ale vysvětlit to keypressed z toho úryvku, který jste sem dal - protože píšete že se kód zastaví, takže nějaký kód máte. Něco jste už zkoušel. Chtěl jste POUZE poradit, tak pokud jste si nevšiml, o nic jiného se celou dobu nesnažím. Dnes jsem na Vašem dotazu strávil cca 4 hodiny. Samozřejmě je to proto, že mně to zajímá, kdyby ne, tak jsem skončil svojí první odpovědí. Nicméně od začátku vím, že pokud nějaké řešení vymyslím (a věřte mi, že na netu jsem podobných dotazů jako je Váš už našel spoustu a nikdy žádné řešení nebylo - pouze sledování stavu CAPS, SHIFT apod.), hned Vám napíšu, že to není správná cesta. To je prostě můj názor. Řešení jsem nakonec vymyslel - má pravděpodobně ještě mouchy, kdyby to bylo moje a chtěl bych to tak, tak to dotáhnu až do konce...
Musíte si uvědomit, že excel není standardní prostředí pro programovací jazyk a tak, pokud něco znáte z jiného jazyka, tady se to dělá jinak.

V podstatě si stojím za svou předchozí odpovědí. Excel není stavěný na "nekonečný" cyklus. Ve volnějších chvílích jsem to ze zvědavosti zkoušel a po hledání na netu a v počítači jsem dospěl k následujícímu kódu:Option Explicit

Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Declare Function GetCurrentThreadId Lib "kernel32" () As Long

Public Const WH_KEYBOARD As Byte = 2
Public Const VK_SPACE As Byte = &H20

Dim hHook As Long
Dim bEnd As Boolean

Function fncKeyboardProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If idHook < 0 Then
fncKeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
Else
If &HF0000000 And wParam = &H20 Then
bEnd = True
End If
End If
End Function

Private Sub subTest()
bEnd = False

hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf fncKeyboardProc, Application.Hinstance, GetCurrentThreadId)

Dim i As Long, iMax As Long
i = 0
iMax = 1000000

While Not bEnd And i < iMax
i = i + 1
DoEvents
Wend

If bEnd Then
MsgBox "Space pressed ..."
Else
MsgBox "i = " & iMax
End If

UnhookWindowsHookEx hHook
End Sub
Cyklus běží, dokud i nedosáhne iMax (cca 10s) nebo pokud nestisknu mezerník. Funguje mi to, ale neprovádím žádnou činnost mezi tím. Teoreticky by to fungovat mělo, ale NERUČÍM ZA TO. Je to jen zajímavost a se svou úrovní angličtiny nemůžu tvrdit, že tomu na 100% rozumím (http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx)

Osobně bych to asi řešil jinak. Napadá mně napsání prográmku v .NET, který by načítal hodnoty, ukládal je do txt a po skončení by vyvolal nahrání hodnot do excelu. V podstatě by je mohl rovnou házet i do excelu bez txt. Ale mám málo informací o tom co děláte. V každém případě jste nám stále neobjasnil proměnnou keypressed.

1) keypressed = jaký je to typ, odkud bere hodnotu - z toho kousku nic nepoznáme. Pro stisk klávesy byste pravděpodobně musel použít nějakou API funkci.
2) nekonečný cyklus + excel = to podle mně nikdy nebude fungovat spolehlivě. Především si nekonečným cyklem zablokujete celou aplikaci. Raději popište, co to je technologická karta (list v excelu, textový soubor, databáze...) a někdo Vám tady pomůže vymyslet lepší řešení za pomocí integrovaných nástrojů.

Víte - ono to zadání pořád moc jasné není a nebo už začínám být pomalejší ;)

Takže jsem zkusil toto:Sub subAddDocNmbr()
Worksheets("zadat dokument").Protect UserInterfaceOnly:=True

With Sheets("zoznam dokumentov").Range("A1")
If Application.WorksheetFunction.CountIf(.Resize(.CurrentRegion.Rows.Count, 1), Sheets("zadat dokument").Range("B2").Value) > 0 Then
MsgBox "Hodnota už existuje!", vbOKOnly + vbExclamation, ThisWorkbook.Name
Else
If IsEmpty(.Cells(1)) Then
.Value = Sheets("zadat dokument").Range("B2").Value
Else
.Offset(.CurrentRegion.Rows.Count, 0).Value = Sheets("zadat dokument").Range("B2").Value
End If

Sheets("zadat dokument").Range("B2").Value = Sheets("zadat dokument").Range("B2").Value + 1
End If
End With 'Sheets("zoznam dokumentov").Range("A1")
End Sub


Technická poznámka. Na Slovensku měli natolik chytré lidi, aby nepřekládali názvy funkcí, že mně docela překvapilo, když jsem viděl toto: Tlačidlo1_Kliknúť
Vím, že jste si to nevymyslel Vy, ale pokud vytváříte VBA code - vyhněte se diakritice - v 99% to asi vadit nebude, ale i to 1% je hodně, když pak budete muset předělávat celý kód. Tzn - pokud takový píp excel (editor) vytvoří, předělejte to hned.

Co takhle využít kontingenční tabulku.

Hmm - mno zeptám se takhle. Co už jste zkusil? Protože jediné, co vidím já, je žlutě podbarvená buňka s číslem 1. Soubor je xlsx, takže je možné, že jste jej jen špatně uložil...

Jednoduše to vysvětlím asi rovnou do přílohy.
Mno - je to dobrá volba vysvětlit to pomocí přílohy a za to chválím, ale moc se Vám to nepovedlo. Pokud budu mluvit za sebe, tak jsem to vůbec nepochopil a podle množství odpovědí nejsem jediný. Zkuste to znovu a lépe. ;)
Problém nebude složitý, jen je špatně vysvětlen.

Musel bych to vyzobávat ze souboru, takže tohle bylo rychlejší.
Já to dělám takhle:http://youtu.be/O5LyNsFsEgM

@komár
mno já nezkoušel ani jeden kód, tak vás nebudu rozhodcovat ;))
ale tipl bych - nemáte náhodou Office 64 bit - dle mého to nesouvisí s verzí systému, ale office
http://www.jkp-ads.com/articles/apideclarations.asp


Strana:  1 ... « předchozí  86 87 88 89 90 91 92 93 94   další » ... 140

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