Keresés

Részletes keresés

Karnaval Creative Commons License 2011.03.06 0 0 14278

(Elnézést az elgépelésekért)

Előzmény: Karnaval (14277)
Karnaval Creative Commons License 2011.03.06 0 0 14277

Sziasztok!

 

Egy olyan dolgot kellene holnapra meggyinálnom, ami szerintem pofonegyszerű, csak nekem nincs meg a rutinom.

 

Van egy terméksor, bizonyos időközönként árazva, a sorok végén eg oszlopban pl =E6+G6+I6+K6+O6+Q6+S6+U6+W6+Y6 ... egyenlet mutatja az aktuális összeget.

 

Eszerint a sorvégi összeg szerint szeretném csökkenő sorba tenni úgy, hogy a saját egész sorait is vigye magával, ne csak az összeg oszlopát.

 

Biztos értitek...
Előre is kösz a segítséget,
Karna

Törölt nick Creative Commons License 2011.03.06 0 0 14276

Ez azt csinálja, hogy egy adott mappában lévő összes .xls kiterjesztésű fájlt megnyitja, és azok első munkalapját átmásolja abba a munkafüzetbe, amelyikben a makró fut. Érdemes ezért egy új munkafüzetbe tenni a makrót, továbbá összegyűjteni a forrásfáljokat egy mappába, és ezen mappa teljes elérési útvonalát megadni a kód alábbi sorában:

SourcePath = "C:\itt_vannak_a_fájlok_mappa\"

Előzmény: yxc432 (14275)
yxc432 Creative Commons License 2011.03.05 0 0 14275

Ennek mit kellene csinálnia? Csak saját magát másolja attól a cellától kezdve, amelyikben a kurzor van.:-(

Előzmény: Törölt nick (14260)
SQLkerdes Creative Commons License 2011.03.04 0 0 14274

Nem feltétlenül, mert most hogy utánagúgliztam, találtam azért panaszkodást usedrange ügyben.

Azt olvastam, ha csinál az ember egy usedrange.rows.count-ot (v. menti a workbook-ot) akkor a usedrange elfelejt minden múltbeli cuccot, reseteli magát és a tényleges usedrange lesz.

Előzmény: Törölt nick (14273)
Törölt nick Creative Commons License 2011.03.04 0 0 14273

Upsz... Jobban megnézve, a net inneső végéről is úgy tűnik, hogy hülyeséget írtam.

Azt hiszem, összekevertem a UsedRange-et a SpecialCells(xlCellTypeLastCell)) izével. Elnézést kérek...

:o

 

Előzmény: SQLkerdes (14272)
SQLkerdes Creative Commons License 2011.03.04 0 0 14272

Most gyorsan kipróbáltam amit írtál (G6-ba beír, elmegy onnan, G6-ra visszamegy, G6 töröl) és ezek után a UsedRange.Address A1-et adott.

 

Előzmény: Törölt nick (14271)
Törölt nick Creative Commons License 2011.03.04 0 0 14271

Igen, ezt a különbséget én is észrevettem. Meg mást is. Ha például egy vadiúj, üres munkalapnak mondjuk a G6-os cellájába beírsz egy tetszőleges értéket, aztán kitörlöd, a Te programod szerint a UsedRange G6-on lesz, és ezáltal a munkalap nem-üresnek minősül. Ez szerintem nem annyira jó.

 

Igazából nem értem teljesen, hogy ez a UsedRange hogyan is működik, azért nem is szoktam használni..

(Ez válasz SQLkerdes kolléga 14269-esére is).

Előzmény: E.Istvan (14270)
E.Istvan Creative Commons License 2011.03.04 0 0 14270

Nagyon szépen köszönöm a While-os válaszod, kevéske tudásom alapján erre tippeltem én is.

Ez utóbbi függvényedet teszteltem. Én ezt a programot arra használom, hogy a teljesen üres munkalapoktól megszabaduljak. A két lehetőség abban eltér, hogy a függvényed minden esetben üresnek mondta a munkalapot, ha a cellák üresek voltak. A másik program (ami egyébként nem az én munkám gyümölcse) viszont ha a háttérszín, vagy cellaszegély be volt állítva, vagy valamelyik cella megjegyzést tartalmazott, akkor már nem tekintette üresnek a lapot.

Előzmény: Törölt nick (14268)
SQLkerdes Creative Commons License 2011.03.04 0 0 14269

Vagy:

 

Worksheets(2).UsedRange.Value = False

Előzmény: Törölt nick (14268)
Törölt nick Creative Commons License 2011.03.04 0 0 14268

Itt meg egy másik:

 

Function Üresmunkalap(WS As Worksheet) As Boolean
    If WS.Cells.Count = Application.WorksheetFunction.CountBlank(WS.Cells) Then Üresmunkalap = True
End Function

Előzmény: E.Istvan (14266)
Törölt nick Creative Commons License 2011.03.04 0 0 14267

A While ciklus működése:

A futás oda ér, hogy While kifejezés.

Ha a kifejezés értéke igaz, a teljes ciklusmag végrehajtódik, aztán a kifejezés újra kiértékelésre kerül. A ciklus mindaddig megy, amíg a kiértékeléskor True az eredmény. Amint egy kiértékeléskor False eredmény jön ki, a futás a Wend utáni első utasításon folytatódik.

 

Nem tudnám egzakt módon meghatározni a különbséget, de biztosan van, ha egyszer mindketten léteztnek...

Annyi bizonyos, hogy a Do..Loop ciklusból középen is ki lehet lépni (pl. egy feltétel kiértékelése után) az Exit Do paranccsal, míg a While..Wend ciklusban ilyen lehetőség nincs. A Help azt írja, hogy a Do..Loop utasítással rugalmasabb és strukturáltabb ciklusokat lehet írni. Abban is biztos vagyok, hogy amit While...Wend ciklussal meg lehet oldani, azt Do..Loop-pal is meg lehet, szóval az előbbit nem kell bevenned a repertoárba.

 

A magam részéről ezt szoktam meg, és csak akkor használok mást, ha ezzel nem tudom megoldani, amit akarok. Nem emlékszem, hogy az utóbbi 3-4 évben használtam volna Do...Loop ciklust.

Előzmény: E.Istvan (14265)
E.Istvan Creative Commons License 2011.03.04 0 0 14266

Ha érdekel a téma, akkor itt egy progi, ami megvizsgálja, egy munkafüzetben, hogy üres-e a munkalap.

   
    Dim EgyCella As Boolean
    Dim A1EsCella As Boolean
    Dim A1Ures As Boolean
    Dim lap As Object

 

    For Each lap In Worksheets
        EgyCella = lap.UsedRange.Cells.Count = 1
        If EgyCella Then A1EsCella = lap.UsedRange.Address = Cells(1).Address
        A1Ures = lap.Cells(1) = ""
        If EgyCella And A1EsCella And A1Ures Then
            'üres a munkalap

        Else

            'nem üres a munkalap

        End If
    Next lap

Előzmény: tt65 (14261)
E.Istvan Creative Commons License 2011.03.04 0 0 14265

Ezt While ciklust eddig nem ismertem. Illetve ismertem csak nem VBA alatt. VBA-ban én mindig a Do …. Loop ciklust használtam.

Az angol tudásom elég kezdetleges. Ez a While ugyan az és ugyan úgy működik, mint a Do … Loop? (Már amennyiben ez utóbbinál is előre írom a feltételt, mert azt látom hogy a While-nál nem lehet a végén a feltétel.) Vagy van valamilyen különbség a kettő között?

Előzmény: Törölt nick (14260)
Törölt nick Creative Commons License 2011.03.03 0 0 14264

Ja, nem is vettem kritikának. Csak mentegetőztem egy kicsit, amiért lusta voltam minden eshetőséget figyelembe vevő kódot írni ;-)

Előzmény: tt65 (14263)
tt65 Creative Commons License 2011.03.03 0 0 14263

Nem kritikának szántam, csak miután lefutattam, ez jutott eszembe! örülnék, ha már ilyeneket tudnék írni! :-)

Előzmény: Törölt nick (14262)
Törölt nick Creative Commons License 2011.03.03 0 0 14262

Igen, lehetne még cifrázni, mert ez csak egy kezdetleges változat.

Ha például a cél munkafüzet ugyanabban a mappában van, ahol a forrásfájlok, valószínűleg kiakad a program, amikor önmagát is meg akarja nyitni. Aztán, ha a forrás munkalapokon csatolások vannak, akkor nem tudom mi történik. Aztán az is lehet, hogy a forrásfájlok nincsenek egy helyen, vagy nem Excel formátumban, stb.

Gondoltam, majd ha a kérdező pontosít, én is pontosítok.

Előzmény: tt65 (14261)
tt65 Creative Commons License 2011.03.03 0 0 14261

szuper.

annyival lehetne még turbózni, hogy ne csak az első lapot, hanem minden olyant ami nem üres adjon hozzá!

Előzmény: Törölt nick (14260)
Törölt nick Creative Commons License 2011.03.03 0 0 14260

Nem.

Azt lehet megtenni, hogy sorban egyesével megnyitni őket, és a lapokat áthelyezni egy erre a célra létrehozott munkafüzetbe. Pl így:

 

Sub Összevon()
    Dim wbSource As Workbook, wbDestination As Workbook, ws As Worksheet
    Dim SourcePath As String, FName As String
    
    Set wbDestination = ThisWorkbook
    SourcePath = "C:\itt_vannak_a_fájlok_mappa\"
    FName = Dir(SourcePath & "*.xls", vbNormal)
    While Not FName = ""
        Set wbSource = Workbooks.Open(Filename:=SourcePath & FName)
        Set ws = wbSource.Worksheets(1)
        ws.Copy after:=wbDestination.Worksheets(1)
        wbSource.Close savechanges:=False
        FName = Dir()
    Wend
End Sub

Előzmény: yxc432 (14259)
yxc432 Creative Commons License 2011.03.03 0 0 14259

Excel2003 alatt meg kell nyitni vagy 80 táblát és egy munkafüzetbe kell másolni.

Megoldható lenne, hogy rögtön egy munkafüzet különböző munkalapjaiként nyissa meg?

Törölt nick Creative Commons License 2011.03.02 0 0 14258

Nem ellenőrzött kód, de szerintem menni fog:

 

Private Sub CommandButton3_Click()

Dim Rng As Range, i As Long

Set Rng = Sheets("Nyomtatáslista").Range("A" & Rows.Count).End(xlUp).Offset(1)

Rng.value = Date

For i=1 to 18

   Rng.Offset(, i) = Sheets("Választ").Range("D" & i).Value

   '****

Next

 

A comboboxok törlését is meg lehet oldani ciklusban, ehhez egy sort kell betenni a fenti kódba a '**** helyére.

De nem tudom, milyen comboboxok ezek, és látatlanba nem akarok hülyeséget írni.

 

Előzmény: Törölt nick (14256)
SQLkerdes Creative Commons License 2011.03.02 0 0 14257

Szerintem lehet rövidebben is.

 

Tedd be az egészet egy For / Next ciklusba, találd ki mi az "B" betű ASCII kódja (tegyük fel a példa kedvéért, hogy CHAR(66)) és akkor:

 

 

...

Sheets("Nyomtatáslista").Range("A" & Rows.Count).End(xlUp).Offset(1) = Date

For x=1 to 18

Sheets("Nyomtatáslista").Range(CHAR(65+x) & Rows.Count).End(xlUp).Offset(1) = Sheets("Választ").Range("D" & x).Value

Next

...

Előzmény: Törölt nick (14256)
Törölt nick Creative Commons License 2011.03.02 0 0 14256

Köszi Jimmy-nek is, működik!

 

Kisakkoztam a másolást is, jól működik, csak kicsit hosszúra sikerült:

 

Private Sub CommandButton3_Click()
Sheets("Nyomtatáslista").Range("A" & Rows.Count).End(xlUp).Offset(1) = Date
Sheets("Nyomtatáslista").Range("B" & Rows.Count).End(xlUp).Offset(1) = Sheets("Választ").Range("D1").Value
Sheets("Nyomtatáslista").Range("C" & Rows.Count).End(xlUp).Offset(1) = Sheets("Választ").Range("D2").Value
Sheets("Nyomtatáslista").Range("D" & Rows.Count).End(xlUp).Offset(1) = Sheets("Választ").Range("D3").Value

 

... és így tovább D18 -ig.

 

Azonkívül betettem egy combobox törlést is a végére, de a magam egyszerű módján az is egyenként:

 

ComboBox1.Value = ""
ComboBox2.Value = ""
ComboBox3.Value = ""

 

... 18 ig.

 

Lehet ezt valahogy rövidebben?

tt65 Creative Commons License 2011.03.02 0 0 14255

Ennek örülök, gyere máskor is!

Előzmény: maiann (14253)
Sznida Creative Commons License 2011.03.02 0 0 14254

Nincs mit! :)

Esetleg próbáld ki a Jimmy The Hand javaslatát is, mert egyszerűbb kód!

 

Üdv: Sznido

Előzmény: Törölt nick (14252)
maiann Creative Commons License 2011.03.02 0 0 14253

siker! köszönöm!

Előzmény: tt65 (14249)
Törölt nick Creative Commons License 2011.03.02 0 0 14252

Nagyon szépen köszönöm! Működik!! :)

Akkor ezzel a képlettel elméletileg a címek másolását is meg tudom oldani, csak a dátum helyére kell más kód és vigyáznom kell, hogy ne maradjon ki üres sor.

Este nekiállok! Kösz még 1x! További szép napot mindenkinek!

Előzmény: Sznida (14250)
Törölt nick Creative Commons License 2011.03.02 0 0 14251

Vagy kicsit egyszerűbben:

 

Sheets("Nyomtatáslista").Range("A" & Rows.Count).End(xlUp).Offset(1) = Date

Előzmény: Sznida (14250)
Sznida Creative Commons License 2011.03.02 0 0 14250

Szia,

 

Megvan a hiba:

Ez a hibás sor:

 

Sheets("Nyomtatáslista").Cells(Range("A" & Rows.Count).End(xlUp).Row + 1, 1) = Date

 

Mivel egy commandbutton-ról indítod, és az egy másik munkalapon van, ezért ez az aktuális munkalapodon kereste az utolsó sort az "A" oszlopban.

A helyes sor:

 

Sheets("Nyomtatáslista").Cells(Sheets("Nyomtatáslista").Range("A" & Rows.Count).End(xlUp).Row + 1, 1) = Date


Üdv: Sznido

Előzmény: Törölt nick (14244)
tt65 Creative Commons License 2011.03.02 0 0 14249
Előzmény: maiann (14247)

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!