Ešte ma napadlo, že by to šlo urobiť pomocou funkcie INDEX a TRANSPOZICE, v tvare
=INDEX(TRANSPOZICE(vstup);;$D$22)
za vstup si dosadíš pole z toho prvého listu, miesto $D$22 napíšeš adresu bunky, z ktorej načítaš číslo riadku, z ktorého potrebuješ vypísať hodnoty z listu 1 (prípadne poupravíš o nejakú konštantu, aby si vybral ten správny riadok)
tú funkciu zapíšeš ako jediný maticový vzorec do bloku buniek (čiže vyberieš blok buniek a zapíšeš vzorec, mačkáš ctrl+shift+enter) s rozmerom 1 stĺpec a príslušný počet riadkov odpovedajúci počtu stĺpcov v oblasti vstup.
čiže, aby som bol konkrétny, u tvojho vzorového súboru, na liste2, označíš oblasť C8:C14 a vložíš do nej maticový vzorec:
=INDEX(TRANSPOZICE(List1!$C$8:$I$9);;$D$4-7)
prípadne maticový vzorec v tvare:
=INDEX(TRANSPOZICE(List1!$C$8:$I$9);ŘÁDEK()-7;$D$4-7)
vložíš iba do bunky C8 a skopíruješ dolu
u listu3 v oblasti C7:C13 maticový vzorec v bloku ako
=INDEX(TRANSPOZICE(List1!$C$8:$I$9);;$D$4-7)
prípadne v jednotlivých bunkách ako:
=INDEX(TRANSPOZICE(List1!$C$8:$I$9);ŘÁDEK()-6;$D$4-7)
tých spôsobov existuje celá rada
Som rád, že Ti to pomohlo, ale pod geniálnym si predstavujem niečo iné, toto bola brnkačka
Lukáš, kedže som si s tým tvojim vzorom medzitým hral, tak ponúkam riešenie:
v liste2 do bunky C8 zapíš:
=NEPŘÍMÝ.ODKAZ(ODKAZ($D$4;ŘÁDEK()-5;2;1;"LIST1"))
v liste3 dobunky C7 potom:
=NEPŘÍMÝ.ODKAZ(ODKAZ($D$4;ŘÁDEK()-4;2;1;"LIST1"))
oboje skopírovať dolu
@Pavlus
"...protože tohle se v práci vážně hodí, neuvěřitelně to může zjednodušit spoustu problémů .-)"
v práci to obvykle chodí tak, že si fúru vecí zautomatizuješ, následne šéf zistí, že máš podozrivo veľa času, tak Ti pridelí nejaké nové úlohy, či presunie niečo od kolegu, ktorý si nič nezautomatizuje a tým pádom "nestíha", samozrejme, o nejakej úprave platu nemôže byť reč, ono je v práci niekedy výhodnejšie "neumět" než "umět"
Ono i tak potom človek čas, ktorý ušetrí, použije na ďalšie štúdium VBA, takže je otázka, či nie je lepšie pre kariérny postup (nehovorím o vedomostnom raste) napriamiť svoje úsilie radšej smerom k budovaniu rôznych neformálnych vzťahov, chodeniu na obedy so šéfmi a zbieraniu rôznych drbov z pracoviska.
jasné, s offset si môžete hrať, ja som Vám do toho nechcel zasahovať, neviem, či tie stĺpce nemáte naviazané na niečo ďalšie
rád som pomohol, pekný deň a hodne úspechov pri štúdiu VBA prajem
Ten pomocny stlpec D nepotrebujete, data z neho mozete kludne vymazat. Oznacte si bunky v stlpci C (opat - iba pouzitu oblast, nie cely stlpec, aby to nebezalo dlho) a spustite makro.
Sub Vloz_komentar()
Dim cell As Range
Application.ScreenUpdating = False
For Each cell In Selection.Cells
With cell
' vysledok spracovany do stlpca o 2 pozicie napravo od vybraneho
If Not .Comment Is Nothing Then
.Offset(0, 2) = .Value & Chr(10) & .Comment.Text
.Offset(0, 2).Font.Bold = False 'aby odstranil pripadne povodne vytucnenie celej bunky
.Offset(0, 2).Characters(Length:=Len(.Value)).Font.Bold = True
End If
End With
Next cell
Selection.EntireRow.AutoFit
Application.ScreenUpdating = True
End Subpokial by ste nechcela prist v tom novom stlpci o hodnoty z buniek zo stlpca C, v ktorych nie je komentar, tak pred end if v uvedenom kode si este doplnte
Else
.Offset(0, 2) = .Value
.Offset(0, 2).Font.Bold = True
Isteže, ale schválne som to pojal ako 2 oddelené prípady a predpokladal, že v rámci vlastného zdokonaľovania si to dotvoríte. Ale pokiaľ si s tým neviete rady, vložte sem nejaký vzorový súbor s popisom, čo s čím a kam chcete spojiť.
Tzn. stĺpec X s komentárom, stĺpec Y s druhou časťou textu a stĺpec Z so želaným výsledkom. Kód Vám potom napíšem. Ja ten vzor pred sebou nemám a je to takto pre mňa trochu hádanka...
Takto nejako asi:
Sub MAKRO5()
Dim Len1 As Integer
With ActiveCell
Len1 = Len(.Offset(0, -2)) 'urci dlzku prveho retazca
.Value = .Offset(0, -2) & Chr(10) & .Offset(0, -1) 'do aktivnej bunky zapise spojeny prvy a druhy retazec
.Characters(Length:=Len1).Font.Bold = True 'vytucni prvu cast spojeneho retazca
End With
End Sub
Označte si bunky v stĺpci (nevyberajte ale celý stĺpec, to by bežalo zbytočne dlho, asi nemáte dáta na 65tis. či 1mil. riadkov) , z ktorého chcete vypísať komentáre (budú sa zapisovať do stĺpca J) a spustite kód:
Sub Vloz_komentar()
Dim cell As Range
For Each cell In Selection.Cells
On Error Resume Next
Cells(cell.Row, "J") = cell.Comment.Text
Next cell
End Sub
Všetko čo sa v kóde nachádza na riadku za apostrofom, je v kódom chápané ako poznámka a nie je to pre prekladač inštrukcia, čiže správne má byť:
Sub Vloz_komentar()
ActiveCell = ActiveCell.Offset(0, -1).Comment.Text
End Sub
Kód vypíše do aktívnej bunky komentár z bunky o jednu pozíciu vľavo od aktívnej bunky, čiže, pokiaľ je bunka s komentárom v bunke A1, je potrebné postaviť sa do bunky B1 a spustiť makro. Pokiaľ v bunke, na ktorú sa kód odkazuje, nie je komentár, kód vyhodí chybu.
Príloha je poškodená a nejde otvoriť.
@marjankaj
ja súhlasím, reagoval som len na opakovanú zmienku o obmedzení počtu znakov a trochu som to rozviedol na popud eLCHi. UDF je ale určite vhodnejšia.
No v tomto prípade, povedzme, že rozsah, ktorý vyhodnocujem, predstavuje oblasť 20 buniek, pričom moja funkcia bude mať obmedzenie na 15 znakov. Tak prvých 15 buniek vyhodnotím funkciou, výsledok bude reťazec v tvare napr. NNNAAANNNAAAAAA (15 znakov) a pokračujem v zápise funkcie na jej konci ampersandom a vyhodnocovaním buniek 16-20 atd. Na začiatku teda potrebujem určiť počet vyhodnocovaných buniek a potom ich vyhodnocovať v skupinách po 15 pomocou pôvodnej, trochu modifikovanej funkcie, resp. niekoľkými variáciami pôvodnej funkcie spojených ampersandom.
@marjankaj
to ma nenapadlo, chyba v testovaní, dík za opravu
@marjankaj & eLCHa
obmedzenie 15 znakov sa dá obísť, opäť zreťazením, ale to len tak na okraj...
povedzme, že to chcete do aktívnej bunky, kedy bunka s komentárom sa nachádza o jednu bunku vľavo od aktívnej na tom istom riadku, do kódu vo VBA si zakomponujte (pochopiteľne, s nejakými kontrolami):
ActiveCell = ActiveCell.Offset(0, -1).Comment.Text
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.