Jak kopírovat uzavřený blok buněk se vzorci

Jak kopírovat uzavřený blok buněk se vzorci? Řekněme, že máte oblast buněk (ucelenou tabulku, jakýsi nezávislý, soběstačný ekosystém), jejíž hranice nepřekračují vzorce uvnitř. V těchto vzorcích přitom používáte absolutní adresování (zjednodušeně řečeno dolary v odkazech na buňky), a vy si přejete tento blok zkopírovat jinam (v příkladu níže se jedná o oblast B4:E6). Jak to dopadne s klasickým CTRL+C a CTRL+V, vidíte na obrázku – absolutní část odkazů se drží původního umístění.

Kopírování uzavřeného bloku buněk se vzorci - CTRL+C a CTRL+V
Kopírování uzavřeného bloku buněk se vzorci – CTRL+C a CTRL+V

Zbavit se absolutní adresace dost dobře nelze, bez její funkčnosti by nebylo možné efektivně vytvořit původní tabulku. Co s tím? Nebudu vás napínat. Řešením je dvojí transpozice během kopírování, tj. využití dialogu Vložit jinak…

Kopírování uzavřeného bloku buněk se vzorci - dvojí transpozice
Kopírování uzavřeného bloku buněk se vzorci – dvojí transpozice

Postup není všespásný. Nepříjemná je samozřejmě nutnost odkládací plochy v mezikroku, resp. potřeba tolika řádků v ní, kolik sloupců má původní oblast.

Jinou možností je po vytvoření úvodní tabulky změnit v jejích vzorcích adresování na čistě relativní (ručně odstraněním dolarů v dialogu Najít a nahradit), a pak teprve aplikovat kopírování.

Jak zrcadlit blok buněk

A co přesně opačný postup, kdy naopak máme kompletně zpracovanou tabulku a chceme vytvářet její obsahové kopie (klony, zrcadla)? Jako nejjednodušší se jeví přetažení původní tabulky za hranu pravým tlačítkem myši a volba Vytvořit zde propojení…

Propojení buněk
Propojení buněk

V nové tabulce se tak všechny buňky budou prostým odkazem vázat na původní tabulku (nebude se opakovat mnohdy složitý výpočet ve vzorcích původní tabulky).

Teď by to ještě chtělo… Zaměnit relativní adresy za absolutní, abychom si nadále vystačili s CTRL+V? To ale jednoduše nejde, jen s pomocí maker a metodou Application.ConvertFormula aplikovanou na každou buňku oblasti.

1
2
3
4
5
6
7
8
9
10
11
12
Sub ZmenaAdresace()

    Dim rngBunka As Range

    For Each rngBunka In Selection
        If rngBunka.HasFormula = True Then
            rngBunka.Formula = Application.ConvertFormula(rngBunka.Formula, _
                xlA1, xlA1, xlAbsolute)
        End If
    Next rngBunka

End Sub

K zamyšlení: Pomohl by vám v něčem styl adresování R1C1?