V jednom z minulých článků jsme publikovali makro, které umí zkopírovat data z jednoho předem daného souboru do druhého. Co když ale soubor, ze kterého chceme data načíst, zatím neznáme? Řešením je napsat makro, která se nejprve zeptá, který soubor chceme otevřít.

Řekněme, že naším cílem bude do buňky C10 na listu 1 souboru, ve kterém máme makro, zkopírovat hodnotu ze souboru, který teprve vybereme. Přičemž víme, že hodnota se nachází v buňce B5

Co je dobré vědět předem?

  • Ve VBA existuje více možností, jak vyvolat dialogové okno pro otevření souboru. My použijeme metodu Application.FileDialog, což je univerzální možnost pro vyvolání dialogového okna pro práci se soubory. Navíc obsahuje celou řadu možných nastavení.
  • Je rozumné ošetřit základní chybové stavy. Například pokud uživatel v dialogovém okně nezvolí žádný soubor nebo naopak zvolí více než jeden soubor
  • Všimněte si položky .SelectedItems(1), do které se nahraje adresa označeného souboru. Pokud budete chtít vybrat více než jeden soubor, budete pouze měnit číslovku v závorce a můžete adresy načíst do různých proměnných nebo do pole.

Zdrojový kód makra

Zdrojový kód makra je opatřen zkrácenými komentáři. Plné vysvětlení příkazů naleznete v další části článku.

Sub nacti_z_vybraneho_souboru()
    Application.DisplayAlerts = False 'potlačí excelová hlášení (např při zavírání souborů)
    With Application.FileDialog(msoFileDialogFilePicker) 'spustí dialogové okno pro otevření
       .InitialFileName = "C:\Users\Dell\Dropbox\data" 'nastavení úvodní složky procházení
       .Title = "Vyber adresář" 'nastavení názvu okna
       .Filters.Add "Soubory Excelu (xls/xlsx)", "*.xl*", 1 'nastavení filtru pro zobrazení souborů
       .Show
        If .SelectedItems.Count = 0 Then
           MsgBox "Nebyly načteny žádné soubory": Exit Sub 'pokud není vybrán žádný soubor, makro vypíše hlášení a ukončí se
        ElseIf .SelectedItems.Count > 1 Then
           MsgBox "Vyberte pouze jeden soubor!": Exit Sub 'pokud je vybráno více, než jeden soubor, makro vypíše hlášení a ukončí se
        Else
        zdrojovy_soubor = .SelectedItems(1) ' načte adresu souboru do proměnné
        End If
    End With  
   Workbooks.Open (zdrojovy_soubor) ' otevření souboru, který jsme vybrali
   docasna = ActiveWorkbook.Worksheets("List1").Range("B5") ' uložení hodnoty z buňky B5 na listu 1 do proměnné
   ActiveWorkbook.Close  'zavření sešitu
   ThisWorkbook.Activate ' aktivace původního souboru
   Worksheets("List1").Range("C10") = docasna ' uložení hodnoty z proměnné do buňky
   Application.DisplayAlerts = True 'opětovné povolení excelovských hlášené
End Sub

Jak makro pracuje?

  • Nejprve příkazem Application.DisplayAlerts = False potlačíme výstražná hlášení excelu. To by nám komplikovalo běh makra v okamžiku, kdy makro zavírá soubor a excel se standardně ptá, zda chceme soubor opravdu zavřít.
  • Příkazem With Application.Filedialog....End With se vyvolá dialogové okno pro výběr souboru s následujícími parametry
    • InitialFileName = adresář, jež bude v okně nastaven jako výchozí
    • Title = název dialogového okna
    • Filters.Add = zařídí, že se v okně objeví pouze typy souborů, které se nám hodí. V prvních uvozovkách je uveden text, který uživatel uvidí, v druhých je samotná definice filtru. Číslo na posledním místě určuje pořadí filtru, pokud jich nastavíme více.
    • Show = zařídí samotné zobrazení okna
    • Mezi příkazy If ..End If jsou ošetřeny chybové stavy. pokud není vybrán žádný soubor, uživateli se vypíše hlášení a makro je ukončeno. Podobně se postupuje, pokud uživatel vybere více, než jeden soubor. v případě, že je vše v pořádku, načte se adresa souboru do proměnné zdrojovy_soubor
  • Příkaz Workbooks.Open(zdrojovy_soubor) otevře vybraný soubor
  • Dále se příkazem docasna = ActiveWorkbook.Worksheets("List1").range("B5") načte do proměnné hodnotu z buňky B5 z listu 1 aktovního souboru, tedy toho, který jsme zvolili. 
  • Příkaz ActiveWorkbook.Close pak sešit zavře
  • Příkaz ThisWorkbook.Activate aktivuje zpět tento soubor( soubor, ve kterém je toto makro). Tento příkaz není nutný, pokud pracujete pouze s jedním dalším souborem, neboť po jeho uzavření se aktivuje tento soubor automaticky.
  • Worksheets("List1").Range("C10") = docasna načte z proměnné hodnotu do buňky C10
  • Po té se příkazem Application.DisplayAlerts = true opět povolý excelová hlášení a makro se ukončí

Napsat komentář

Vaše emailová adresa nebude publikována.

smazat formulářOdeslat komentář