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

#1 1. 7. 2018 07:52:45

sansan
Člen
Registrace: 1. 7. 2018
Příspěvků: 7

vložiť riadok pod podmienkou - VYŘEŠENO

Prichadzam na toto forum, neviem si rady s pochopenim celeho rozsahu programovania makier,viem už robit jednoduche ukony, ale ak by mi niekto pomohol s týmto problemom, isto by som sa posunul s programovanim dalej.Problem vyzera byt jednoducho riesitelny...pre skusenejsieho makrára.
Mam takyto problem:
mam automaticky vygenerovanú tabulku, ktora moze mat rozny počet riadkov, ale presne stanoveny počet stlpcov (táto tabulka má 4 stĺpce: 1.výrobné číslo,2.počet,3.popis,4.dĺžka prvku, popisy stĺpcov sa v nej nenachadzaju, pridal som ich iba pre toto forum)
výr.č.    pocet    popis       dlzka

        C24, 60 x 200   
C1246    1x    krokva      1815
C1249    3x    trám        2874
        C24, 95 x 45   
C1242    1x    krokva      2874
C1243    1x    krokva      234
C1252    2x    krokva      426
C1254    2x    krokva      1930
        C24, 60 x 240   
C1095    1x    priečka     1815
C1098    1x    priečka     1815

Treba vlozit prázdny riadok.
Koli prehladnosti je poziadavka, nad každý nápis oddeľovací riadok C24,... s rozmerom použitého hranola,a je v riadku samostatne (nachádza sa v 3-tom stĺpci).

Skusim definovať, o čo by sa asi dalo opierat pri programovani makra
-Vyhľadať riadok s C24,(pridal som do pomocného stlpca vzorec =LENB(CONCATENATE(A2;B2;C2;D2)), ktorý mi vypočíta dĺžku textového retazca, a podľa tejto dĺžky program ľahko rozozná že pri výsledku 10 až 14 sa treba pristaviť, a pridať riadok. A pri výsledku rovná sa 15 a viac, sa nebude diať nič. Navyše, je potom treba aby sa na konci tabulky makro zastavilo, teda pri výsledku 0.

Tabulka na konci bude vyzerat takto:

        C24, 60 x 200   
C1246    1x    krokva      1815
C1249    3x    trám        2874


        C24, 95 x 45   
C1242    1x    krokva      2874
C1243    1x    krokva      234
C1252    2x    krokva      426
C1254    2x    krokva      1930


        C24, 60 x 240   
C1095    1x    priečka     1815
C1098    1x    priečka     1815

Editoval sansan (2. 7. 2018 05:05:14)

Offline

#2 1. 7. 2018 09:05:47

LADER
Člen
Registrace: 3. 4. 2013
Příspěvků: 145

Re: vložiť riadok pod podmienkou - VYŘEŠENO

Zdravím,

Sub Oddelit
	Dim oDoc As Object
	Dim oSheet As Object
	Dim Sloupec,Radek,X,Prazdno
		
	oDoc = ThisComponent
	oSheet = oDoc.getCurrentController().ActiveSheet 
	
	Prazdno = 0
	
	For Radek = 2 To 999 ' Maximální počet řádků, které se budou kontrolovat
	
		X = ""
		For Sloupec = 0 To 3 ' Prohlížíme pouze sloupce 0 až 3
			X = X & oSheet.getCellByPosition(Sloupec,Radek).string		
		Next 		
				
		Select Case Len(X)
		Case 0 ' Prázdný řádek 
			Prazdno = Prazdno + 1
			If Prazdno > 1 Then 'Ukončení hledání
				Exit For
			End If
		Case <15 'Nadpis - odlišení od ostatních řádků, před něj se vloží prázdný řádek
			If Prazdno = 0 Then
				oSheet.Rows.insertByIndex(Radek,1)				
				Radek = Radek + 2
				Prazdno = 1
			End If
		Case Else
			Prazdno = 0			
		End Select				
	Next 	
End Sub

Ubuntu 22.04.4 LTS, LibreOffice Verze: 7.6.6.3, wxMaxima 20.12.1, Maxima 5.47.0 (SBCL)

Offline

#3 1. 7. 2018 12:53:45

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

Re: vložiť riadok pod podmienkou - VYŘEŠENO

a pro inspiraci jiná možnost. Makro má na prvním řádku text 'Option VBASupport 1', protože je psané ve vba.

Option VBASupport 1
Sub Vloz_Prazdny_Radek

Dim pocetradku, i
     pocetradku = ActiveSheet.Range("C1").currentregion.rows.count   'zjistí počet souvislých řádků ve sloupci C 
for i = 2 to pocetradku   '2 - pokud chcete mezeru i před první popis, jinak lze zada hodnotu 3
 if LEFT(RANGE("C" & i).Value,3) = "C24" then   'řadek s popisem podle prvních 3 znaků ve sloupci C
     Range("A" & i).Activate
     Selection.EntireRow.Insert 
     i = i + 1
     pocetradku = pocetradku + 1
 end if
next	
End Sub

Editoval kabi (1. 7. 2018 12:56:13)

Offline

#4 1. 7. 2018 12:56:35

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

Re: vložiť riadok pod podmienkou - VYŘEŠENO

Co třeba takhle :

Sub Testuj
Dim Doc, Sheet, Cell1, Cell2 As Object
Dim iEnd as long
Doc = ThisComponent
iEnd = GetLastRow  
Sheet = Doc.Sheets(0)								 'číslo listu 0 = první list
For i = iEnd To 1 Step - 1
Cell1 = Sheet. getCellByPosition (2, i)				 'start ve 3. sloupci (C), 1. řádek
Cell2 = Sheet. getCellByPosition (2, i-1)
IF LEN(Cell1.string) >= 10 AND LEN(Cell1.string) < 15 AND Cell2.string <> "" Then
oRows = Sheet.getRows() 
oRows.insertByIndex(i,1)
End If
next i
End Sub

Function GetLastRow 
oSheet = ThisComponent.getSheets().getByIndex(0)	 'číslo listu 0 = první list
oTargetCell = oSheet.getCellByPosition(2, 0) 		 'start ve 3. sloupci (C)
If IsNull(oTargetCell) then
GetLastRow =oTargetCell.getRangeAddress.EndRow
Else 
oCursor = oSheet.createCursorByRange(oTargetCell) 
oCursor.gotoEnd 
GetLastRow = oCursor.getRangeAddress.EndRow
End if 
End Function

    Je to postaveno pro první list. Také by šlo daklarovat "ActiveSheet" jak uvádí LADER ale musela by se přepsat i funkce která testuje poslední řádek.
    Vtip je v tom, že když se iteruje od konce tak se nemůže stát banální chyba která spočívá v postupném posouvání posledního řádku. Když není nastaveno dost zbytečných řádků tak nemusí makro dojet na skutečný konec. Když přidá programátor dost řádků tak se iteruje dost zbytečných operací navíc.
    V tomto případě je tedy úplně jedno kolik řádků je v sešitě a vždy to dopadne dobře. Samozřejmě předpokladem je že testujeme ve sloupci C a v prvním listu. To se dá ale snadno přepsat. Ještě malé upozornění - makro musí být v aktivním sešitě. takže ne abysto to vložil do MojeMakraStandard nad všemi dokumenty (muselo by se to předeklarovat).


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

#5 2. 7. 2018 04:59:46

sansan
Člen
Registrace: 1. 7. 2018
Příspěvků: 7

Re: vložiť riadok pod podmienkou - VYŘEŠENO

všetky makra, ktore zaslali LADER,kabi,neutr, funguju bezvadne.


kabi využil v popise nápis C24...a čo som zabudol pripísať, je, že tento nápis znamená typ materiálu, ktorý sa môže meniť, napr.najčastejšie na KVH, potom by stačilo doplniť do makra ešte dalšie možnosti vo vyhľadávaní.

Dakujem Vam všetkým, aj za rýchlosť, akou som odpovede dostal. Vidim že na taketo vzorce by som tak skoro neprišiel, teraz ma ich analýza posunie zase o niečo vpred ako aj editácie makier všeobecne.

Este raz super dik

sansan

Offline

#6 2. 7. 2018 06:36:16

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

Re: vložiť riadok pod podmienkou - VYŘEŠENO

Ono by to šlo asi ještě mnoha jinými způsoby. U kabiho by stačilo sice přidat podmínky, ale také odkázat na pomocný sloupec kde by byly všechny různé výrazy uvedeny. Šlo by například dotazovat prázdné buňky ve sloupcích A, B a neprázdná buňka C.
     Lze to udělat snadno i vzorcem, nebo i toto řešení vzorcem zpracovat jako makro. Já vidím slabinu v tom dotazovaném počtu znaků 10-14. Stačí málo a nebude to fungovat. V každém případě asi musíte vždy zajet na konec sloupců a výsledek prohlédnout.


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. 7. 2018 13:46:58

sansan
Člen
Registrace: 1. 7. 2018
Příspěvků: 7

Re: vložiť riadok pod podmienkou - VYŘEŠENO

Ano, vsimol som si práve, že s počtom znakov, ze by mohol byt problem, keby popis prvku bol velmi krátky, už by počet písmen nezodpovedal žiadanému cieľu. a tak isto keby namiesto C24 bol kód materiaĺu dlhší.
Neviem presne či je dôležité pre program, aby makro rozoznalo aj koniec tabulky...

Offline

#8 3. 7. 2018 06:44:36

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

Re: vložiť riadok pod podmienkou - VYŘEŠENO

To jsou dva různé problémy.
A. - problém názvu.
B. - Testování konce tabulky.


A. - Název tak jak je nyní dán ve sloupci C je bez problému pokud je význačný tím, že ostatní buňky ve sloupcích A a B něco mají. Název v buňkách sloupců A,B nic nemá a sám je v buňkách sloupce C. Pokud to tak zůstane, je detekce názvu snadná.


B. - Testování konce je z jiného důvodu celkem velice potřebné. Představte si, že máte 100 řádků a máte přidat za každé 4 řádky jeden další. Znamená to, že na začátku je sto řádků a na konci 125. Když postavíme špatně makro se startem na prvním řádku a koncem cyklu 100 tak na konec nedojede. Když dáme dost řádků navíc musíme konec přejet a raději s větší rezervou.
     Když se postaví makro opravdu špatně, tak najde jen první případ čtvrtého řádku a vysází 99 prázdných řádků za sebou. Následuje 96 řádků v původní konstalaci. Takže když se objeví chyba v některém z maker které startují od začátku, najde se chyba na konci.
     Problém je s chybou, kterou nelze najít dotazem - například kratší název. To se nepozná ani na konci a nelze ani predikovat počet řádků protože ten se mění podle potřeby.


     Právě proto je celkem důležité aby byl název (hledaný výraz) dán jinak nežli počtem znaků. Ovšem když zadáte tak jak jste to udělal Vy, řešitel nemá moc na výběr. Faktem je že zde by stačilo testovat zda je buňka ve sloupcích A(x) + B(x) prázdná, ve sloupci C(x) neprázdná a předchozí buňka v C(x-1) neprázdná.


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

#9 3. 7. 2018 06:48:02

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

Re: vložiť riadok pod podmienkou - VYŘEŠENO

Tahle verze už odpovídá představě správné detekce lépe nežli ostatní makra s dotazem na obsah nebo počet znaků.

Sub Testuj
Dim Doc, Sheet, Cell1, Cell2, Cell3, Cell4 As Object
Dim iEnd as long
Doc = ThisComponent
iEnd = GetLastRow  
Sheet = Doc.Sheets(0)								 'číslo listu 0 = první list
For i = iEnd To 1 Step - 1
Cell1 = Sheet. getCellByPosition (0, i)				 'start ve 3. sloupci (C), 1. řádek
Cell2 = Sheet. getCellByPosition (1, i)
Cell3 = Sheet. getCellByPosition (2, i)
Cell4 = Sheet. getCellByPosition (2, i-1)
IF Cell1.string = "" AND Cell2.string = "" AND Cell3.string <> "" AND Cell4.string <> "" Then
oRows = Sheet.getRows() 
oRows.insertByIndex(i,1)
End If
next i
End Sub

Function GetLastRow 
oSheet = ThisComponent.getSheets().getByIndex(0)	 'číslo listu 0 = první list
oTargetCell = oSheet.getCellByPosition(2, 0) 		 'start ve 3. sloupci (C)
If IsNull(oTargetCell) then
GetLastRow =oTargetCell.getRangeAddress.EndRow
Else 
oCursor = oSheet.createCursorByRange(oTargetCell) 
oCursor.gotoEnd 
GetLastRow = oCursor.getRangeAddress.EndRow
End if 
End Function

Editoval neutr (3. 7. 2018 08:00:45)


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 3. 7. 2018 19:36:09

sansan
Člen
Registrace: 1. 7. 2018
Příspěvků: 7

Re: vložiť riadok pod podmienkou - VYŘEŠENO

Funguje, to fajnovo, len som musel premenovat Function GetLastRow2.

Offline

Zápatí