Váš kód ale neumožňuje prípadnú ďalšiu prácu s číslom palety. Navyše funguje pri dvojkliku hocikde, čo spôsobuje problém pri potrebe prepísať nejaké iné dáta na liste. Skôr by som to upravil na niečo takéto
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Address = Range("Pocitadlo").Address Then
With Range("Pocitadlo")
If .Value = 6 Then .Value = 1 Else .Value = .Value + 1
Application.Goto Range("Pocitadlo").Offset(1)
End With
End If
End Sub
A formát bunky
###?"/6"
Prepínanie zo 6 na 12 by som riešil netlačiteľným zaškrtávacím políčkom.
Private Sub CommandButton50_Click()
With Worksheets("Cold").ListObjects("ColdInputEmails").DataBodyRange
.Columns(2).Resize(Evaluate("=COUNTIF(ColdInputEmails[EmailAddress],""<>""&"""")")).Value = TextBox1.Value
End With
End Sub
Ale prečo musí mať tá Tabuľka 1048566 riadkov ?
No tak to obabrime takto:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim N As Long, V As String, H As Single
If Target.Column <> 1 Then Exit Sub
With Sheets("Zdroj")
On Error Resume Next
N = WorksheetFunction.Match(Target.Value, .Columns(1), 0)
If Err <> 0 Then Target.Offset(0, 1) = "": Exit Sub
V = .Cells(N, 2)
H = .Cells(N, 2).RowHeight
With Target.Offset(0, 1).MergeArea(1)
V = Replace(V, " Adresa:", vbCrLf & "Adresa:")
.Value = V
.Font.Bold = False
.Characters(Start:=1, Length:=17).Font.Bold = True
.Characters(Start:=InStr(1, V, "Adresa:"), Length:=7).Font.Bold = True
.EntireRow.RowHeight = H
End With
End With
End Sub
Alebo CDO (až dole)
http://excelplus.net/jak-odeslat-e-mail-z-excelu/
Pozor na to heslo. Ak bude robiť s Master súborom aj niekto iný, môže si pozrieť heslo do mailu v kóde. Ak to budú iba bezpečné osoby/a tak NoProblem. Aj tak by bolo ale vhodné si na túto činnosť zriadiť novú schránku.
Len zo srandy som dal do kopy pár metód. Aj tie Vaše doterajšie som poupravil. Sú tam rôzne prípady použitia, aj jednoúčelové aj univerzálnejšie. Samozrejme, že sa nájdu aj iné spôsoby.
Ak som to správne pochopil, tak tu sú tiež 2 riešenia.
EDIT: Ešte som zabudol podotknúť, že v prílohe ste mali vypnuté počítanie vzorcov, a vo Výstupe ste mali viac riadkov ako vo Vstupe.
Z brucha na tablete:
Vo VBA pridajte Modul a vložte do neho
Function CHECKIMG(N As Range) As byte
CHECKIMG = (Len(Dir(ThisWorkbook.Path & "\Obrázky\" & N)) > 0) And 1
End Function
V zpšite potom túto UDF funkciu volajte vzorcom
=CHECKIMG(A1)
kde v A1 je názov obrázku napr. "abcd.jpg" a obrázky sú uložené v adresári zošitu v podadresári "Obrázky".
EDIT:
Alebo ešte s ošetrením toho, aby nedalo nič ak do vzorca vstupuje prázdny názov:
Function CHECKIMG(N As Range) As Variant
'Application.Volatile
If N = "" Then CHECKIMG = "": Exit Function
CHECKIMG = (Dir(ThisWorkbook.Path & "\Obrázky\" & N) <> "") And 1
End Function
Apostrof pred Application.Volatile dajte preč, ak chcete aby sa to prepočítavalo pri každej príležitosti.
Skúste si nahradiť
.Cells(N, 2).....
za
.Cells(N, 2).MergeArea.Copy Target.Offset(0, 1)
Target.RowHeight = .Cells(N, 2).MergeArea.RowHeight
Ale musíte mať aj v zdroji zlúčené bunky rovnako ako v cieľovej oblasti. Ak potrebujete druhý riadok v zlúčených zdrojových oblastiach, dajte medzi ne ľavý Alt+Enter.
@ ...Long... :Určite na to nabudúce tiež zabudnem :)
V predošlom príspevku som teda opravil obe moje chyby.
Ale myslím, že ste upozornili na tak veľa problémov s takouto opravou mien, že sa s tým naozaj neoplatí paprať. Lebo výsledok nemôže byť vždy správny. A kto bude kontrolovať či je 300 000 mien opravených správne ? ...
@ eLCHa:
Sub pok()
Dim odkial As Long
odkial = 32767 + 1
End Sub
To je celé. Nič viac. Hodí to Overflow... Musel sa nejak záhadne poškodiť u mňa Excel, to predsa nemôže byť logicky vysvetliteľné...
EDIT: odkial = CLng(32767) + 1 prejde OK
Ako po tom očúrať toto ?
Sub pok2()
Dim m(), r As Long
With Worksheets("Hárok1")
r = .Cells(Rows.Count, 5).End(xlUp).Row - 1 'napr. r=300000
'ReDim m(1 To r, 1 To 1) 'Je jedno či tam je Redim alebo nie.
m = .Cells(2, 5).Resize(r).Value
'm(32768)=chyba
End With
End Sub
Sákriš, to sú mi veci...
EDIT2: Vprvom príklade pomôže:
odkial = CLng(32768)
V druhom príklade mám chybu, preto to nejde. Uvádzam samostatne, aby bolo viditeľné o čom hovorím. Chýba tam index poľa:
m(32768, 1)=chyba
Urobil som už 2 verzie makra, ktoré odstráni viacpísmenné preklepy, ale obe verzie nepochopiteľne narážajú na nelogickú chybu. Ak sfunkčním toto, potom mám v pláne porovnávať správne mená hľadaním v "pochybnom" mene, od najdlhšieho správneho (kvôli nájdeniu najskôr "Jana" až potom "Jan").
Zatiaľ som nevymyslel metódu na opravu "Petrer". Možno na to budú odborníci niečo vedieť, lebo mňa napadlo, len porovnať počet zhodných písmen so správnymi menami. Ale to ešte neriešim...
Ale k tej nepochopiteľnej chybe. Nemôžem počítať viac ako do 32767
stačí keď dám
Dim odkial as Long
odkial = 32767 + 1
a dostanem chybu OverFlow
Čo je toto za sprostosť ?
Presne tak. tento vzorec, ktorý spomínate, uviedol
buger(29.1.2016 20:08)
a ja som ho pridal k môjmu iba pre porovnanie.
Teda moje riešenie je v F1:H1
a to od "buger", pre porovnanie v F2:H2.
Ja neviem, možno by to šlo inak, takto ma to napadlo, zdalo sa mi to funkčné, tak som to poslal. Ale máte pravdu, že často robím veci príííliš zložito, ale zrovna teraz to nieje až také blbé, snáď
EDIT:
Ešte ma napadlo a pár znakov skrátiť toto
=CHOOSE(IF(Hárok1!$F$1="Zoznam B";1;2);ZoznamB;ZoznamD)
na toto
=CHOOSE((Hárok1!$F$1="Zoznam B")+1;ZoznamD;ZoznamB)
1. časť otázky: Jedno je dokument Wordu a jedno zošit Excelu. Všetko je vy-X-ované. Nikto nevie čo odkiaľ a kam má ísť. Žiadne hlavičky tam nemáte. V tomto by som ale aj tak nevedel poradiť, aj keby ste to popísali a poslali zrozumiteľné.
2. časť otázky: Napr. takto:
=ROUNDDOWN(A1+0,05;1)
formát bunky si nastavte na Číslo s 2 desatinnými miestami.
@vovka.h:
Dlhé ?
Toto sú všetky vzorce, ktoré som použil, teda bunky aj Definované oblasti aj PF:
SK
=IFERROR(OFFSET(Vyber;MATCH($G$1;Vyber;0)-1;-1;1;);"")
=CHOOSE(IF(Hárok1!$F$1="Zoznam B";1;2);ZoznamB;ZoznamD)
=Hárok1!$B$2:$B$4
=Hárok1!$D$2:$D$4
=ISERROR(MATCH($G$1;Vyber;0))
CZ
=CHYBHODN(POSUN(Vyber;POZVYHLEDAT($G$1;Vyber;0)-1;-1;1;);"")
=ZVOLIT(KDYŽ(Hárok1!$F$1="Zoznam B";1;2);ZoznamB;ZoznamD)
=Hárok1!$B$2:$B$4
=Hárok1!$D$2:$D$4
=JE.CHYBHODN(POZVYHLEDAT($G$1;Vyber;0))
Pozrite iba to moje riešenie v F1 a G1. Mne to nepripadá dlhé, robím často (zbytočne) oveľa dlhšie...
V F2 a G2 je len na porovnanie aplikované riešenie od kolegu "buger".
@buger:
Toto sa dá riešiť jedine makrom, lebo Overenie nemá takú funkciu, aby odstránilo hodnotu, ktorá v bunke je. To PF som Vám tak pridal presne preto, ak by ste nechceli/nemohli použiť makro, tak aby Vám do očí udrelo, že hodnotu treba zmeniť.
To Vaše makro môže byť. Volá sa ale 2x. Lebo ClearContents vyvolá ďalšie spustenie OnChange. Buď to obalíte do
Application.EnableEvents = false
...
Application.EnableEvents = true
alebo to necháte tak. Neviem čo bude rýchlejšie.
Ďalej ak by mohol nastať prípad, že sa zmení bunka s hlavným zoznamom spoločne s inými bunkami naraz (mazanie, kopírovanie,...) tak to treba ošetriť v OnChange nie porovnaním priamej adresy, ale cez Intersect...
Proste záleží na tom, ako sa to bude používať. Použitím makra v OnChange, prichádzate o Undo.
Ak by išlo o to, aby ten vzorec nepôsobil dlhý, zložitý, mätúci, tak si výber oblasti (v mojom prípade) urobte pomocou Definovanej oblasti.
CHOOSE/ZVOLIT namiesto INDIRECT/NEPŘÍMÝ.ODKAZ Vám umožňuje mať v bunke s prvým výberom slová oddelené medzerami.
Dá sa tam prirobiť viac vecí, napr. rozsahy môžu byť dynamické, alebo to môže byť urobené ako kopírovateľný vzorec...
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.