Přeskočit navigaci | Přeskočit na novinky

Jste zde: Úvodní stránka » excel » vba-soubory » excel-vba-vypsat-soubory-adresare

Vypsat adresáře, soubory ve VBA

Videokurzy Excel

Ve spolupráci se SEDUO jsem vytvořil několik videokurzů:

... jak pomocí VBA vypsat soubory či adresáře ...

Úvodem

Pro jednu aplikaci jsem potřeboval vypsat adresáře a ve zvoleném adresáři vypsat soubory. Třeba se Vám tyto informace budou hodit. V tomto článku jsou ukázkové kódy pro:

Výpis souborů v adresáři pomocí VBA

ChDrive "C" 'pokud se přepíná na jiný disk adresar = "C:\ISO" ChDir adresar SouboryKtere = Dir("*.txt") i = 1 Do While SouboryKtere <> "" Cells(i, 1) = SouboryKtere i = i + 1 SouboryKtere = Dir Loop

Výpis souborů v adresáři pomocí VBA

Soubory se vypíši do ListBoxu. ListBox1.AddItem můžeme nahradit třeby vypisem do dialogového okna MsgBox.

adresar = "C:\temp\" ChDir adresar SouboryKtere = Dir("*.*") ListBox1.Clear Do While SouboryKtere <> "" ListBox1.AddItem SouboryKtere SouboryKtere = Dir Loop

Zpět na seznam

Zobrazit co je v ListBox vybráno

Pokud máte již seznam souboru v ListBox, můžete označit položku a přes tlačíko jej vypsat:

'Je vybrano něco If ListBox1.ListIndex = -1 Then 'Pokud je ListIndex -1 není nic vybráno MsgBox "Nemáš nic vybráno! Zkus to znovu :)" Else 'jinak je se do Value uloži položka která je vybrana MsgBox "Vybrano máš: " & ListBox1.Value End If

Poznámka: nemusí jít o jeho vypsaní, ale tento soubor můžete otveřít, smaza, přejmenovat, atd.

Zpět na seznam

Výpis adresáře pomocí VBA

Adresáře se vypíši do ListBoxu. ListBox1.AddItem můžeme nahradit třeby vypisem do dialogového okna MsgBox.

ZvolenyAdresar = "D:\MujAdresar\" Set fs = CreateObject("Scripting.FileSystemObject") Set f = fs.GetFolder(ZvolenyAdresar) Set fc = f.SubFolders For Each f1 In fc polozka = f1.Name ListBox1.AddItem polozka Next

Poznámka: za pomoci http://www.codeguru.com/forum/showthread.php?t=368348

Změna disku

Pokud je potřeba změnit disk stačí použít příkaz:

ChDrive "D"

Zpět na seznam

Změna adresáře

Pokud je potřeba změnit adresář stačí použít příkaz:

ChDir "d:\smaz\"

se změnou adresáře může být problém, jak jej obejít se dozvíte v další kapitole.

Zpět na seznam

Problémy s adresářem

Někdy může externí aplikace změnit disk proto doporučuji použít nejprve přiřazení disku a poté přiřazení adresáře

ChDrive "C"

Aktuální adresář

Aktuální (ten na který se VBA v Excel odkazuje) adresář s kterým Excel pracuje může být jiný než aktivní, ve kterém máte skript. Jak jej zjistit?

Set wshell = CreateObject("WScript.Shell") MsgBox wshell.CurrentDirectory

Toto je chyba, kdy chcete načítate nějaká data (myslíte si, že se použije adresář ve kterém máte soubor se VBA skriptem) a Excel zobrazuje chybovou hlášku, že soubor neexistuje. Je to tím, že se odkazuje (pracuje) na úplně jiný adresář.

Ke stažení

Soubor Ukázka výpis souboru (výber souboru) Excel VBA soubor ve formátu *.xlsm ke stažení zdarma. Soubor využívá makra (nutno povolit).

Závěrem

Existují i jiné možnosti, jak vypsat soubory či adresáře, ale výše uvedené příklady se mi osvědčily. Soubor s příklady se bude doplňovat.

Článek byl aktualizován: 19.09.2020 11:07

Odměna

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.


Pavel Lasák - autor webu

Pavel Lasák

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ů.

   Pavel Lasák LinkedIn Profil    Pavel Lasák Google+ Profil    Pavel Lasák facebook Profil    Pavel Lasák twitter Profil


Komentáře


občan

Přidáno: 17.05.13 14:47

Dobrý den, zkoušel jsem použít váš kód pro zobrazení vybraného souboru v listboxu, ale zobrazí se mi pouze: Vybrano máš: a název vybraného souboru chybí...je to určitě takto? Děkuji

Pavel Lasák

Přidáno: 17.05.13 16:03

To občan: Funguje přiložil jsem do článku soubor ke stažení.

občan

Přidáno: 20.05.13 08:46

ano to funguje, ale měl jsem na mysli toto: Zobrazit co je v ListBox vybráno

sen.cz

Přidáno: 07.09.14 16:24

Dobrý den, potřeboval jsem kód upravit tak, aby mi to zobrazilo složku, v které je umístěn soubor, z kterého to otevírám, já poté vybral jiný soubor ze seznamu a ten to otevřelo na pozadí. Snažím se to dát dohromady, ale padá mi to na chybě v řádku ListBox1.Clear. Nevím, co dělám špatně. Přikládám celý svůj kód: Private Sub OtevřítSoubor() adresar = ThisWorkbook.Path ChDir adresar SouboryKtere = Dir("*.xlsx") ListBox1.Clear Do While SouboryKtere <> "" ListBox1.AddItem SouboryKtere SouboryKtere = Dir Loop End Sub Private Sub OtevřítSoubor2() If ListBox1.ListIndex = -1 Then MsgBox "Vyber soubor" Else Workbooks.Open ListBox1.Value ThisWorkbook.Activate End If End Sub

Jojo

Přidáno: 11.09.14 11:35

To sen.cz: -- Makro musí byť umiestnené v module, kde je ListBox1 alebo sa treba odkazovať tam, kde je umiestnený. napr: Sheets("List1").ListBox1.Clear

sen.cz

Přidáno: 12.09.14 18:08

Asi tomu moc nerozumím. Makro mám umístěné v souboru stejně jako ostatní makra, která v daném sešitě používám a fungují a modul makra mám natažen k tlačítku na listu, což ostatní makra také fungují. ListBox1 je umístěn přímo na listu. Pokud ten kód vložím přímo k ListBox1, tak jak jej mám aktivovat? A když jej přidám k tlačítko, jak ho mám donutit vyplnit ListBox1? Nějak se v tom ztrácím a nepomohl mi ani ukázkový soubor (v tom mi to funguje, ale když jsem si upravil adresu na aktuální složku, tak nevím proč, ale primárně to tahá z disku C:, i když je soubor umístěn jinde). Jde to případně nějak vložit do MsgBoxu, aby to plnilo stejnou funkci - možnost vybrat a otevřít? Díky moc za cenné rady.

sen.cz

Přidáno: 14.09.14 14:39

Tak už se mi to povedlo a funguje to. Ještě přijít na to, jak pracovat s otevřeným souborem (potřeboval bych někam do buňky Excelu vytáhnou jeho jméno a na základě toho natáhnout z něj data), ale to snad brzy taky rozlousknu. Omlouvám se za spam.

Roman

Přidáno: 22.11.14 23:02

Dobrý den. Je možné podobným způsobem zjistit i počítač na kterém běží aktuálně spuštěný soubor excelu? Děkuji.

Marek

Přidáno: 19.03.15 14:53

zkoušel jsem stáhnutý soubor a velice se mě to líbí a funguje to perfektně ale myslel jsem že bych do toho napasoval otevírání wordu s tím že bych tam něco upravil a zase uložil jenže jsem u toho ztroskotal nevím jestli něco takového je možné že bude fungovat děkuji za odpověď Private Sub CommandButton9_Click() ChDrive "F" adresar = "F:\Marek aktualizace" ChDir adresar SouboryKtere = Dir("*.*") ListBox1.Clear Do While SouboryKtere <> "" ListBox1.AddItem SouboryKtere SouboryKtere = Dir 'Dim wdApp As Object Dim wdDoc As Object Set wdApp = CreateObject("Word.application") Set wdDoc = wdApp.Documents.Open _ (Filename:=adresar & "\" & SouboryKtere) Selection.Find.ClearFormatting With Selection.Find.Font .Superscript = True .Subscript = False End With Selection.Find.Replacement.ClearFormatting wdDoc.Close savechanges:=True Set wdDoc = Nothing wdApp.Quit Set wdApp = Nothing Loop End Sub

Pavel K.

Přidáno: 09.08.15 14:51

Sub Otevri() On Error Resume Next Dim AD As String Dim Cesta As String Application.ScreenUpdating = False Application.DisplayAlerts = False If ActiveCell = "" Then MsgBox "Není označen soubor" Else Cesta = Range("F1") 'Cesta = "C:\" AD = ActiveCell ActiveSheet.Hyperlinks.Add anchor:=Selection, Address:=Cesta & "\" & AD ',TextToDisplay:="Predpis", ScreenTip:="Odkaz" ActiveCell.Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True End If Application.ScreenUpdating = True Application.DisplayAlerts = True End Sub Sub Vypis() Dim myRow As Long Dim myFile As String Dim ADRESAR As String On Error Resume Next Application.ScreenUpdating = False Range("A:A") = "" ADRESAR = Range("F1") ChDir ADRESAR ' ChDir "C:\" myRow = 2 myFile = Dir("") Do Until myFile = "" Cells(myRow, 1) = myFile myRow = myRow + 1 myFile = Dir Loop Range("A1") = "Soubory" Application.ScreenUpdating = True End Sub

Pavel J.

Přidáno: 21.08.15 13:43

Zdravím, nevíte jak u jména souboru zobrazit datum + čas vytvoření?

Pavel Lasák

Přidáno: 22.11.15 20:37

To Pavel J: Dim DatumCasSouboru As Date DatumCasSouboru = FileDateTime("D:\muj-soubor.xlsx") Nebo profesionálněji přes FSO. Dim oFS As Object Dim sFile As String sFile = "D:\soubor.xlsx" Set oFS = CreateObject("Scripting.FileSystemObject") ' Datum vytvoření MsgBox (oFS.GetFile(sFile).DateCreated) ' Datum modifikace MsgBox (oFS.GetFile(sFile).Datelastmodified) Set oFS = Nothing

Marek

Přidáno: 02.12.15 10:34

Dobrý den, měl bych na Vás dotaz. Je možné vypisovat soubory i z podadresářů? Například mám adresář "D:\Pokus" a v ní soubory "seznam1.pdf" a "seznam2.pdf". Dále je v adresáři "D:\Pokus" další adresář "Praha", který obsahuje další pdf soubory. Je možné do Excelu současně vypsat soubory z adresáře "Pokus" i podadresáře "Praha"? Např. "D:\Pokus\seznam1.pdf", "D:\Pokus\seznam2.pdf", "D:\Pokus\Praha\seznam3.pdf" atd... Vaše makro perfektně pracuje v jednom zvoleném adresáři. Třeba "pokus" odkud vypíše všechny soubory, ale bohužel nevypíše z adresáře "Praha" Děkuji

MichailK

Přidáno: 07.12.15 20:34

Dobrý deň, rád by som vypísal zoznam ako do hore uvedené (v rámci PC mi to funguje). Ale nemôžem prísť na to, keď je adresár umiestnený na sieti,napr. "\\nieco.cieco2.com/data/adresar". Vedeli by ste mi niekto pomôcť? Ďakujem

Michal

Přidáno: 11.01.16 04:45

Dobrý den, nevíte někdo jak ve VBA vytvořit složku na disku, která bude mít název, který je napsán v určité buňce. Už jsem prohledal snad všechno a nevím jak na to. díky za jakoukoliv pomoc

Pavel Lasák

Přidáno: 11.01.16 08:28

TO Michal: Stačí přečíst údaj z dané buňky

Michal

Přidáno: 14.01.16 19:09

tomu rozumím, akorát nevím jak to tam dostat např. MkDir "S:\Production\BEWO\PLÁN CUTTING ARCHIV\data z buňky" ActiveWorkbook.SaveAs Filename:= _ "S:\Production\BEWO\PLÁN CUTTING ARCHIV\data z buňky\Plán Cutting 1.xlsm", _ FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False

tear

Přidáno: 15.02.16 16:53

Dobrý den nevíte jak vypsat seznam složky kde jsou jen xls soubory a seznam jejich kistů?

Peter

Přidáno: 13.05.16 11:42

Dobrý den, potreboval by som poradit. z adresara importujem do jedneho dokumentu viacero excel dokumentov.su to reporty za jednotlive tyzdne.Potreboval by som do master zosita vložit k importovanym datam aj informaciu do jedneho stlpca,z ktoreho zosita boli data importovane. viete mi poradit ako na to? import mi funguje bez problemov.

Peter

Přidáno: 13.05.16 11:47

Prikladam aj vba code, ktory pouzivam pre import, a do ktoreho by som potreboval vlozit aj vyssie popisanu funkciu. Sub ImportSense_test() Dim FolderIn As String, FolderOut As String Const FILE_EXT As String = "xls*" Dim FileName As String Dim wbMaster As Workbook, wsMaster As Worksheet Dim wbTemp As Workbook, wsTemp As Worksheet Dim rgHeader As Range, cl As Range, lFreeRow As Long Dim clFound As Range, lLastRow As Long Set wbMaster = ThisWorkbook Set wsMaster = wbMaster.Sheets("input_SENSE") FolderIn = wbMaster.Path & "\DATA\SENSE\" FolderOut = wbMaster.Path & "\DATA\SENSE\" If Len(Dir$(FolderOut, vbDirectory)) = 0 Then MkDir FolderOut Application.ScreenUpdating = False FileName = Dir$(FolderIn & "*." & FILE_EXT) Do While Len(FileName) > 0 Set wbTemp = Workbooks.Open(FolderIn & FileName) Set wsTemp = wbTemp.Worksheets(1) With wsTemp lLastRow = .Cells(.Rows.Count, "A").End(xlUp).Row - 2 End With If lLastRow > 1 Then 'ureíme první volný oádek v hlavním listu With wsMaster lFreeRow = .Cells(.Rows.Count, "A").End(xlUp).Row End With 'pro každé záhlaví v hlavním listu 'ureíme odpovídající sloupec a zkopírujeme do hlavního listu For Each cl In wsMaster.Range("A2:O2") Set clFound = wsTemp.Range("5:1").Find( _ cl.Value, LookAt:=xlWhole) If Not clFound Is Nothing Then clFound.Offset(1).Resize(lLastRow - 3).Copy _ cl.Offset(lFreeRow - 1) End If Cells.Replace What:=",", Replacement:=".", LookAt:=xlPart, SearchOrder _ :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False Next cl End If wbTemp.Close False Name FolderIn & FileName As FolderOut & FileName FileName = Dir$ Loop End Sub

Standa

Přidáno: 27.06.16 13:36

Dobrý den. Já mám drobný problém s velikostí ListBox_u. Velikost si program mění sám od sebe. Upravím velikost, uložím a po otevření se nastaví velikost sama. Přitom text nikdy nepřetéká. Prosím o radu. Předem děkuji.






Excel


Sdílejte

Pomohl Vám návod?
Sdílejte na Facebooku, G+
LinkedIn...

Nové články


Reklama


TOPlist Licence Creative Commons webarchiv rss XML

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 |