Ve spolupráci se SEDUO jsem vytvořil několik videokurzů:
... jak pomocí VBA vypsat soubory či adresáře ...
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:
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
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
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.
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
Pokud je potřeba změnit disk stačí použít příkaz:
ChDrive "D"
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.
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í (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ář.
Soubor Ukázka výpis souboru (výber souboru) Excel VBA ke stažení zdarma. Soubor využívá makra (nutno povolit).
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
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: 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
Přidáno: 17.05.13 16:03
To občan: Funguje přiložil jsem do článku soubor ke stažení.
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
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
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
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.
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.
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.
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
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
Přidáno: 21.08.15 13:43
Zdravím, nevíte jak u jména souboru zobrazit datum + čas vytvoření?
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
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
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
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
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
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ů?
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.
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
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.
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 |