Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 1. 6. 2017 22:09:05

max2005
Člen
Registrace: 1. 6. 2017
Příspěvků: 28

Makro v calc nové makro

Dobrý den,

potřebuji poradit jak mám přepsat makro z Excelu do Calcu jedná se mi o makro, které načte data z z jednoho sešitu a vloží je s jistými upravami do jiného sešitu.

Bohužel nejsem v programování maker v Calcu úplný začátečník takže sic jsem tu narazíl na příspěvěk kopírování mezi soubory - makro, ale bohužel z toho moc nechápu proč se sešit musí otevyrat skrytý a taktéž se mi nedaří pochopit v jakém kroku se sešity přepínají a začně makro pracovat v daném sešitu. Je to sami Dim a Args wink


Mé nakro v ecelu je zde:

'Option VBASupport 1
Sub Makro5()
'
' Makro5 Makro
' Makro zaznamenané 28.5.2017, Ja
'

'


    ChDir "C:\Documents and Settings\Max\Plocha\export"
    Workbooks.Open Filename:= _
        "C:\Documents and Settings\Max\Plocha\export\VF_1.xls"
    Radek = 2
    
ActiveSheet.Range("J2").Select
co = ActiveCell.Value
Do Until co = ""

ActiveSheet.Cells(Radek, 2).Select
jmeno = ActiveCell.Value
ActiveSheet.Cells(Radek, 3).Select
prijmeni = ActiveCell.Value
ActiveSheet.Cells(Radek, 1).Select
firma = ActiveCell.Value
ActiveSheet.Cells(Radek, 11).Select
email = ActiveCell.Value
ActiveSheet.Cells(Radek, 12).Select
telefon = ActiveCell.Value
ActiveSheet.Cells(Radek, 9).Select
dobirka = ActiveCell.Value
ActiveSheet.Cells(Radek, 4).Select
hodnota_zasilky = ActiveCell.Value
ActiveSheet.Cells(Radek, 6).Select
id_zasilkovny = ActiveCell.Value
obchod = "Stěstíčko"
    
If sesit <> 1 Then

 Workbooks.Add
 ActiveWorkbook.SaveAs "C:\Documents and Settings\Max\Plocha\export\sesit1.csv"
sesit = 1
Else
End If

Windows("sesit1.csv").Activate

    Range("A1").Select
 ActiveCell.FormulaR1C1 = "verze 2"

 ActiveCell.Offset(Radek, 0).Select
 bunka = co & "," & jmeno & "," & prijmeni & "," & firma & "," & email & "," & telefon & "," & dobirka & "," & hodnota_zasilky & "," & id_zasilkovny & "," & obchod
ActiveCell.FormulaR1C1 = bunka
 
Windows("VF_1.xls").Activate

ActiveSheet.Cells(Radek + 1, 10).Select
co = ActiveCell.Value
Radek = Radek + 1
Loop
Radek = Radek - 1
Windows("sesit1.csv").Activate
Range("A1").Select
ActiveWorkbook.Save
ActiveWorkbook.Close
Windows("VF_1.xls").Activate
ActiveWorkbook.Close
Windows("export adres.xls").Activate
End Sub 

'Option VBASupport 1 je kod který jsem našel kdesi na forech že by tím mělo být umožněno spouštět makro z exelu v calcu. Makro však stejně nefunguje což jak postupně studuji makra v calcu tak se nedivím smile  Asi budu schopný vybírat buňky přiřazovat jim proměnné, ale nedaří se makru vysvětlit v jakém sešitě má zrovna pracovat.

Předem díky za pomoc s úpravou kodu.
Max

Editoval max2005 (7. 7. 2017 22:39:07)

Offline

#2 2. 6. 2017 05:51:50

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Makro v calc nové makro

Obecně platí že makra VBA v Calcu nefungují ačkoliv nejsou hlášeny jako chyba. Existuje jeden případ kdy to neplatí. Jedná se o makra pro převod mezi Base a Access - rozšíření Access2Base extensions Access2Base. Bývá součástí LibreOffice.
     Přestože existuje hned několik portálů které se věnují konverzi kódu z VisualBasicu do StarBasicu jde jen o vzájemné relace některých rutin. Spíš to umožňuje pochopit rozdílnosti. Nelze to brát doslova jako převod nebo překlad.


     Váš kód z excelu načítá zřejmě nějaký výstup z eshopu nebo něco podobného jako report. Pak už mi to trošku uniká. Spojuje se to zřejmě z několka řádků do jediné buňky a přepisuje do dalšího sešitu. Jde zřejmě o obsluhu ehopu který navazuje na výstupní hlášení portálu a zaznemanává se do seznamů různého typu. Zákaznící, zboží, odesláno, objednat u dodavatelů, reklamovat...... Zde je asi jen jediný vzorový případ podobný se všemi ostatními evidencemi.


     Problém převodu znamená jediné - úplný přepis do StarBasicu. Nicméně je potřebné popsat proces jako schema. Osobně bych musel dohledat co se v kódu vyskytuje jako běžný a mimořádný výraz a co dělá. Mám například dojem že Windows("xyz.xls").Activate nastavuje jako funkce do popředí (pod kurzor) konkrétní sešity ve kterých probíhají procesy kopírování a podobně. Tohle volání sešitů je ve StarBasic složitější ale dalo by se to udělat jako colection aby to bylo podobné s VBA (i kdyý také to může být psaná funkce - nevím).
     Takže raději schematický popis - bude to jen několik řádků :
1 - otevřít adresář ...
2 - najít nějaký sešit zdroje (lze vyhledávat názvy v obsahu složky)..
3 - otevřít sešit zdroje
4 - načíst úseky ze zdroje
5 - vložit do aktuálního dokumetu do úseku ....
6 - uložit jako ...
7 - zavřít zdroj
8 - upravit výstup
9 - uložit a zavřít výstup ++ popřípadě další operace.
     Deklarace buněk jsou maličko odlišné od Excelu a podobně mnoho věcí lze dovodit podle kódu. Například pohyb mezi listy. Proto by Vám pomohli vzory různých volání, zápisů a další věci, Například ten problém "open as hidden" znamená otevření skrytého sešitu ale znamená to že se sešit otevře tak že není vídět na desktopu. Ostatní případy otevírají tak že dokumenty vyskočí na popředí což je často nežádoucí. Má to také ale problém s některými operacemi - například select vyžaduje aby sešit byl viditelný. Jde o operace se schránkou která select využívá - je to dobrý postup ale zrovna tohle dost vadí.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#3 2. 6. 2017 07:27:55

max2005
Člen
Registrace: 1. 6. 2017
Příspěvků: 28

Re: Makro v calc nové makro

neutr napsal(a)

Obecně platí že makra VBA v Calcu nefungují ačkoliv nejsou hlášeny jako chyba. Existuje jeden případ kdy to neplatí. Jedná se o makra pro převod mezi Base a Access - rozšíření Access2Base extensions Access2Base. Bývá součástí LibreOffice.
     Přestože existuje hned několik portálů které se věnují konverzi kódu z VisualBasicu do StarBasicu jde jen o vzájemné relace některých rutin. Spíš to umožňuje pochopit rozdílnosti. Nelze to brát doslova jako převod nebo překlad.


     Váš kód z excelu načítá zřejmě nějaký výstup z eshopu nebo něco podobného jako report. Pak už mi to trošku uniká. Spojuje se to zřejmě z několka řádků do jediné buňky a přepisuje do dalšího sešitu. Jde zřejmě o obsluhu ehopu který navazuje na výstupní hlášení portálu a zaznemanává se do seznamů různého typu. Zákaznící, zboží, odesláno, objednat u dodavatelů, reklamovat...... Zde je asi jen jediný vzorový případ podobný se všemi ostatními evidencemi.


     Problém převodu znamená jediné - úplný přepis do StarBasicu. Nicméně je potřebné popsat proces jako schema. Osobně bych musel dohledat co se v kódu vyskytuje jako běžný a mimořádný výraz a co dělá. Mám například dojem že Windows("xyz.xls").Activate nastavuje jako funkce do popředí (pod kurzor) konkrétní sešity ve kterých probíhají procesy kopírování a podobně. Tohle volání sešitů je ve StarBasic složitější ale dalo by se to udělat jako colection aby to bylo podobné s VBA (i kdyý také to může být psaná funkce - nevím).
     Takže raději schematický popis - bude to jen několik řádků :
1 - otevřít adresář ...
2 - najít nějaký sešit zdroje (lze vyhledávat názvy v obsahu složky)..
3 - otevřít sešit zdroje
4 - načíst úseky ze zdroje
5 - vložit do aktuálního dokumetu do úseku ....
6 - uložit jako ...
7 - zavřít zdroj
8 - upravit výstup
9 - uložit a zavřít výstup ++ popřípadě další operace.
     Deklarace buněk jsou maličko odlišné od Excelu a podobně mnoho věcí lze dovodit podle kódu. Například pohyb mezi listy. Proto by Vám pomohli vzory různých volání, zápisů a další věci, Například ten problém "open as hidden" znamená otevření skrytého sešitu ale znamená to že se sešit otevře tak že není vídět na desktopu. Ostatní případy otevírají tak že dokumenty vyskočí na popředí což je často nežádoucí. Má to také ale problém s některými operacemi - například select vyžaduje aby sešit byl viditelný. Jde o operace se schránkou která select využívá - je to dobrý postup ale zrovna tohle dost vadí.


Skoro jste se trefil smile jde o export faktur z Pohody do cvs respektive následný převod do jiného cvs který je schopna importovat zasilkovna pro vygenerování štítku pro zásilky. A to tak že proces je celí uzavřen do cyklu podmínky dokud nebude prázdná buňka. Vezme řadek po řádku a a z daného řádku načte hodnoty a v jiném pořadí je spojí do jedné hodnoty oddělené čarkou do buňky nového sešitu a tak pokračuje dokud není naplněna podmínka.Sic pro pohodu existuje modul ale není zrovna zadarmo smile

A nenašel sem v pohodě způsob jak export upravit tak aby odpovídal našim představám myslím tím pořadí sloupců.

Jinak schema provaděných operací prakticky totožný s tím co exel provádí v současném kodu Přiznávám i toto makro je možná zbytečně kostrbaté ale šel sem cestou, kterou jsem zvladl naprogramovat pravděpodobně by to šlo udělat i mnohem sofistikovaněji.Ale lepe to neumím ani ve VBA. Na ty konverze se zkusím podívat prozatím děkuji za odpovědi.

Max

Offline

#4 2. 6. 2017 10:45:16

kabi
Člen
Registrace: 1. 6. 2017
Příspěvků: 167

Re: Makro v calc nové makro

úplně jsem nepochopil, jak to vkládáte, ale zkuste tohle (i VBA makra fungují, je potřeba je trochu přizpůsobit):

Option VBASupport 1

Sub Main

Dim i, pocetradku
Dim txt, Soub, Soub2 As String
Dim fs, f As Object

Workbooks.Open Filename:="C:\Documents and Settings\Max\Plocha\export\VF_1.xls"

bunka=""
Radek = 2
ActiveSheet.Range("J2").Select
pocetradku = ActiveSheet.cells(2).currentregion.rows.count

co = ActiveCell.Value
For i = radek To pocetradku
ActiveSheet.Cells(Radek, 2).Select
jmeno = ActiveCell.Value
ActiveSheet.Cells(Radek, 3).Select
prijmeni = ActiveCell.Value
ActiveSheet.Cells(Radek, 1).Select
firma = ActiveCell.Value
ActiveSheet.Cells(Radek, 11).Select
email = ActiveCell.Value
ActiveSheet.Cells(Radek, 12).Select
telefon = ActiveCell.Value
ActiveSheet.Cells(Radek, 9).Select
dobirka = ActiveCell.Value
ActiveSheet.Cells(Radek, 4).Select
hodnota_zasilky = ActiveCell.Value
ActiveSheet.Cells(Radek, 6).Select
id_zasilkovny = ActiveCell.Value
obchod = "Stěstíčko"

ActiveSheet.Cells(Radek + 1, 10).Select
co = ActiveCell.Value

txt = txt & co & "," & jmeno & "," & prijmeni & "," & firma & "," & email & "," & telefon & "," & dobirka & "," & hodnota_zasilky & "," & id_zasilkovny & "," & obchod & vbCrLf
Radek = Radek + 1
Next

Soub = "C:\Documents and Settings\Max\Plocha\export\sesit1.csv"
  Set fs = CreateObject("Scripting.FileSystemObject")
  Set f = fs.CreateTextFile(Soub, True, TristateFalse)
  f.Write txt
  f.Close
ActiveWorkbook.Close

End Sub

Offline

#5 2. 6. 2017 15:49:45

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Makro v calc nové makro

Pro kabi:
Proč jste změnil cyklus Do..Until..Loop za For ... Next? Počet řádků není potřeba zjišťovat protože cyklus Do-Loop najde prázdnou buňku a skončí. Ještě divnější je ale to že v cyklu For necháváte inkrementovat "Radek" - to slouží právě jenom v cyklu Do-Loop. V cyklu For stačí místo radek zadat "i". Vím co se Vám asi nelíbilo za cyklem se musí poslední řádek dekrementovat. Ono by to šlo vyřešit jako :
Do
....
Loop Until co = ""
    Nebo podmínkou :
Radek = IIF(co = "",Radek, Radek+1), nebo zjednodušené IF.
    U toho cyklu Do .. Loop je možné zadávat podmínku na začátek cyklu nebo na konec. Zde se nabízí řešení vyhodnotut podmínku na konci - tím nedojde k návratu na začátek a ta dekrementace se dělat nemusí.
    Já se ale přiznám že to dělám také tak a dost často naopříklad uvnitř cyklu For který testuje zda zapsat například do array nebo ne. Jde jen o to aby se ReDim Preserve nemuselo psát hned u podmínky. Vím jednoduše že počet řádků je napřed i jeden - a ten pak dekrementuji stejně jako autor.
    Na tom makru je nepříjemné že do výstupu se mixují čísla sloupce. Šlo by to řešit elegantně pomocí cyklu For ve kterém je Select. Následně se uloží textový výstup který načítá jiný program.


    Nevím o tom, že by se daly makra VBA spustit pod Star Basicem. Faktem je že v Libre Office existuje knihovna Access2Base která makra VB spouštět umí. Ale nevidím nikde možnost volat Option VBASupport 1. Musí to být nějaká externí knihovna.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#6 2. 6. 2017 16:35:55

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Makro v calc nové makro

Tak jsem raději prohledal novější onformace z různých fór a zjistil že se něco málo skutečně dá ale musí se většinou opravdu přepsat. Doporučují raději přepsat do StarBasicu. Jeden typický příspěvek - Příspěvek překlad :


Žádná skutečná zkušenost, opravdu. Ale OO a LO obsahují (omezené) přímou podporu pro VBA (jazyk a kancelářský objektový model). Toto se používá s nativním formátem souborů MS automaticky. V souborech ODF / ODS je třeba povolit podporu VBA na začátku makra, jinak očekává, že LO-Basic:


Option VBASupport 1
Option Compatible


Ale buďte připraveni na potíže. A nezapomeňte, že LO neukládá vlastní makra ve formátech souborů MS Office. Konverze na objektový model LO-Basic a UNO je třeba provést ručně, ačkoli je z business-spreadsheets.com k dispozici jednoduchý online konvertor.

     Ještě podle všeho když použijete formát .xls - nebude ASI potřeba Option VBASupport 1  Option Compatible.


     Ten online konvertor je tady vba2oo ale viděl jsem i jiné stránky. Mělo by to být někda v historii tohoto fóra.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#7 2. 6. 2017 16:57:08

kabi
Člen
Registrace: 1. 6. 2017
Příspěvků: 167

Re: Makro v calc nové makro

Pro neutr:
upravoval jsem to jenom rychle v editoru, takže určitě by šlo spoustu věcí udělat jinak. Vy to děláte podle sebe, já používám to, co mám odzkoušené, např. s vyhodnocením "prázdné" buňky jsem kdysi měl potíže. Export do csv na konci jsem také napsal jinak. Makra psaná původně pro Excel (VBA) jsem si upravoval pro spouštění v OO nebo LO, takže mi věřte, že skutečně fungují i když i v úpravách pro OO a LO jsou rozdíly.

Offline

#8 4. 6. 2017 21:36:58

max2005
Člen
Registrace: 1. 6. 2017
Příspěvků: 28

Re: Makro v calc nové makro

Dobrý den,

Pro kabi děkuji za upravu kodu funguje to s drobnou chybkou, poslední řádek, který se načítá se načte bez toho prvního čísla. A z toho plyne jedna má otázka. Jak mohu zkontrolovat krod krok po kroku pomocí F8? když makro spustím takto tak to funguje pro řádek ActiveSheet.Range("J2").Select jenže, když se otevře sešit VF.. musím se ALT+TAB přepnout abych mohl pokračovat v krokování jernže výše zmíněný příkaz vyvolá okno kde je nahráno makro. Jak se tedy krokuje v calcu?


Díky moc za rady Max

Offline

#9 5. 6. 2017 06:08:25

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Makro v calc nové makro

Krokování se dělá buď s vnořením nebo bez.
Shift + F8 je krokování bez vnoření
F8 by mělo fungovat s vnořením.
     Já osobně používám ikony se složenými závorkami v sadě "makro" která by měla být viditelná implicitně. Chyba je myslím tady - ale je to bez odzkoušení - nemám soubor na který se odkazuje.

Sub Main

Dim i, pocetradku
Dim txt, Soub, Soub2 As String
Dim fs, f As Object

Workbooks.Open Filename:="C:\Documents and Settings\Max\Plocha\export\VF_1.xls"

bunka=""
radek = 2
ActiveSheet.Range("J2").Select
pocetradku = ActiveSheet.cells(2).currentregion.rows.count
co = ActiveCell.Value

For i = radek To pocetradku
'----------------------------------
'Tady je chyba - bylo to až na konci a četlo to o řádek dolů
'takže četlo pod posledním řádkem prázdnou buňku
'ActiveSheet.Cells(i + 1, 10).Select 
ActiveSheet.Cells(i, 10).Select 
co = ActiveCell.Value
'----------------------------------
ActiveSheet.Cells(i, 2).Select
jmeno = ActiveCell.Value
ActiveSheet.Cells(i, 3).Select
prijmeni = ActiveCell.Value
ActiveSheet.Cells(i, 1).Select
firma = ActiveCell.Value
ActiveSheet.Cells(i, 11).Select
email = ActiveCell.Value
ActiveSheet.Cells(i, 12).Select
telefon = ActiveCell.Value
ActiveSheet.Cells(i, 9).Select
dobirka = ActiveCell.Value
ActiveSheet.Cells(i, 4).Select
hodnota_zasilky = ActiveCell.Value
ActiveSheet.Cells(i, 6).Select
id_zasilkovny = ActiveCell.Value
obchod = "Stěstíčko"

txt = txt & co & "," & jmeno & "," & prijmeni & "," & firma & "," & email & "," & telefon & "," & dobirka & "," & hodnota_zasilky & "," & id_zasilkovny & "," & obchod & vbCrLf
Next i

Soub = "C:\Documents and Settings\Max\Plocha\export\sesit1.csv"
  Set fs = CreateObject("Scripting.FileSystemObject")
  Set f = fs.CreateTextFile(Soub, True, TristateFalse)
  f.Write txt
  f.Close
ActiveWorkbook.Close

End Sub

PS :
     Celkem bych doporučoval vrátit se k tomu cyklu DO..Loop a dát podmínku nakonec. Připadá mi že definice "pocetradku" čte jen jedinou buňku "J2" a nedává celý rozsah. Potom bych doporučil na začátek cyklu dát
For i = Radek To pocetradku
ActiveSheet.Cells(9, 2).Select 'buňka ve sloupci "J".
IF ActiveCell.Value = "" Then
Exit For
else
pocetradku = pocetradku + 1
End if
'...............
'...............
Next i
     Faktem je že nevím jestli náhodou buňka J2 neobsahuje údaj o počtu řádků(=COUNTA). Pak by to nebylo potřeba. Do ..Loop nepotřebuje test na rozsah buněk. Načte první neprázdnou a pokračuje dokud nenarazí na prázdnou buňku. Váš původní systém to řešil docela dobře. Testoval od začátku a načetl hned obsah první buňky ale dával 1 řádek navíc což jste řešil. Test na konci způsobí že se provedou operace ale první buňka musí být neprázdná což by zase mohla být chyba.

Editoval neutr (5. 6. 2017 06:40:44)


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#10 5. 6. 2017 09:05:15

max2005
Člen
Registrace: 1. 6. 2017
Příspěvků: 28

Re: Makro v calc nové makro

Omlouvám se, to mě mohlo napadnout hned vložit sem zdrojový soubor tak tak činím hned zde je export včetně VF_1 heslo je calc.

Eexport adres je soubor s oním makrem nepovedlo se mi ho vložet do Moje makra házelo to pak chybu při otevírání VF_1.

VF_1 je soubor, který bude vždy jiný ten exportuje pohoda jsou to prakticky vyexportované vydané faktury tedy jen ty sloupce, které potřebuji. Z tohoto souboru makro vytvoří soubor který já načtu do online podání v zásilkovně a nemusím to tukat ručně. Bohužel sem ted zjistil že sem špatně nastudoval formát souboru iportovaného do zásilkovny, takže celý vkladaný obsah budu muset začínat nikoli v sloupci a ale b ale už ne v A3 jak sem původně mylsle ale v B1. Taktež v mém kodu chybý ještě podmínka která bude zjišťovat obsah buněk ve sloupci I pokud tam bude příkazem tak místo slova přikazem vloží "", pokud tam však bude dobírkou vloží opět místo slova příkazem částku ze sloupce D odpovidájícího řádku.

Cyklus Do Until co = "" (kde co je číslo objednávky = Variabilní symbol z VF_1) jsem použil je z toho důvodu že jsem nevěděl jak spočítat v jednom příkazu kolik je tam řádků tak abych věděl kolikrát se má cyklus pustit.

Mymochodem asi sem úlnej vůl, ale ať použiji krokování jaké chci tak po otevření sešitu VF_1 (to se otevře v novém samostatném okně) se musím přepnout do makra abych mohl krokovat a pak je vyběr buňky J2 vybýráno v aktivním sešitu jenže v tuto chvíli v je to export adres z kterého se defakto makro spouší a pak nevím jak to přepnout tak aby pokračoval v souboru VF_1. Předpokládám že je to jen prkonita ale nemohu na ní přijít proč mi to krokování nedělá to co by mělo.

Díky Max

Offline

#11 5. 6. 2017 10:49:43

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Makro v calc nové makro

To je v pořádku. Celkem to chápu a snadno předělám - ale ve StarBasicu. Jediná věc mi dost jasná není - můžete poslat vzor importu ze zásilkovny?
     Píšete že budete muset začínat nikoliv ve sloupci "A"(A3) ale "B"(B1). B1 pokud vidím je hlavička. Takže hlavička má být také obsahem exportu? A pak ten sloupec "I" nebo "L" s příkazem (vloží ""). Když tam bude dobírkou tak se do buňky ve sloupci (I nebo L?) vloží hodnota ze sloupce "D" a příslušného řádku. Ale co bude když tam nebude "dobírkou"?


     Chtělo by to buď vzor nebo detailně podle bodů vypsat jak má vypadat ten report pro zásilkovnu.
V podstatě se jedná o to jak řadit sloupce do výstupu. Když tam budete chtít hlavičku - bude tam hlavička od 1. řádku (včetně). Když tam budete potřebovat variantní zápisy tak tam budou podle potřeby. Také je možné že budete mít více druhů platby - kartou, respektive převodem - předem takže by tam mělo být "Uhrazeno", když tam bude dobírka tak částka (tak jak jste popsal), ale je možné že to stálým zákazníkum dáte dopředu a oni zaplatí až po dodání - z účtu ap.
    Výstupy lze udělat samostatně pro dobírky a samostatně pro ostatní případy. Takže popište lépe ten výstup nebo pošlete vzor s popisem detailů. Tedy 1. sloupec (zásilkovna) = 2. sloupec(export adres), 2. sloupec (zásilkovna) = 4. sloupec(export adres),...,. K tomu připsat že ve sloupci X má dojít k načtení sloupce (L - nebo I)....


PS :
     Celkem chápu že má být první jména (B), následně příjmení (C) a pak asi firma ale nevidím adresu. Ta je asi jinde - v sešitě export adres. To se dá také udělat dohledat a doplnit soubor po vypumpování dat ze sešitu "VF_1".
     Pak by bylo ale potřeba zadat vyhledávací parametry. Objednávka na firmu může být doručena na různé adresy podle jména zejména když tato bude mít mnoho provozů po celé republice.

Editoval neutr (5. 6. 2017 11:06:09)


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#12 5. 6. 2017 12:59:40

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Makro v calc nové makro

Export adres Podívejte se na tohle. Je to jenom výpis do sešitu a nemá pořadí podle Vašich potřeb. Přes to by se to dalo uložit jako list csv.           

     Úprava není těžká a potom až to upřesníte místo uložení do sešitu vyplivneme soubor csv. Tohle je vlastně jen demo.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#13 5. 6. 2017 15:34:52

kabi
Člen
Registrace: 1. 6. 2017
Příspěvků: 167

Re: Makro v calc nové makro

pro Max2005
Pokud byste chtěl trasovat funkcionalitu a přitom spouštíte makro z jiného sešitu, je potřeba přímo adresovat zdrojový sešit a list a vyhnout se deklaraci ActiveSheet a ActiveBook. Například takto ( zkrátil a zrychlil jsem kod) :

Option VBASupport 1
Sub Main

Dim i, pocetradku
Dim txt, Soub, Soub2 As String
Dim fs, f As Object
Dim sesit as WorkBook
Dim list as String

set sesit = Workbooks.Open("C:\Documents and Settings\Max\Plocha\export\VF_1.xls")
list = "VF_1"
pocetradku = sesit.Sheets(list).cells(2).currentregion.rows.count
txt=""
radek = 2

For i = radek To pocetradku

co = sesit.Sheets(list).Cells(i, 10).Value
jmeno = sesit.Sheets(list).Cells(i, 2).Value
prijmeni = sesit.Sheets(list).Cells(i, 3).Value
firma = sesit.Sheets(list).Cells(i, 1).Value
email = sesit.Sheets(list).Cells(i, 11).Value
telefon = sesit.Sheets(list).Cells(i, 12).Value
dobirka = sesit.Sheets(list).Cells(i, 9).Value
hodnota_zasilky = sesit.Sheets(list).Cells(i, 4).Value
id_zasilkovny = sesit.Sheets(list).Cells(i, 6).Value
obchod = "Stěstíčko"

txt = txt & co & "," & jmeno & "," & prijmeni & "," & firma & "," & email & "," & telefon & "," & dobirka & "," & hodnota_zasilky & "," & id_zasilkovny & "," & obchod & vbCrLf
Next i

Soub = "C:\Documents and Settings\Max\Plocha\export\sesit1.csv"
  Set fs = CreateObject("Scripting.FileSystemObject")
  Set f = fs.CreateTextFile(Soub, True, TristateFalse)
  f.Write txt
  f.Close
sesit.Close

End Sub

--------------------------

ještě jsem si na Vašich datech všiml, že adresy obsahují čárku jako oddělovač, např. "Argo, a. s.". Bylo by tedy vhodné použít jiný typ  oddělovače pro csv nebo textové řetězce, které by mohly obsahovat čárku, uzavřít do uvozovek (podle toho, co zvládne ten import do zásilkovny).

Editoval kabi (5. 6. 2017 17:03:11)

Offline

#14 6. 6. 2017 07:30:31

max2005
Člen
Registrace: 1. 6. 2017
Příspěvků: 28

Re: Makro v calc nové makro

Pro neutr návod na vzor sešitu ze zásilkovnyje tam ke stažení i vzorový soubor,

možná sem pak někde udělal chybu, ale pochopil sem to tak že data mají začínat v A3 a v A1 má být napsáno verze 2 to ovšem pak následně nefungovalo a zásilkovna psala že buňka A1 musí být prázdná, když sem to pak smazal vytvořilo to v iportu zásilek 2 prázdné zásilky - posunul sem tedy obsah nahoru o 2 řádky tedy do B1 a ejhle vše fungovalo. Pohoda to vyexportuje i s hlavičkou ta se do exportu však neimportuje. Z toho VF_1 se tedy iportují již jen data a opět pokud sem to pochopil správně mají být odděleny čárkou proto ta čárka mezi hodnotama. A to funguje to sem ověřil. Tedy za předpokladu že prázdné hodnoty jsou nahrazeny " " jako je například ona hodnota dobírky v případě že je placeno příkazem. Díky za soubor mrknu na to zatím diky moc všem.

Offline

#15 6. 6. 2017 09:44:42

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Makro v calc nové makro

Ano to pomohlo. Je tam detailní popis a je tam i příklad ke stažení i když je tam něco maličko nesrozumitelné. Soubor má 16 sloupců. V prvním a druhém řádku nic není (musí se vytvořit pomocí separátorů) jenom v 1. buňce prvního řádku je název "verze 2".
     Celkem nesprávně je tam uveden popis kolonek u adres ale to se ověří až po odeslání. Naproti Vašemu původnímu popisu je tam více sloupců - což se dalo dovodit. Jde o adresu příjemce.


     Takže nejprve udělám vše tak jak je požadováno. To jest mělo by to obsahovat kontrolu na počet znaků v jednotlivě určených kolonkách a nakonec se provede kontrola pomocí Trim aby v textu nebyly bílé znaky.
     Následně navrhnu přepis adres z databáze kterou udělám na 2. listu podle svého. Dále na prvním listu budeme používat zápis adresy zdrojového souboru (uděláte ho pomocí hyperlinku).
     Makro se spustí z hlavní nabídky, načte podle buňky v 1. listu adresu zdroje, vygeneruje se csv a doplní se adresy příjemců z databáze (může to být také externí zdroj..). To můžeme vložit pro kontrolu do 3. listu nebo hned vytvořit csv do adresáře který obsahuje zdroj. Samozřejmě se také uloží do adresáře který budete muset zadat, což se dá udělat také hyperlinkem. Tedy vše by mělo být na jedno kliknutí.
     Nejprve tedy udělám vše tak aby se vytvořil správně výpis. Ten se bude ukládat pro kontrolu do 3. listu. Pokud budete chtít, můžeme pro kontrolu uložit například kopii výstupu ke zdroji nebo jinam. Otázkou jsou názvy výstupů. Ani ten manuál neuvádí jak má být csv pojmenován. Má to být číslo objednávky nebo něco jiného?


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#16 6. 6. 2017 16:22:03

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Makro v calc nové makro

Podívejte se prosím Vás na tohle. Některé věci neumím správně odhadnout. Porovnání vstupů s výstupem


     Zřejmě budete muset nejprve udělat úpravy podle Vašich možností.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#17 6. 6. 2017 23:27:40

max2005
Člen
Registrace: 1. 6. 2017
Příspěvků: 28

Re: Makro v calc nové makro

Tak vytvořil jsem nový export z pohody v našem případě to musí být vydané faktury z mnoha ruzných důvodů, ale to je jedno duležité však je že zkoušením a vypnutím či zapnutím slopcu určených k exportu se náhle změnilo pořadí sloupců, Ale opakovaným zkoušením (bohužel mi doma kde to zkouším na zkušební verzi zbývají už jen 2 pokusy) toto pořadí již se ustálilo. Otázka je co to udělá až to pak nastavím v práci. Ale to bych snad už dokázal opravit. Nově vytvořený export s názvem FV_5 jsem doplnil o listy který znázorňují jednotlivé pokusi importu do zasilkovny, kdy jsem zjistil, že jejich popis není zcela přesný a funguje to i bez verze 2 a prvních 2 prázdných řádků. Je zde i přidán číselník pro vyhodnocení cílové pobočky a taktež list z cvs-ukázky od neutra s okomentovanými sloupci, taktež je na tomto listě poslední ukazka exportu z pohody.

Pro import do zasilkovny mi stačí 2-11 sloupec kdy 11 sloupec je stesticko zbylích 10 se tahá z pohody tedy přes onen soubor VF..

Co se týče názvu pro zásilkovnu je to šumák sežere to cokoli. Co se týče kontroli znaků a podobně je to zbytečné v případě že se zasilkovně případná hodnota nebude líbit naimportuje jí to a hodnotu označí červeně a dokud to neopravím nepustí mě to dál. Opravit to však v zásilkovně je to asi jednodušší než složitě programovat makro. Dále sem si ověřil, že bílé znaky jsou mu taktéž šumák prostě je ignoruje takže opět zbytečné smile Přiznám se že jsem moc nepochopil onen přepis adres do druhého listu?

Databázi si nijak vytvařet nemusím všachny údaje mám v pohodě a kdykoli je zpětně vyexportovat a mám za to že cvs soubor tvořený makrem stejně více listu mít nemůže.

Teď k oběma z Vás díky za kody následný kod sem zkopíroval a okomentoval jak chápu co to dělá, a dělám to proto že bych se Vás chtěl zeptat v kterém okamžiku makro vloží vygenerovanou hodnotu do nového sešitu. To mi totiž stále uniká a protože se mi nedaří to korkování tak musím takto:)

Option VBASupport 1
Sub Main

Dim i, pocetradku  'definuje že existují hodnoty i a pocetradku
Dim txt, Soub, Soub2 As String 'definuje že tyto hodnoty jsou textové řetezce
Dim fs, f As Object ' že jsou to nějaké objekty - nechápu
Dim sesit as WorkBook ' že sešit je vlastně workbook
Dim list as String ' že list je textový řetezec

set sesit = Workbooks.Open("C:\Documents and Settings\Max\Plocha\export\VF_1.xls") ' nastaví že sesit je soubor VF_1
list = "VF_1" ' nastaví že list má název VF_1
pocetradku = sesit.Sheets(list).cells(2).currentregion.rows.count ' zpočítá počet řádků na listu s nastaveným názvem v předchozím kroku
txt="" ' nastaví txt na prázdnou hodnotu
radek = 2 'nastaví radek na hodnotu 2

For i = radek To pocetradku ' spostí cyklus opakování od 2 do spočtené hodnoty početradku

co = sesit.Sheets(list).Cells(i, 10).Value nastavý hodnotu z buňky v řádku 2 a následné 3 .. až do počtu řádku a to samé následující hodnoty
jmeno = sesit.Sheets(list).Cells(i, 2).Value
prijmeni = sesit.Sheets(list).Cells(i, 3).Value
firma = sesit.Sheets(list).Cells(i, 1).Value
email = sesit.Sheets(list).Cells(i, 11).Value
telefon = sesit.Sheets(list).Cells(i, 12).Value
dobirka = sesit.Sheets(list).Cells(i, 9).Value
hodnota_zasilky = sesit.Sheets(list).Cells(i, 4).Value
id_zasilkovny = sesit.Sheets(list).Cells(i, 6).Value
obchod = "Stěstíčko" 'nastaví obchod na Stesticko

txt = txt & co & "," & jmeno & "," & prijmeni & "," & firma & "," & email & "," & telefon & "," & dobirka & "," & hodnota_zasilky & "," & id_zasilkovny & "," & obchod & vbCrLf ' vytvoří z výše nastavených hodnot jednu s názvem txt - jen nevím proč je za rovnítkemto první txt
Next i 'skočí na další opakování ciklu

Soub = "C:\Documents and Settings\Max\Plocha\export\sesit1.csv" 'vytvoří soubor sesit1.cvs?
  Set fs = CreateObject("Scripting.FileSystemObject") 'netuším
  Set f = fs.CreateTextFile(Soub, True, TristateFalse) ' netuším
  f.Write txt ' netuším že by hodnota f byla zapsána do hodnoty txt, ale f je vlastně najký objekt?
  f.Close ' objekt f se zavře, ale netuším jaký objekt
sesit.Close 'soubor vf_1 se zavře

End Sub

Díky všem za pomoc a rady Max

P.S. přiznám se že jsem teprve teď našel ono makro HopDoKodu z návodu jsem nepochopil kde ho mám spustit a teprve teď se mi ho povedlo najít  mezy makry takže prozkoumám příště díky

Editoval max2005 (6. 6. 2017 23:36:08)

Offline

#18 7. 6. 2017 09:09:34

kabi
Člen
Registrace: 1. 6. 2017
Příspěvků: 167

Re: Makro v calc nové makro

Vaše původní makro funguje tak, že zpracovává v cyklu jednotlivé řádky ze zdrojového souboru a v rámci cyklu se přepíná do druhého sešitu, kam vkládá ta data ze zpracovávaného řádku v požadovaném pořadí pro csv soubor. To zajišťují příkazy Windows("sesit1.csv").Activate a Windows("VF_1.xls").Activate.
Já v makru pracuji pouze ve zdrojovém souboru, kdy v cyklu pouze přidávám data do textové proměnné txt (proto to první txt při vytváření - příp. si ho zkuste odmazat, ať vidíte, co to udělá) a po ukončení cyklu přímo vytvářím csv soubor. Tedy nepřepínám se do jiného sešitu.
Nevím, jak jtse zběhlý v krokování, pro získání hodnot je v OO/LO potřeba použít Kukátko.

Offline

#19 7. 6. 2017 10:15:59

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Makro v calc nové makro

Tento postup asi autor opustil, nebo opustí. Právě chtěl sledovat to "hop sem" a "hop tam" ze sešitu na sešit jen proto aby doladil co se kam načítá. Nyní to vypadá že umí přizpůsobit výstup z programu Pohoda tak aby sloupce VF_1 byly ve správném pořadí pro Zásilkovnu.
    Takže může udělat přesně to, že vygeneruje hned soubor bez skákání které chtěl ladit bez krokování. Pak už krokování zřejmě opustí. Ono se dá ladit respektive krokovat různě. Já nejraději pomocí PRINT které postavím místo záložek (napíšu do nich text kolikátý je to krok a podobně). Je to při zápisu rychlejší a mohu takových kontrolních bodů udělat mnoho desítek za sebou. Horší je to když doladím a chci je smazat - ale i to umím rychle.


Pro autora jsem udělal popis aby se lépe oriantoval. Snad mu to pomůže PopisMakraMain TXT nebo přímo basic který načte do souboru PopisMakraMain BAS


     Já sice s VB nepracuji, ale dělal jsem něco málo kdysi v Corelu. Oni to jsou celkem dost příbuzné jazyky, takže se dá celkem dobře orientovat.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#20 7. 6. 2017 18:59:54

kabi
Člen
Registrace: 1. 6. 2017
Příspěvků: 167

Re: Makro v calc nové makro

neutr vám to docela popsal, přidávám dovysvětlení a pár úprav, abyste viděl, co se s tím příp. musí ještě udělat dále. Nevím, jestli zasíláte na Slovensko, musel byste řešit zemi a podle toho exportovat částku v Kč nebo v EUR. V těch adresách mohou být čárky, tedy je nutné změnit oddělovač (nastavil jsem středník) nebo tyto proměnné "obalit" apostrofem (je ukázáno u proměnné adresa). Na ukázku tam máte to omezení počtu znaků na 32 v proměnné přijmení a nějaké zaokrouhlení (je požadováno např. u dobírky). V telefonním čísle jsou odstraněny mezery mezi čísly, bylo by asi potřeba doplnit na začátek řetězec "+420", ale to se dá doplnit určitě i v Pohodě. Jinak by se muselo testovat, kde je a kde není a podle toho doplnit. Přejmenoval jsem také některé proměnné, lépe z toho pochopíte to vytvoření textového (csv) souboru.


Option VBASupport 1
Sub Main

Dim i, pocetradku
Dim txt, csv_url As String
Dim fs, csv_file As Object
Dim sesit as WorkBook
Dim list as String

set sesit = Workbooks.Open("C:\Documents and Settings\Max\Plocha\export\VF_1.xls")
list = "VF_1"
pocetradku = sesit.Sheets(list).cells(2,1).currentregion.rows.count 'zjišťuje počet řádků v souvislém bloku, kde je nastavena buňka
txt="verze 2" & vbCrLf & vbCrLf 'vkládá text "verze 2" a prázdný řádek
sep=";" 'lze nastavit jakýkoliv oddělovač (pro csv soubor má smysl čárka, středník, tab). Z důvodu čárek v adresách jsem zvolil středník

For i = 2 To pocetradku

co=sesit.Sheets(list).Cells(i, 10).Value
jmeno = sesit.Sheets(list).Cells(i, 2).Value
prijmeni = mid(sesit.Sheets(list).Cells(i, 3).Value,1,32) 'zpracuje prvních 32 znaků z obsahu buňky
firma = sesit.Sheets(list).Cells(i, 1).Value
email = sesit.Sheets(list).Cells(i, 11).Value
telefon = replace(sesit.Sheets(list).Cells(i, 12).Value," ","")  'odstranění mezer v telefonním čísle
pom_zpusobuhrady = sesit.Sheets(list).Cells(i, 9).Value 'pomocná proměnná pro zjištění formy úhrady
hodnota_zasilky = round(sesit.Sheets(list).Cells(i, 4).Value,2) 'zaokrouhlení na 2 desetinná místa
select case mid(pom_zpusobuhrady,1,1) 'naplnění proměnné dobírka podle prvního znaku z pom_zpusobuhrady
  case is ="p"
   dobirka=""
  case is ="d"
   dobirka=round(hodnota_zasilky,0)
  case else
   dobirka="neznama uhrada"
end select
id_zasilkovny = sesit.Sheets(list).Cells(i, 6).Value 'nevím odkud zjistíte (máte z Pohody ID odpovídající číselníku?)
obchod = "Stěstíčko"
' při vytváření proměnné txt jsem přidal prázdnou první buňku a pro ukázku dávám údaj firma do uvozovek
txt = txt & sep & co & sep & jmeno & sep & prijmeni & sep & """" & firma & """" & sep & email & sep & telefon & sep & dobirka & sep & hodnota_zasilky & sep & id_zasilkovny & sep & obchod & vbCrLf
Next i
'----------- tato část makra nastaví cestu, vytvoří na dané cestě textový soubor a zapíše do něho obsah proměnné txt
csv_url = "C:\Documents and Settings\Max\Plocha\export\sesit1.csv"
  Set fs = CreateObject("Scripting.FileSystemObject")
  Set csv_file = fs.CreateTextFile(csv_url, True, False)
  csv_file.Write txt
csv_file.Close
'----------- 
sesit.Close 'pouze zavře sesit (VF_1.xls)

End Sub

Offline

#21 7. 6. 2017 19:52:06

max2005
Člen
Registrace: 1. 6. 2017
Příspěvků: 28

Re: Makro v calc nové makro

kabi napsal(a)

Vaše původní makro funguje tak, že zpracovává v cyklu jednotlivé řádky ze zdrojového souboru a v rámci cyklu se přepíná do druhého sešitu, kam vkládá ta data ze zpracovávaného řádku v požadovaném pořadí pro csv soubor. To zajišťují příkazy Windows("sesit1.csv").Activate a Windows("VF_1.xls").Activate.
Já v makru pracuji pouze ve zdrojovém souboru, kdy v cyklu pouze přidávám data do textové proměnné txt (proto to první txt při vytváření - příp. si ho zkuste odmazat, ať vidíte, co to udělá) a po ukončení cyklu přímo vytvářím csv soubor. Tedy nepřepínám se do jiného sešitu.
Nevím, jak jtse zběhlý v krokování, pro získání hodnot je v OO/LO potřeba použít Kukátko.

Ano to je pravda ve VBA pracuji přesně takto hop sem hop tam pravda lepe to neumím i když sem to chtěl řešit podobně jako v calcu, že se každý řádek načte do nějaké hodnoty, ale neumím to aby se mi to v každem ciklu zase nepřemázlo.

Možná právě proto nechápu co se děje s vaší hodnotou TXT chápu že cyklu se do proměné txt přidává hodnota, ale pak se v dalším cyklu zase přepíše nově načtenou hodnotou ne?

Max

Offline

#22 7. 6. 2017 20:33:14

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Makro v calc nové makro

ne : txt = txt & další. Tím se udělá navázání na původní obsah. Je tam jen jeden trik. Posledním znakem řádku je & vbCrLf  - což je zalomení na další řádek. Tím se vytváří nový řádek "jakoby tabulky" textu.
     Já jsem to řešil skutečnou tabulkou které se říká array. Tím jsem mohl načíst zdroj a vynechat "buňky" které bych dohledával následně z jiného zdroje podle jména. To obnáší nejprve vytvoření celé tabulky (dvojrozměrná array) - tím získá rozměry X*Y plus údaje z "VF_1" (Cyklus Do .. Loop pro řádky, a v něm zapuštěný cyklus For ..Next pro sloupce). Následně se znovu aktualizovala tato array nad adresářem (pomocí vnořených cyků For i = ... For j = .... ,kód hledání IF , kód zápisu, Next j .. Next i).
     Tento druhý systém není potřeba pokud umíte vstup VF_1 udělat (vyexportovat) tak jak potřebuje Zásilkovna.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#23 7. 6. 2017 21:12:00

max2005
Člen
Registrace: 1. 6. 2017
Příspěvků: 28

Re: Makro v calc nové makro

neutr napsal(a)

Tento postup asi autor opustil, nebo opustí. Právě chtěl sledovat to "hop sem" a "hop tam" ze sešitu na sešit jen proto aby doladil co se kam načítá. Nyní to vypadá že umí přizpůsobit výstup z programu Pohoda tak aby sloupce VF_1 byly ve správném pořadí pro Zásilkovnu.
    Takže může udělat přesně to, že vygeneruje hned soubor bez skákání které chtěl ladit bez krokování. Pak už krokování zřejmě opustí. Ono se dá ladit respektive krokovat různě. Já nejraději pomocí PRINT které postavím místo záložek (napíšu do nich text kolikátý je to krok a podobně). Je to při zápisu rychlejší a mohu takových kontrolních bodů udělat mnoho desítek za sebou. Horší je to když doladím a chci je smazat - ale i to umím rychle.


Pro autora jsem udělal popis aby se lépe oriantoval. Snad mu to pomůže PopisMakraMain TXT nebo přímo basic který načte do souboru PopisMakraMain BAS


     Já sice s VB nepracuji, ale dělal jsem něco málo kdysi v Corelu. Oni to jsou celkem dost příbuzné jazyky, takže se dá celkem dobře orientovat.


Tak s tím VF se to má tak přivedl jste mě na myšlenku změny sloupcu provedl sem pár úprav a výsledný soubor nakonec odpovídá vstupu pro zásilkovnu jen tam chybý štěstíčko ale to už je detail.Nicméně Si budu muset zvykat na jiné rozmístění sloupcu v pohodě a to zase nevím jestli projde v práci smile
Ale ještě to prozkoumám doma mám už smulu ve zkušební verzy jsem již vyčerpal počet pokusů pro export takže už budu testovat jen v práci sad

Max

Offline

#24 7. 6. 2017 21:49:29

max2005
Člen
Registrace: 1. 6. 2017
Příspěvků: 28

Re: Makro v calc nové makro

neutr napsal(a)

ne : txt = txt & další. Tím se udělá navázání na původní obsah. Je tam jen jeden trik. Posledním znakem řádku je & vbCrLf  - což je zalomení na další řádek. Tím se vytváří nový řádek "jakoby tabulky" textu.
     Já jsem to řešil skutečnou tabulkou které se říká array. Tím jsem mohl načíst zdroj a vynechat "buňky" které bych dohledával následně z jiného zdroje podle jména. To obnáší nejprve vytvoření celé tabulky (dvojrozměrná array) - tím získá rozměry X*Y plus údaje z "VF_1" (Cyklus Do .. Loop pro řádky, a v něm zapuštěný cyklus For ..Next pro sloupce). Následně se znovu aktualizovala tato array nad adresářem (pomocí vnořených cyků For i = ... For j = .... ,kód hledání IF , kód zápisu, Next j .. Next i).
     Tento druhý systém není potřeba pokud umíte vstup VF_1 udělat (vyexportovat) tak jak potřebuje Zásilkovna.

Aha takže pokud txt = a
jmeno = b
prijmeni = c tak txt=txt & jmeno & prijemní & vbCrLf bude abc↵
další krok už to bude v případě stejných hodnot abcbc↵
a další abcbcbc↵ .......

jen dotaz to skutečně posléze vloží prazdný řádek tebo to bere jen jako tvrdé zalomení ro si musím ověřit.
Ale díky uý sem pochopil princip toho vkládání.
Max

Offline

#25 8. 6. 2017 06:26:14

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Makro v calc nové makro

Je to skutečně zalomení řádku. Představte si text, který je v kódu jedním dlouhým řádkem. Klasické editory jako NotePad Word, nebo náš Writer takovou řádku zalomí podle velikosti písma a stránky. Tím vzniknou odstavce s určitým počtem řádků. Když změníte písmo nebo šířku stránky tak se to většinou samo automaticky přeformuje na menší počet řádků. To dělají editory automaticky. Je to prostředí uživatele. My se ale zabýváme prostředím pro programování které musíte pochopit ve smyslu rozdílného vyjádření ve značkách tak aby uživatel na výstupu viděl pohodlně například tabulku nebo odstavec s tabelátorm na začátku.
     Když ale potřebujete tabulku místo běžného odstavce tak je to jinak. Musíte vložit znaky které editoru oznámí, že jde o řádek, sloupec, nebo odstavec. Pro klasický text a csv je to syntakticky rozdílné i když věcně podobné.


     Pro běžný text platí CHR(10) = nový řádek - tedy zalomení, CHR(13) = nový odstavec, a CHR(9) je odsazení na začátku řádku - tedy tabelátor. Takže pokud použijete 1x CHR(10) zalomí se text na nový řádek, když použijete 2x CHR(10) vložíte prázdný řádek a tak dál - ale přes to jde o stejný odstavec. Používají se takzvané "bílé znaky" které nejsou normálně vidět takže se musí zapisovat jako kódová zkratka. Například ve StBasic CHR(číslo).


     [Poznámka : VB užívá výraz vbCrLf což je vlastně upravený název z ASCII viz Tabulka ASCII kde najdete všechna čísla a "popis znaků".
     Podívejte se do prvního sloupce - je tam nadpis "Dec" = decimální číslo a tam najděte položku 9, 10, a 13. Červeně je sloupec Char a tam najdete že:
CR = cariage return tedy návrat vozíku česky a ve StBasic CHR(13).
     Dále položku 10 což je CHAR s názvem
LF "line feed, nebo new line" tedy česky buď obsah řádku nebo také nový řádek.
     Potom zkratka vb+CR+LF znamená VisualBasc (vb) + CHR(13) + CHR(10).


     Ze tří znaků lze udělat 3^2 = 9 variací dvojic + 3! = (faktorial čísla 3) tedy 6 různých trojic. Celkem tedy 3 jednotlivé znaky, 9 dvojic a 6 trojic. Kombinatorické množiny dohromady 18 různých významů. Pokud vím tak se dají použít ještě jiné bílé znaky ale z těchto se většinou skládají formátovací značky. Bohužel asi různě v různých editorech.]


     Pro CSV (Coma Separed Value = česky čárkou oddělené hodnoty) se používá pojem "separátor" tedy oddělovač který na rozdíl od běžného textu je často také viditelným znakem. Nejčastěji je používána čárka nebo středník, mezera a mnoho jiných znaků které lze také určit.
     Platí to pro sloupce. Jde tam o to aby bylo v zdrojovém textu vidět kde je rozhraní sloupců. CSV je proto normalizováno nejméně pro kódové stránky které užívají HTML, XML a podobně (UTF-8, Win 1250, a další). Pro řádky se to už nedělá protože je vidět kde je nový řádek i když vlastní znak vidět není. To ale neznamená že norma neobsahuje také viditelné znaky pro nový řádek (to nevím jistě).
     U CSV jde o "Tabulku". Takže nepotřebuje pro vlastní konstrukci nic jiného nežli sloupce a řádky. Normy ale určují co může být v jednotlivých buňkách pokud se to používá například pro XML.


     Takže na závěr : Zde vytváříme nejprve text s čárkami a nakonec ho prohlásíme za CSV. Tím pádem je dáno určit kódování (tz kódovaný text což není šifra.-), a separátory. Logicky potom musíme prázdné buňky vypsat jako "". Tedy mezi čárkami """". Separátor se zapisoje mezi uvozovkami ",". Takže 1 buňka s obsahem například Praha vypadá takto : "," "Praha" ",". Když bychom to udělali selským rozumem ", Praha , " máme smůlu je to chyba. Vypíše se , Praha , tedy text mezi dvěma čárkami.
     Nejlépe to pochopíme při práci v okně Basicu. Tam je často potřeba například """" - ve finále jsou to jen jedny uvozovky na výstupu. Tam také pochopíme na co se používá & a podobně.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

Zápatí