Ve spolupráci se SEDUO jsem vytvořil několik videokurzů:
práce s řádky a sloupci na základě požadovaných podmínek - první, poslední, vyhovující podmínce, smazat, vložit, označit...
Aktualizace: 6.3.2013
Při práci s daty v Microsoft Excelu je mnohdy potřeba pracovat s řádky a sloupci (například spočítat, vymazat, najít, označit řádek, nebo sloupec). V tomto članku jsou ukázky kódu, které tyto problémy řeší:
Každá věc se dá vyřešit několika způsoby. Záleží na požadované rychlosti, zkušenostech s programováním (na co je mi efektní kód kterému nerozumím).
Celkový počet řádku v sešitě
pocetRadku = Rows.Count
MsgBox pocetRadku
Celkový počet sloupců v sešitě
pocetSloupcu = Columns.Count
MsgBox pocetSloupcu
S použitím cyklu:
For Radek = 1 To 65536
If Cells(Radek, 1) = "" Then 'hledáme ve sloupci A
PrvniPrazdnyRadek = Radek
Exit For
End If
Next Radek
MsgBox "První prázdný řádek má číslo: " & PrvniPrazdnyRadek
End Sub
Lepší VBA kód bez cyklu.
PosledniPlnyRadek = Range("A1").End(xlDown).Row ' Ve sloupci A
PrvniPrazdnyRadek = PosledniPlnyRadek + 1
MsgBox "První prázdný řádek má číslo: " & PrvniPrazdnyRadek
Je potřeba ošetřit zda sjou první dva řádky vyplněny například takto:
If Range("A1") = "" Then
PrvniPrazdnyRadek = 1
MsgBox PrvniPrazdnyRadek
ElseIf Range("A2") = "" Then
PrvniPrazdnyRadek = 2
MsgBox PrvniPrazdnyRadek
Else
PrvniPrazdnyRadek = Range("A1").End(xlDown).Row + 1
MsgBox PrvniPrazdnyRadek
End If
Poznámka: Doplněno na základě dotazu v komentáři.
Počítat musíme od konce, pokud počítame od začátku, počítaní skončí u prvního prazdného řádku. Ač třeba po pěti prázdných řádcích pokračuje jeden plný.
PosledniPlnyRadek = Cells(Rows.Count, "A").End(xlUp).Row ' Ve sloupci A
MsgBox "Poslední obsazený řádek má číslo: " & PosledniPlnyRadek
Pokud poslední řádek obsahuje text, tento kód jej nevezme v potaz. Proto chceteli-mít neprustřelné řešeni nejprve zkontrolujte zda poslední řádek je prázdný. Pokud ano začněte tímto kódem. Mezi námi kdo používá v Excelu tabulky se zaplněným (miliónem) 1.048.576 řádků...
použijeme cyklus
If Cells(1, Sloupec) = "" Then 'hledáme v řádku 1
PrvniPrazdnySloupec = Sloupec
Exit For
End If
Next Sloupec
MsgBox "První prázdný sloupec má číslo: " & PrvniPrazdnySloupec
Lepší VBA kód bez cyklu.
PrvniPrazdnySloupec = Range("A1").End(xlToRight).Column ' řádek 1
PrvniPrazdnySloupec = PrvniPrazdnySloupec + 1
MsgBox "Pprvní prázdný sloupec má číslo: " & PrvniPrazdnySloupec
Jako u řádků počítáme od konce.
PosledniPlnySloupec = Cells(1, Columns.Count).End(xlToLeft).Column ' Ve sloupci A
MsgBox "Poslední obsazený sloupec má číslo: " & PosledniPlnySloupec
Jako u řádků, doporučuji kontrolu zda je poslední sloupec obsazen. Tj. Sloupec číslo 16384 (XFD)
VBA kod zjistí poslední obsazenou buňku a v případě, informuje o tom že list je úplně prázdný.
Dim PosledniSloupec As Integer
Dim PosledniRadek As Long
If WorksheetFunction.CountA(Cells) > 0 Then
PosledniRadek = Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
PosledniSloupec = Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
MsgBox ("Poslední obsazena buňka má řádek: " & PosledniRadek & " sloupec: " & PosledniSloupec)
Else
MsgBox ("Prázdný list")
End If
Může fungovat i jako kopírování na další List (sešit)
Dim PosledniRadek As Long, i As Long
Dim OznacOblast As Range
With Sheets("List1")
PosledniRadek = .Range("A" & .rows.Count).End(xlUp).Row
For i = 1 To PosledniRadek
If Len(Trim(.Range("A" & i).Value)) <> 0 Then
If OznacOblast Is Nothing Then
Set OznacOblast = .rows(i)
Else
Set OznacOblast = Union(OznacOblast, .rows(i))
End If
End If
Next
If Not OznacOblast Is Nothing Then
' tato oblast se může zkopírovat ... OznacOblast.Copy Sheets("List2").Rows(1)
OznacOblast.Select
End If
End With
V přípravě
Kontroluje zda ve sloupci A jsou samostatné prázdné řádky, pokud ANO, tak je smazán.
' pro určení odkud kam můžeme použít předcházející kódy
' já jsem použil pro jednoduchost konstanty
For i = 30 To 27 Step -1
If StrComp("", Cells(i, "A").Value) = 0 Then
MsgBox i
Rows(i).Delete
End If
Next i
Pokud je více řádku prázdných za sebou, díky za námět v komentářích.
For i = 30 To 10 Step -1
If StrComp("", Cells(i, "A").Value) = 0 Then
MsgBox i
Rows(i).Delete
End If
Next i
Kontroluje zda ve sloupci A je řádek obsahující text "smazat", pokud ANO, tak je smazán.
For i = 30 To 27 Step -1
If StrComp("smazat", Cells(i, "A").Value) = 0 Then
MsgBox i
Rows(i).Delete
End If
Next i
Další možný kód
Set rng = Range("A1:A10")
i = 1
For counter = 1 To rng.Rows.Count
If rng.Cells(i) = "smazat" Then
rng.Cells(i).EntireRow.Delete
Else
i = i + 1
End If
Next
Smaže každý x-tý řádek v zadané oblasti.
N = 2
Set DeleteRange = Range("A1:D20")
If DeleteRange Is Nothing Then Exit Sub
If DeleteRange.Areas.Count > 1 Then Exit Sub
If N < 2 Then Exit Sub
With DeleteRange
rCount = .Rows.Count
For r = N To rCount Step N - 1
.Rows(r).EntireRow.Delete
Next r
End With
Smaže každý x-tý sloupec v zadané oblasti.
N = 2
Set DeleteRange = Range("A1:D10")
Dim cCount As Long, c As Long
If DeleteRange Is Nothing Then Exit Sub
If DeleteRange.Areas.Count > 1 Then Exit Sub
If N < 2 Then Exit Sub
With DeleteRange
cCount = .Columns.Count
For c = N To cCount Step N - 1
.Columns(c).EntireColumn.Delete
Next c
End With
Smaže sloupce které v zadané oblasti mají prázdný buňku v prvním řádku prázdnou.
Set Rng = Range("A1:K1")
i = 1
For counter = 1 To Rng.Columns.Count
If Rng.Cells(i) = "" Then
Rng.Cells(i).EntireColumn.Delete
Else
i = i + 1
End If
Next
Smaže sloupce splňující podmínku že v obsahují v prvním řádku text smazat.
Set Rng = Range("A1:G1")
i = 1
For counter = 1 To Rng.Columns.Count
If Rng.Cells(i) = "smazat" Then
Rng.Cells(i).EntireColumn.Delete
Else
i = i + 1
End If
Next
Najde v řádku maximální hodnotu a vrátí číslo tohoto řádku
MaxHodnota = Application.WorksheetFunction.Max(Range("B:B"))
MsgBox (MaxHodnota)
For Row = 1 To 65536
If Range("B1").Offset(Row - 1, 0).Value = MaxHodnota Then
Range("B1").Offset(Row - 1, 0).Activate
MsgBox "Maximální hodnota je na řádku: " & Row
Exit For
End If
Next Row
' zobrazí jen první max hodnotu (pokud jsou dvě max hodnoty)
Najde v řádku minimální hodnotu a vrátí číslo tohoto řádku
MinHodnota = Application.WorksheetFunction.Min(Range("B:B"))
MsgBox (MinHodnota)
For Row = 1 To 65536
If Range("B1").Offset(Row - 1, 0).Value = MinHodnota Then
Range("B1").Offset(Row - 1, 0).Activate
MsgBox "Minimální hodnota je na řádku: " & Row
Exit For
End If
Next Row
' zobrazí jen první min hodnotu (pokud jsou dvě min hodnoty)
Předpokládám, že je vybraný požadovaný řádek (sloupec), který chcete skrýt.
' skrýt sloupce
Range("A:C").Columns.Hidden = True
' zobrazit sloupce
Range("A:C").Columns.Hidden = False
' skrýt řádky
Range("11:15").Rows.Hidden = True
' zobrazit řádky
Range("11:15").Rows.Hidden = False
Předpokládám, že je vybraný požadovaný řádek (sloupec), který chcete skrýt.
' skrýt sloupce
Selection.EntireColumn.Hidden = True
' zobrazit sloupce
Selection.EntireColumn.Hidden = False
' skrýt řádky
Selection.EntireRow.Hidden = True
' zobrazit řádky
Selection.EntireRow.Hidden = False
Obdržíme informace zda je řádek skrytý (TRUE) či zobrazený (FALSE).
stav = Range("15:15").Rows.Hidden
MsgBox stav
stav = Range("A:A").Columns.Hidden
MsgBox stav
Budete-li zpracovávat milióny řádku předpokládám, můžete si nastudovat složitější metody SpecialCells, AutoFilter atd., případně použijete databázi.
Kódy lze napsat i efektivněji (tj. pracuji rychleji). Pro pár tisíc řádku rychlost výše uvedených kódu postačí, postačí i pro několik desítek tisíc řádku. V porovnání s ručním zpracováním jsou všechny výše uvedené kódy efektivnější (a navíc pracují bezchybně, oproti lidskému faktoru). Místo zpracovávání desítky hodin člověkem to kód zvládne v několika sekundách (minutách).
Článek byl aktualizován: 19.09.2020 11:06
Ušetřil vám tento web čas, peníze? Pomohl vyřešit problém? Jste ochotni poskytnout symbolickou odměnu na další rozvoj? Vybrte si formu odměny, která vám vyhovuje.
Microsoft Office (Word, Excel, Google tabulky, PowerPoint) se věnuji od roku 2000 (od 2004 na této doméně) - V roce 2017 jsem od Microsoft získal prestižní ocenění MVP (zatím jsem jediný z ČR v kategorií Excel). Své vědomosti a zkušenosti dávám k dispozici i on-line ve videích pro SEDUO. Ve firmách školím a konzultuji, učím na MUNI. Tento web již tvořím přes 15 let. Zdarma je zde přes 1.000 návodu, tipů a triků, včetně přes 250 různých šablon, sešitů.
Přidáno: 28.05.12 14:32
Zdravím a díky za skvělé stránky. Trochu jsem experimentoval a vymyslel jsem kód, který zjistí naprosto korektně, jestli je sloupec prázdný, nebo ne.
obsazenych_bunek = Sheets("List1").Columns("K:K").cells.count - Sheets("List1").Columns("K:K").SpecialCells(xlCellTypeBlanks).count
Přidáno: 29.05.12 18:51
To Vlastimil: díky za kód určitě se bude někomu hodit.
Přidáno: 05.06.12 20:19
Zdravím, prosím o radu jak napsat příkaz pro: Nalezení prvního prázdného řádku, a umístění do něho kurzor (jako když do něj kliknete myší) a možnost něco vepsat. Děkuji o radu
Přidáno: 07.06.12 20:46
To Tomáš: Pomocí SELECT
PosledniPlnyRadek = Range("A1").End(xlDown).Row ' Ve sloupci A
PrvniPrazdnyRadek = PosledniPlnyRadek + 1
Cells(PrvniPrazdnyRadek, 1).Select
Poznámka nezapomenout ošetřit pokud bude poslední řádek obsahovat záznam, případně celý sloupec bude prázdný.
Přidáno: 20.11.12 10:36
Dobrý den, prosím o pomoc, jak vložit hodnotu z libovolné buňky jako kriterium do filtru,viz makro9... Bohužel tak jak to je napsáno, to nefunguje! Předem mnohokrát děkuji! Sub Makro9() ' ' Makro9 Makro ' Range("D10").Select ActiveCell.FormulaR1C1 = InputBox("zadejte KKS") ActiveSheet.Range("$C$11:$H$3002").AutoFilter Field:=5, Criteria1:= _ "=D10" End Sub
Přidáno: 06.01.13 11:46
Označení řádků splňujících podmínku Dobrý den, tak jste na tom? Na tomto místě jsem se zaseknul a nevím jak dál. Poradíte? Děkuji hahn
Přidáno: 06.01.13 19:48
To Arno: Označí neprazdné řádky dle sloupce A
Dim PosledniRadek As Long, i As Long
Dim OznacOblast As Range
With Sheets("List1")
PosledniRadek = .Range("A" & .rows.Count).End(xlUp).Row
For i = 1 To PosledniRadek
If Len(Trim(.Range("A" & i).Value)) <> 0 Then
If OznacOblast Is Nothing Then
Set OznacOblast = .rows(i)
Else
Set OznacOblast = Union(OznacOblast, .rows(i))
End If
End If
Next
If Not OznacOblast Is Nothing Then
' tato oblast se může zkopírovat
OznacOblast.Select
End If
End With
Přidáno: 07.01.13 20:44
Dobry den, prosim o radu - mam nasledujici problem:
Ve sloupci B hledam cislo radku, kde je min. a max. hodnota.
Thisworkbook.worksheets("list1").cells(1,1).Activate
Dim x, y As Variant
Do Until ActiveCell.value = ""
sheets("list1).cells(activeCell.row+1,1).Activate
Set x = cells.Find(What:=Application.WorksheetFunction.Min(Columns("B")), After:=ActiveCell, LookIn:=xlValues, LookAt:= _
xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False)
y = x.Row
Loop
MsgBox "y=" & y
Kdyz takto zapisu kod, tak pro MIN mi to bezproblemu funguje. Kdyz
ale misto MIN prepisu MAX, tak to padá - nevíte v čem by mohl byt problem?
Děkuji
Přidáno: 08.02.13 20:24
Zdravim, rad bych poprosil o polmoc: Potreboval bych, aby excel pri splneni podminky ve sloupci E (samostatne makro: ActiveCell.FormulaR1C1 = "=(TODAY()-DAY(TODAY()))-(DAY(TODAY()-DAY(TODAY())))+1")
umazal kompletni radky, ktere jsou mladsi nez uvedene datum. nevim jak zadat podminku vyse uvedenou za "case is" pokud se tam vlozi napr pismeno a - tak vse funguje - ale nemuzu tam dostat vzorec. Jsem zacatecnik tak se omlouvam. Diky
Sub smazat_radky()
Dim Firstrow As Long
Dim Lastrow As Long
Dim Lrow As Long
Dim CalcMode As Long
Dim ViewMode As Long
With Application
CalcMode = .Calculation
.Calculation = xlCalculationManual
End With
With ActiveSheet
.Select
ViewMode = ActiveWindow.View
ActiveWindow.View = xlNormalView
.DisplayPageBreaks = False
Firstrow = .UsedRange.Cells(1).Row
Lastrow = .UsedRange.Rows(.UsedRange.Rows.Count).Row
For Lrow = Lastrow To Firstrow Step -1
With .Cells(Lrow, "E") ' Sloupec s hledanými podmínkami
If Not IsError(.Value) Then
Select Case .Value
Case Is = "co tady mam doplnit????": .EntireRow.Delete 'podmínka v uvozovkách
End Select
End If
End With
Next Lrow
End With
ActiveWindow.View = ViewMode
With Application
.Calculation = CalcMode
End With
End Sub
Přidáno: 09.02.13 07:55
To Jirka: Já používám pro MAX, MIN toto:
MaxHodnota = Application.WorksheetFunction.Max(Range("B:B"))
MsgBox (MaxHodnota)
For Row = 1 To 65536
If Range("B1").Offset(Row - 1, 0).Value = MaxHodnota Then
Range("B1").Offset(Row - 1, 0).Activate
MsgBox "Maximální hodnota je na řádku: " & Row
Exit For
End If
Next Row
' zobrazí jen první max hodnotu (pokud jsou dvě max hodnoty)
jinak v zaslaném kódu jsou dvě chyby (uvozovky " a sloupce je 2)
Sheets("list1").Cells(ActiveCell.Row + 1, 2).Activate
Přidáno: 28.02.13 10:07
ahojte potreboval by som makro ktore mi ak sa zmeni hodnoty bunky voci bunke nad nou aby mi vlozilo /skopirovalo/ prva 2 riadky tabulky. Tam je vlastne hlavička. Potrebujem akoby rozkuskovat tabulku, ak sa zmeni hodnota potrebujem tam vlozit hlavicku
Přidáno: 02.03.13 17:44
Prosím o pomoc programuji ve VBA a přeposílám data v txt souborech přes mail. Při načtení a zpracování, mám problém s převodem datumu... Je totiž uložen jako string např. "01.02.2013" zkoušel jsem to i přes datevalue(), ale je to nespolehlivé. V Excelu 2007 to nakonec běží, ale v Excelu 2010 to zase kolabuje. děkuji za pomoc
Přidáno: 03.03.13 17:06
To Josef: Viz například http://stackoverflow.com/questions/11833114/excel-vba-import-txt-file-with-variable-column-width
Přidáno: 25.03.13 13:33
Prosím o pomoc, použil jsem příkaz pro označení prvního volného řádku viz
PosledniPlnyRadek = Range("A1").End(xlDown).Row '
PrvniPrazdnyRadek = PosledniPlnyRadek + 1 Cells(PrvniPrazdnyRadek, 1).Select
funkce mi skvěle funguje, pokud mám ve sloupci A alepsoň 2 řádky,pokud mám jen jeden ( v A1), tak mi to hází chybu. Jde to nějak ošetřit,aby to fungovalo i když tam mám pouze hodnotu v poli A1, Předem moc díky
Přidáno: 25.03.13 20:10
To colmic 11: Nejprve zkontrolovat, zda jsou první vyplněny například takto:
If Range("A1") = "" Then
PrvniPrazdnyRadek = 1
MsgBox PrvniPrazdnyRadek
ElseIf Range("A2") = "" Then
PrvniPrazdnyRadek = 2
MsgBox PrvniPrazdnyRadek
Else
PrvniPrazdnyRadek = Range("A1").End(xlDown).Row + 1
MsgBox PrvniPrazdnyRadek
End If
Přidáno: 16.04.13 20:03
Dobrý den,
prosím o pomoc s následujícím kódem
Sub dolu()
Dim adresa As String
Dim radek As String
Dim sloupec As String
Dim cil As String
adresa = Sheet1.Range("A1").Value
radek = Right(adresa, 1)
sloupec = Left(adresa, 1)
radek = CInt(radek)
radek = radek + 1
radek = CStr(radek)
cil = sloupec + radek
Sheet1.Range(adresa).Select
Sheet1.Range(adresa).Copy
Sheet1.Range(cil).Select
Sheet1.Range(cil).PasteSpecial
Sheet1.Range(adresa).Clear
Sheet1.Range("A1") = cil
End Sub
Jedná se o součást školního projektu - hry. K´´od slouží pro posunutí "figurky" dolů. Problémem je, že když je "figurka" např. na políčku H10, tak při spuštění funkce se neposune na políčko H11 ale skočí na políčko H1. Proč se 10+1 = 1?
Děkuji,
Dan
Přidáno: 16.04.13 20:35
To Dan: Dělá to řádek
radek = Right(adresa, 1)
Pokud si to odkrokuješ (např. za tento kód přidej)
MsgBox (radek)
Uvidíš zvyšování 1, 2, 3 .... 9, ale do radek se načte první znak zprava což je 0 (ač v A1 bude např. H10) a k té se přičte 1 takže kód funguje správně 1(0+1) je 1. Podobné to bude i pro sloupec.
Snad je můj výklad pochopitelný.
Přidáno: 30.04.13 13:25
Ahoj, prosím o radu, jak zjistit číslo řádku aktivní buňky (ActiveCell), neboli její druhou souřadnici. Řádek vybere uživatel kliknutím na libovolnou buňku a já potřebuji načíst do proměnné hodnotu z 1. sloupce (A) z tohoto řádku. Díky. PS: děkuji za studnu informací, nejednou mi pomohla. ;-)
Přidáno: 03.05.13 15:35
Ahoj, prosim o radu jak ocislovat jen viditelne radky vybrane pomoci makra filtrem postupne 1,2,3,... atd. Pokud zmenim filtr serazeni bude jine, ale poradi potrebuji zase priradit 1,2,3 ... Diky moc za radu
Přidáno: 03.05.13 16:18
To Pesk: Například:
Sub AktivniBunka()
MsgBox "Aktivní buňka je v řádku: " & ActiveCell.Row
MsgBox "Aktivní buňka je v sloupci: " & ActiveCell.Column
End Sub
Přidáno: 04.05.13 16:59
To Ales: Například cyklem ve kterém se zjišťuje, zda je řádek skrytý, pokud není zapsat i+1
stav = Range("15:15").Rows.Hidden
MsgBox stav
skrytý řádek = TRUE
Přidáno: 29.06.13 02:25
Dobrý den všem, potřebovala bych pomoct s následujícím kódem, který mi data ze všech sešitů přenese do aktivního sešitu. Tak jak to mám v současnosti mi je to však všechny naskládá pod sebe, což nechci - potřebuji aby se všechny naskládaly za sebe (vedle sebe). Mohla by se na to moc prosím nějaká chytrá hlava podívat a změnit mi ten kód. Bohužel nejsem programátor a asi se s tím nepoperu - už jsem sama zkoušela, ale nedělá to co má. Sub MergeSheets() Dim SrcBook As Workbook Dim fso As Object, f As Object, ff As Object, f1 As Object Application.ScreenUpdating = False Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.Getfolder("C:\Users\Katka\Documents\PROCESSED\F2\3_Metronom") Set ff = f.Files For Each f1 In ff Set SrcBook = Workbooks.Open(f1) Range("A1:IV" & Range("A65536").End(xlUp).Row).Copy ThisWorkbook.Worksheets(1).Activate Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial Application.CutCopyMode = False SrcBook.Close Next End Sub
Přidáno: 17.07.13 12:39
Dobrý den, řeším problém s automatickým nastavením výšky sloučených buněk v řádku podle obsaženého textu. Pomocí formuláře z textboxu ukládám delší text, který se ve sloučené buňce zalomí, ale výška řádku se nezmění. Lze toto nastavit po zapsání do buňky pomocí makra? Předem mnohokrát děkuji. PS: Máte úžasný web, veliká poklona.
Přidáno: 25.07.13 17:19
Dobrý den, s VBA začínám (mj. i díky tobě) a nedaří se mi vytvořit program, který by našel první volnou buňku ve sloupci G a zapsal do ní údaj z jiného sešitu. Použil jsem tvoji variantu: PosledniPlnyRadek = Range("G1").End(xlDown).Row ' Ve sloupci A PrvniPrazdnyRadek = PosledniPlnyRadek + 1 A teď nevím, jak dál... Díky Lukáš
Přidáno: 26.07.13 09:51
To Miloš: Například využít WrapText, EntireRow.AutoFit:
ActiveWorkbook.Worksheets("List1").Range("B2").WrapText = True
ActiveWorkbook.Worksheets("List1").Range("B2").EntireRow.AutoFit
Přidáno: 26.07.13 10:11
To Lukáš: Vkládání jsem popsal v článku: Jak zapisovat údaje do buněk
Přidáno: 30.09.13 10:27
Mam stejny problem jako Milos, vkladam pomoci tohoto kodu: Dim Sesit As Worksheet set sesit ............. Sesit.Range("B22").WrapText = True Sesit.Range("B22").EntireRow.AutoFit Sesit.Range("B22") = note kde note je string z textboxu (pouzivam "Lorem ipsum ....... Bunky se slouci, text se zapise, vyska radku zustava stejna - dokaze nekdo pomoci.
Přidáno: 05.01.14 22:51
Ako nahradit parametricky cisla riadkov napr. vo vzorci =SUM(C5:C8) tak, ze cisla riadkov (5 a 8) budem mat uvedene osobitne napr. v bunkach A1 a A2, kde ich mozem flexibilne menit a priamo do vzorca "=SUM(...)" sa mi budu automaticky dosadzovat ine a ine cisla riadkov rozsahov podla toho, ake hodnoty zapisem do buniek A1 a A2 ? pekox@seznam.cz
Přidáno: 21.02.14 19:41
Ahoj, prosím o pomoc: Potřebuju, aby mi makro vložilo do sloupce A funkci zleva (b1;8) a to do všech řádků až do čísla posledního řádku sloupce B. Napsal jsem si toto: Sub Napis() For i = 1 To PosledniPlnyRadek PosledniPlnyRadek = Cells(Rows.Count, "A").End(xlUp).Row Range("A1:A & PosledniPlnyRadek").FormulaLocal = "=zleva(b1;8)" Next i End Sub Ale nefunguje. Prosím o pomoc. martin-hrncir@seznam.cz
Přidáno: 13.03.14 11:23
Ahoj. Zacal jsem trochu zkouset makra v excelu. Mam takovy problem, ze nevim jak dostat do fukce range promenou, ktera se drive ve funkci zapise.
Sub Rdk()
For Radek = 12 To 65536
If Cells(Radek, 7) = "0" Then 'hledáme ve sloupci G
Psd = Radek
Exit For
End If
Next Radek
Range("Psd:120").Rows.Hidden = True
End Sub
Potreboval bych aby se do toho range dostaly radky, ktere jsou zapsany ve funkci.
Díky za rady, nebo odkazy na materiály, které bych měl prostudovat.
Přidáno: 15.03.14 09:31
Nastavil jsem MojeRange jako String a hodnotu zapsal, potom jenom
Range(MojeRange).Rows.Hidden = True
Diky za stranky:)
Přidáno: 05.04.14 16:46
Ahoj, ja som našiel chybičku v makre na vymazanie prázdneho riadku. Ide o to, že keď máš za sebou 2 prázdne riadky, tak vymamžeš i-tý, ale ten i+1 sa z neho stane vymazaním predošlého znova i-tý a ty v cykle zvyšuješ i a tým ho vlastne preskočíš.
Pridal som len zníženie hodnoty po každom vymazaní riadku. Tým je to OK.
Ináč, vlastne tým vzorcom ani nerozumiem. Keby som tak mohol od Teba dostať školenie. Pa.
For i = 30 To 27 Step -1
If StrComp("", Cells(i, "A").Value) = 0 Then
MsgBox i
Rows(i).Delete
i=i-1
End If
Next i
Přidáno: 07.04.14 17:00
To willyboy: Díky za postřeh. Upřesnil jsem informaci u kódu, že jde o mazaní osamocených řádků. Plus přidal tvůj kód pokud je prázdných řádku více. Jen jsem z kódu umazal i=i-1, tento řádek je navíc. Kód nesmí obsahovat, aby fungovalo jak má:
For i = 30 To 10 Step -1
If StrComp("", Cells(i, "A").Value) = 0 Then
MsgBox i
Rows(i).Delete
End If
Next i
Přidáno: 28.05.14 08:05
Ahoj, díky za tyto stránky, moc mi pomohly. Teď řeším: Po vyplnění formuláře se zadaná data zapíší do listu tak, že makro malezne poslední neobsazený řádek a data zapíše do něho, do každého sloupce jednotlivá data vybraná v comboboxech ve formuláři. Potřeboval bych, aby se mě jednotlivé záznamy číslovaly, to znamená potřebuji makro, které by přečetlo pořadové číslo předchozího záznamu a poté do aktuálního řádku na poslední sloupec zadalo číslo předchozího +1. Problém podle mě je ten, že předem neznám adresu předchozí buňky. Moc děkuji za pomoc.
Přidáno: 13.06.14 13:34
Ahoj, díky za skvělé stránky jež jsou i pro mě inspirací.
Chvilku jsem se trápil s nalezením prvního a posledního řádku v označené oblasti. Nakonec jsem na to snad přišel. Níže uvádím kód, třeba se to bude někomu hodit.
PrvniPlnyRadek = ActiveCell.Row
PosledniPlnyRadek = Range("D" & PrvniPlnyRadek).End(xlDown).Row
Přidáno: 10.07.14 08:54
To Michal: Uvedený kód je OK iba ak je ActiveCell.Row < PosledniPlnyRadek
Přidáno: 10.07.14 09:54
To Georgino: viď podnadpis "Nalezení posledního obsazeného řádku" (od Pavel Lašák) -- včetne poznámky + dopĺňam pre starší Exc2003 je problém s riadkom 65536
Přidáno: 10.07.14 11:58
To Michal: (pokračujem) ... + navyše pre zistenie posledného riadku by museli byť vyplnené všetky bunky v danom stĺpci("D") od PrvniPlnyRadek až po PosledniPlnyRadek -- + pre PrvniPlnyRadek(okrem prvého) by som použil: -- PrvniPlnyRadek = Range("A1").End(xlDown).Row
Přidáno: 24.07.14 21:46
Zdravím, vytvářím v excelu formulář a potřeboval bych poradit s makrem, které by bylo součástí ovládacího prvku (číselník) a dle hodnoty čísleníku vložil příslušný počet řádků tabulky. Počet řádků by se zároveň měl měnit v závislosti na hodnotě číselníku. Díky
Přidáno: 24.07.14 21:55
Zdravím, vytvářím v excelu formulář a potřeboval bych poradit s makrem, které by bylo součástí ovládacího prvku (číselník) a dle hodnoty čísleníku vložil příslušný počet řádků tabulky. Počet řádků by se zároveň měl měnit v závislosti na hodnotě číselníku. Díky
Přidáno: 31.07.14 20:02
Zdravím, mám ještě jeden dotaz. Potřeboval bych makro, které by vložilo do tabulky o x řádcíh další řádky dle hodnoty uvedné v poslední buňce řádku/sloupce. Díky
Přidáno: 20.09.14 13:01
Zdravím, potřebuji zjednodušit kód:
ws.Cells(iRow, 1).Value = "Text"
ws.Cells(iRow, 2).Value = "Text"
ws.Cells(iRow, 3).Value = "Text"
ws.Cells(iRow, 4).Value = "Text"
ws.Cells(iRow, 5).Value = "Text"
na něco jako:
ws.Cells(iRow, (1:5)).Value = "Text"
-> což nefunguje
Děkuji
Přidáno: 21.09.14 19:30
Zdravím, malá oprava příspěvku výše. Nepotřebuji vložit do "5ti" buněk v řadě stejný text, ale potřebuji všech pět buněk mít v jednu chvíli označených. 1) Kvůli hromadnému formátování ale hlavně 2) Kvůli jejich sloučení Vztahuje se to k příkladu: Nalezení prvního prázdného řádku a následně jeho úpravu 1) nebo 2) podle podmínky. Zkoušel jsem použít příklad Označení řádků splňujících podmínku, ale nějak jsem se v tom zamotal. Děkuji za pomoc
Přidáno: 21.09.14 20:44
Pro případné zájemce. Nevím, zda neexistuje více řešení, ale těsně po předchozím příspěvku jsem nalezl tento kód:
Range(Cells(iRow, 1), Cells(iRow, 6)).Select
Který uspokojil všechny mé potřeby.
PS: Omlouvám se za SPAM
Přidáno: 17.12.14 15:31
Dobrý den, potřebuji poradit, jak v listboxu nezobrazit skryté řádky
Přidáno: 14.01.15 20:57
Dobrý den, potřebovala bych poradit se zadáním funkce do tabulky (konkrétně se jedná o peněžní deník). Chtěla bych, aby se po zadání typu transkace do 1. sloupce (konkrétně D, nazvaný Transakce) automaticky doplnilo do 2. sloupce (konkrétně E, nazvaný Pořadí) pořadové číslo daného typu transakce. Typy transakcí jsou nikoli překvapivě P (příjem) nebo V (výdaj). Pokus o slovní popis toho, co by měla daná funkce dělat: pokud na aktuálním řádku hodnota ve sloupci D (Transakce) = "P", najdi ve sloupci E (Pořadí) hodnotu předchozí položky, pro kterou platí D="P" a k ní přičti 1, jinak najdi ve slolupci E (Pořadí) hodnotu předchozí položky, pro kterou platí D="V" a k ní přičti 1... Zdá se, že vyhledat buňku s maximální hodnotou až takový problém není, jen to neumím zkombinovat s filrem (resp. ověřením podmínky) P/V v předchozím sloupci, ani nastavit pro výpočet, excel mám dost ráda, ale s VBA si bohužel zatím netykám... Ještě pro upřesnění - 1. položka v jakémkoli roce bude vždy typu "P", další položky mohou nabývat hodnot P nebo V libovolně, podle toho, jak jde život, proto je v testu nastaveno nejpve vyhledání předchozího "P"... Děkuju moc za případnou radu.
Přidáno: 19.01.15 09:01
To Kamila: -- Keďže, z uvedeného popisu rozumiem tak, že čísla narastajú(nasledujúce číslo nikdy nie je menšie ako boli predchádzajúce), tak pri zadaní "P" testovať predchádzajúci riadky dovtedy, pokiaľ nenájde "P". Ak áno pripočítať +1. (Pre "V" podobne.)
Přidáno: 20.01.15 07:25
To Kamila: -- dalo by sa to riešiť aj s dvomi pomocnými bunkami, kde by boli vždy uložené max hodnoty pre "P" a "V"
Přidáno: 25.01.15 15:34
2 Jojo: děkuju za tip, tuším, že něco takového asi budu muset zadat, ale absolutně nevím jak, VBA fakt neumím a jen pomocí funkcí to asi nepůjde. Jestli se tu něco typově podobného řešilo, ráda si to načtu, ale vůbec nemám ponětí, kde to případně hledat. V každém případě ještě jednou díky.
Přidáno: 27.01.15 13:13
To Kamila: -- Bez VBA by ešte mohlo byť nasled.neúplné riešenie riešenie: -- Napísať: --do F1->"Vložené", G1->"MaxPreVložené", F2-> =POLÍČKO("contents"), a teraz POZOR do G2-> =MAX(($D$2:$D$10=$F2)*($E$2:$E$10)), ALE cez CTRL+SHIFT+ENTER(nie iba samotné ENTER). Ak sa všetko zadalo správne, tak by sa po zadaní písmena "P" alebo "V" v F2 objaví obsah poslednej zadanej bunky("P" alebo "V") a v G2 doterajšie maximum pre ("P" alebo "V"). Opakujem je to neúplné riešenie, lebo k tejto hodnote treba pripočítať +1 aručne zapísať do stĺpca "D"(Transakce).
Přidáno: 04.03.15 10:30
Dobrý den, Prosím o radu - mám tabulku, ve sloupci A hledám určitý znak, když ho najdu potřebuji od tohoto znaku smazat celou oblast dolu. Děkuji za pomoc. Petr
Přidáno: 18.03.15 12:22
Dobrý den, řeším situaci, kdy potřebuji zkopirovanou hodnotu aktuální buňky vložit jako kritérium do filtru. Makro se mi nahrálo takto: Sheets("List2").Select Selection.Copy Sheets("List1").Select ActiveSheet.Range("A1:A1752").AutoFilter Field:=10, Criteria1:= _ "123" Já bych potřebovala, aby místo té konkrétní hodnoty "123" bylo kritérium aktuálně zkopírovaná hodnota buňky. Moc děkuji :-)
Přidáno: 23.04.15 12:47
Dobrý den, potřeboval bych poradit s makrem. Příklad: v sloupci A mám zaškrtávací políčka, v sloupci B mám jména a v sloupci C mám věk. Potřeboval, aby poté, co zaškrtnu některá políčka v sloupci A, tak se mi na dalším listu v excelu vytvoří seznam se jmeném a věkem (které jsou ve stejném řádku jako zaškrtnuté políčko). Děkuji za pomoc. Byl bych rád, kdyby jste mě kontaktovali na toceli@seznam.cz. děkuji
Přidáno: 05.08.15 16:10
Zdravím,
jak prosím upravit toto makro na označení řádků splňujících podmínku, tak aby mi označil pouze určité buňky (konkrétně v rozsahu sloupců E:H)?
Mockrát děkuji za pomoc.
Michael
Dim PosledniRadek As Long, i As Long
Dim OznacOblast As Range
With Sheets("List1")
PosledniRadek = .Range("A" & .rows.Count).End(xlUp).Row
For i = 1 To PosledniRadek
If Len(Trim(.Range("A" & i).Value)) <> 0 Then
If OznacOblast Is Nothing Then
Set OznacOblast = .rows(i)
Else
Set OznacOblast = Union(OznacOblast, .rows(i))
End If
End If
Next
If Not OznacOblast Is Nothing Then
' tato oblast se může zkopírovat ... OznacOblast.Copy Sheets("List2").Rows(1)
OznacOblast.Select
End If
End With
Přidáno: 23.11.15 11:03
ZDravim, u kodu "PosledniPlnyRadek = Range("A1").End(xlDown).Row PrvniPrazdnyRadek = PosledniPlnyRadek + 1 Cells(PrvniPrazdnyRadek, 1).Select" je ten problem,ze pokud je databaze, nahore je jeden radek ve kterem jsou popsany jednotlive sloupce a druhy radek je tedy prazny,makro se zastavi na poslednim tretim radku makra :"Cells(PrvniPrazdnyRadek, 1).Select" Aby to fungovalo, musi byt prvni radek databaze vyplneny, da se to nejak elegantne vyresit? Dekuji
Přidáno: 20.12.15 21:13
Zdravím, mám dotaz, jestli je možné ukotvit řádky/sloupce pomocí makra, případně jak. Děkuji
Přidáno: 23.12.15 09:23
Ahojte, vie mi niekto poradiť prečo mi toto nefunguje v exceli 2013? Set Rng = Range("A13:A42") i = 1 For counter = 1 To Rng.Rows.Count If Rng.Cells(i) = "zmazať" Then Rng.Cells(i).RowHeight = 0 i = i + 1 Else: Rng.Cells(i).RowHeight = 15 Rows.AutoFit i = i + 1 End If Next Vo verzii 2010 som na tom fungoval v pohode ...
Přidáno: 02.02.16 04:47
Nemělo by "Next" říkat i které proměnné se týká? "Next counter"
Přidáno: 02.02.16 15:13
Dobrý den, potřeboval bych pomoc s problémem. Přes inputbox zadám položku a chci, aby mi makro vymazalo všechny řádky, kde se položka nevyskytuje. Děkuji
Přidáno: 02.03.16 17:27
Dobrý deň, chcel by som si napísať skript na to že chcem skryť riadok ak hodnota v bunke C nad nim bude prázdna teda false, ako náhle tam vpíšem číslo chcem aby sa mi odkryl další riadok. A toto sa opakovalo od riadku 4 po 104 napríklad. takze vzdy ked do riadku napisem cislo zobrazi sa dalsi riadok... Zatial mi to ide cez tento prikaz: If Range("C32").Value = 0 Then Rows("33").EntireRow.Hidden = True Else Rows("33").EntireRow.Hidden = False End If Avsak chcel by som tennto skript napisat nejako uhladenejsie, neviete mi poradit? Dakujem
Přidáno: 08.04.16 12:30
Dobrý den, s makrama začínám a nevím si rady. Mám tabulku, kde potřebuji vymazat hodnoty od B4 po poslední plnou buňku v tomto sloupci a od C4 po poslední plnou buňku vložit obsah buňky C2. Předem moc děkuji za pomoc
Přidáno: 31.05.16 07:06
Dobry, den. Diky moc za skvele prispevky. Zacinam s VBA/makro v excelu a moc prosim o radu jak UDELAT BLOK V SLOUPCICH A az D - OD POSLEDNIHO RADKU(zaznamu) SMEREM NAHORU O PRESNE 16918 RADKU. Vzdy se mi jedna o sloupce A,B,C a D a vzdy jde o prave 16918 radku od posledniho radku nahoru, ale posledni radek kazdym dnem o tech 16918 radku narusta. Automakro mi vygenerovalo toto (vypsana jen problemova cast): ActiveCell.SpecialCells(xlLastCell).Select Range("A259597:D276514").Select Range("D276514").Activate Selection.Copy Vsimnete si, ze mi vytvoril a zkopiroval blok s pevnymi bunky (podle prvni ukladane predlohy), ale ja mu potrebuju rict tuto hlasku: 1. najdi posledni radek s hodnotama 2. udelej blok pro sloupce A,B,C,D od tohoto posledniho radku smerem nahoru o 16918 radku 3. zkopiruj tento blok Pomuze mi nekdo, prosim. Teprve zacinam. DEKUJI mockrat :)
Přidáno: 02.06.16 13:25
To Voyager:rwLast = ActiveCell.SpecialCells(xlLastCell).Row
Range("A" & rwLast - 16917 & ":D" & rwLast).Select
Range("D" & rwLast).Activate
Selection.Copy
Přidáno: 02.06.16 13:56
To Voyager: -- (Poznámka) Riadok: -- Range("D" & rwLast).Activate -- nie je nutný
Přidáno: 14.06.16 16:10
Dobrý den, chtěl bych se zeptat, zda existuje nějaká funkce, která by přečetla číslo z buňky a podle toho vytvořila příslušný počet sloupců. Jedná se o seznam na objednávání obědů, kdy se počet jídel v jednom dni pohybuje v rozmezí tří až pěti druhů. Děkuji za radu.
Přidáno: 17.06.16 07:45
To Josef Němec: -- Nerozumiem zadaniu. Kde by to malo vytvoriť? Medzi určitými stĺpcami, alebo na konci s popisom hlavičky/čísla obedu? Ak je možné prosím o príklad, napr. medzi A a B vložiť 3 až 5 stĺpcov.
Přidáno: 23.09.16 10:00
Dobrý den. Smekam nad tak sirokym rozsahem znalosti! Potreboval bych prosim poradit ci jiz formou maker nebo VBA ... Priklad: Na listu A mam tabulku s 2000 radky obsahlych data ve 30 sloupcich. Na listu B mam stejny pocet radku ale jenom vyber nekterch sloupcu (10) z listu A, ktere mam propojene na list C kde mam labely pro tisk. Data z B do C se me doplni po zadani cisla radku. Data na listu B zacinaji a konci na stejnem radku, jak jsou na listu A. Na cislovani radku vyuzivam jenom listu excelu t.j. nemam cislovani zvlast ve sloupci. Otazka: Jak dynamicky osetrit tabulku B, kdyz bych odstranil cely radek v tabulce A, cim se vsechna data posunou o jeden radek. Tim padem se mne rozhodi data v tabulce B protoze tam radek ktery byl odstranen v A odstraanen a na labelech vznikne zmatek. Informace jiz nebudou sedet podle radku meyi A a B. Potrebuji data na B zachovat i po odstraneni radku v tabulce A anebo aby odstranilo dynamicky radek i v listu B. Dekuji moc krát.
Přidáno: 27.09.16 15:11
To Luffi: -- odstránenie toho istého čísla riadku(-ov) na 2 rôznych listoch (zvyšné riadky sa posunú smerom hore)Sheets("Hárok1").Rows("10:10").Delete Shift:=xlUp
Sheets("Hárok2").Rows("10:10").Delete Shift:=xlUp
Přidáno: 07.11.16 20:32
Řesím stejný problém, co Pekox. Nebyla by rada? Zadávání oblasti buněk parametricky.
Přidáno: 15.12.16 01:12
Dobrý den, potřeboval bych poradit. Mám tabulku věcí, která má více jak 4.000 řádků. Pokud nějakou věc odepíši (je vyřazena z majetku), tak mi zmizí ze sloupce majetek (tzn., že se majetek zmenší) a vyskočí ve sloupci odpisů (hodnota odpisů se zvětší) a já bych potřeboval, aby se mi odpisy objevily v nové tabulce, tzn. aby mi automaticky při vyřazení se vytvořila nová tabulka, kde by byly pod sebou všechny vyřazené věci, v tom pořadí v jakém se odepíší čí v pořadí jak jdou v původní tabulce za sebou, tzn., že bych nemusel listovat ve čtyřtisícové tabulce, ale měl bych tabulku třeba o deseti řádcích, kde bych viděl původní řádky, ovšem pouze ty, které byly vyřazeny… Děkuji za pomoc, s pozdravem Venca
Pomohl Vám návod? Sdílejte na Facebooku, G+ |
||
LinkedIn... |
Stránky o MS Office (Excel) produktu společnosti Microsoft. Neslouží jako technická podpora.
| Email na autora: pavel.lasak@gmail.com | Copyright © : Pavel Lasák 2004 - 2024 |