Excel segítség!
#1001
Elküldve: 2011. 11. 23. 14:44
A problémám a következő:
Van két excel táblám, amelyek két azonos tábla változatai.
Az első ennek a táblázatnak egy egy hónappal ezelőtti változata, a második pedig az, amiben az előző hónapban történtek változások.
A feladatom az lenne, hogy sorról-sorra, illetve oszlopról oszlopra meg kellene kapnom azoknak a celláknak a nevét (számát) amelyek megváltoztak az első táblázathoz képest.
Mivel több ezer soros táblázatról van szó, ez manuálisan elég nehézkes lenne, viszont a változások mindössze 100-200 bejegyzés.
Segítségeteket előre is köszönöm!
#1002
Elküldve: 2011. 11. 23. 16:15
Idézet: dreameli - Dátum: 2011. 11. 23. 15:44
A problémám a következő:
Van két excel táblám, amelyek két azonos tábla változatai.
Az első ennek a táblázatnak egy egy hónappal ezelőtti változata, a második pedig az, amiben az előző hónapban történtek változások.
A feladatom az lenne, hogy sorról-sorra, illetve oszlopról oszlopra meg kellene kapnom azoknak a celláknak a nevét (számát) amelyek megváltoztak az első táblázathoz képest.
Mivel több ezer soros táblázatról van szó, ez manuálisan elég nehézkes lenne, viszont a változások mindössze 100-200 bejegyzés.
Segítségeteket előre is köszönöm!
Tegyél ki egy füzetet, mert ennyi leírás kevés a megoldáshoz. Nyilván nem publikusak az adatok. Elég, ha az eredeti mintájára beírsz 10-12 sort fiktív adatokkal az első tábla adatai szerint, a másodikra meg azt írd, amit az első alapján szeretnél kapni.
#1003
Elküldve: 2011. 12. 07. 17:08
#1004
Elküldve: 2011. 12. 07. 17:27
A makrót ahhoz a laphoz kell rendelned, ahol a leírt eredményt akarod elérni. Lapfülön jobb klikk, Kód megjelenítése. Ezzel bejutsz a VB szerkesztőbe. A jobb oldali üres lapra kell bemásolnod.
Úgy írtam meg, ahogy kérted, és hozzátettem, hogy ha az A oszlopban törölsz egy adatot (téves bevitel), akkor a mellette lévő B cella is üres lesz. Ha ezt nem akarod, akkor az If Target = "" Then Cells(Target.Row, 2) = "" sort töröld ki.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
If Target <> "" Then Cells(Target.Row, 2) = Date
If Target = "" Then Cells(Target.Row, 2) = ""
End If
End Sub
#1005
Elküldve: 2011. 12. 07. 17:48
És még annyit kérnék hogy nem csak erre a két oszlopra kellene a makró hanem egy munkalapon belül, összesen 4 oszlopot kellene vizsgálnia, 4 különböző cellába is kellene kiírni. Azt látom hogy az oszlopok sorszámával változtathatom azt hogy hol vizsgálja a cellákat. Működni fog, ha copy-zom az általad megírt sorokat és megváltoztatom az oszlop sorszámokat?
Szerkesztette: jan001 2011. 12. 07. 17:55 -kor
#1006
Elküldve: 2011. 12. 07. 18:46
Szívesen.
Pontosan írd meg, melyik oszlopokat figyelje a makró,és melyik sorokat.
Az oszlopoknál A-ba írva B legyen a dátum, melyik legyen a további 3 páros?
A sorok 14, 19, 24, és így tovább?
Ha ezeket az adatokat megadod, holnap reggel megírom.
#1007
Elküldve: 2011. 12. 07. 23:01
Az oszlop párok amikre kellene a makró:
Érték-Dátum:
Y-AJ
AB-AK
AU-BF
AX-BG
A sorok amikben a cellát kell vizsgálni, pedig úgy van ahogy írtad 14,19,24,29, stb.., egészen a 2944-es sorig tart ez a táblázatom, de jó lenne ha végig számolná ezzel a periódussal, mert ez egy minta táblázat és előfordulhat, hogy hosszabb lesz majd.
Egész nap itt leszek a gép előtt és várom szeretettel.
#1008
Elküldve: 2011. 12. 08. 08:17
Munkalap függvényeket lehet másolni relatív hivatkozással, de makróban pontosan meg kell adni a hivatkozások helyét.
A testreszabott makró – a laphoz rendelve:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sor%, oszl%, ofs%
sor% = Target.Row: oszl% = Target.Column
If oszl% = 25 Or oszl% = 28 Or oszl% = 47 Or oszl% = 50 Then
If sor% > 13 And (sor + 1) Mod 5 = 0 Then
Select Case oszl%
Case 25
ofs% = 11
Case 28, 50
ofs% = 9
Case 47
ofs% = 11
End Select
If Target = "" Then Cells(sor%, oszl%).Offset(, ofs%) = ""
If Target <> "" Then Cells(sor%, oszl%).Offset(, ofs%) = Date
End If
End If
End Sub
#1009
Elküldve: 2011. 12. 08. 09:01
#1010
Elküldve: 2011. 12. 08. 11:09
Nagyon szívesen. Még egy kicsit lehet egyszerűsíteni a makrón. Utólag vettem észre, hogy 2 oszlopnál kell 11-gyel jobbra írni a dátumot, így 2 sort megspórolhatunk. Nagyobb makrónál a feltételek vizsgálatának a száma csökkentheti a futás idejét.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sor%, oszl%, ofs%
sor% = Target.Row: oszl% = Target.Column
If oszl% = 25 Or oszl% = 28 Or oszl% = 47 Or oszl% = 50 Then
If sor% > 13 And (sor + 1) Mod 5 = 0 Then
Select Case oszl%
Case 25, 47
ofs% = 11
Case 28, 50
ofs% = 9
End Select
If Target = "" Then Cells(sor%, oszl%).Offset(, ofs%) = ""
If Target <> "" Then Cells(sor%, oszl%).Offset(, ofs%) = Date
End If
End If
End Sub
#1011
Elküldve: 2011. 12. 13. 17:18
Változó napi számú (50 -500) képekről kell katalógust készíteni. Egy A4-es lapon legyen három kép bal oldalon, és mellettük jobbra a rövid leírás. A képek egységesen 1560 x 1024 px méretűek, 300 DPI-sek, és van hozzájuk egy rövid TXT leírás. Alapból IrfanViev vonalon indult el a dolog megvalósítása, csakhogy ennek katalógus készítője egységesen osztja ki a helyet a lapon, ami nem jó, mert a TXT túl nagy helyet kap így, a TIF meg túl kicsit. Ezért a TXT-kről 770 x 1024 px méretű képek készültek, és hozzá lettek adva a TIF jobb oldalához.... Csakhogy több száz képnél ez túl sokáig tart, még elég erős gép esetén is.
Így jött az ötlet: Legyen Excellel megoldva.
Erre készítettem ezt:
Sub képbeolvas(mappa As String)
Appneve = "PicLista.XLA: képbeolvas makró"
Dim myPict As Picture
Application.StatusBar = FOTONAP & " napi munkafüzet előkészítése..."
Workbooks.Add
Cél = ActiveWorkbook.Name
célcella = 1
Columns("A:A").ColumnWidth = 71
Nyomtatás = GetSetting(appname:="MY_AddIn", _
section:="BLIKK", Key:="Nyomtatás", Default:="1")
If Nyomtatás <> "0" Then
Balfelső1 = GetSetting(appname:="MY_AddIn", _
section:="BLIKK", Key:="Balfelső1")
Balfelső2 = GetSetting(appname:="MY_AddIn", _
section:="BLIKK", Key:="Balfelső2")
With ActiveSheet.PageSetup
.LeftHeader = "&""Arial CE,Félkövér""&9" & Balfelső1 & Chr(10) & Balfelső2
.CenterHeader = "Képlista" & Chr(10) & "- " & FOTONAP & " - napi feldolgozás"
.RightHeader = "&P oldal, összesen: &N ."
.LeftFooter = "&F -> &F" & Chr(10) & "Készítette: " & Application.UserName
.CenterFooter = ""
.RightFooter = "&D" & Chr(10) & "&T"
.LeftMargin = Application.InchesToPoints(0.708661417322835)
.RightMargin = Application.InchesToPoints(0.47244094488189)
.TopMargin = Application.InchesToPoints(0.669291338582677)
.BottomMargin = Application.InchesToPoints(0.669291338582677)
.HeaderMargin = Application.InchesToPoints(0.236220472440945)
.FooterMargin = Application.InchesToPoints(0.236220472440945)
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
.PrintHeadings = False
.PrintGridlines = False
.PrintComments = xlPrintNoComments
.PrintErrors = xlPrintErrorsDisplayed
.CenterHorizontally = False
.CenterVertically = False
.Orientation = xlPortrait
.Draft = False
.PaperSize = xlPaperA4
.FirstPageNumber = xlAutomatic
.Order = xlDownThenOver
.BlackAndWhite = False
.Zoom = 100
End With
End If 'Nyomtatás <> "0"
Application.StatusBar = FOTONAP & " napi TIF fájlok felderítése..."
aktfileszám = 0
'Dim PicFiles As New Collection
'RecursiveDir PicFiles, mappa, "*.TIF", True
Dim PicFiles()
Vanfile = FilePathSearch2007(PicFiles(), mappa, "*.TIF")
If Vanfile = True Then
Filestotal = UBound(PicFiles())
For TIF = 1 To Filestotal
' For Each vFile In PicFiles
aktfileszám = aktfileszám + 1
'Txtfile = Left(vFile, Len(vFile) - 3) & "TXT"
Txtfile = Left(PicFiles(TIF), Len(PicFiles(TIF)) - 3) & "TXT"
Windows(Cél).Activate
Cells(célcella, 1).Select
With ActiveSheet.Range("A" & LTrim(Str(célcella)))
Set myPict = .Parent.Pictures.Insert(PicFiles(TIF))
myPict.Top = .Top
myPict.Left = .Left
myPict.Placement = xlMoveAndSize
End With
Workbooks.Open Txtfile
tx = ActiveWorkbook.Name
rekordszám = ActiveCell.SpecialCells(xlLastCell).Row()
Range(Cells(1, 1), Cells(rekordszám, 1)).Select
Selection.Copy
Windows(Cél).Activate
Cells(célcella + 1, 2).Select
ActiveSheet.Paste
Windows(tx).Activate
ActiveWorkbook.Close
'Application.StatusBar = Str(aktfileszám) & " / " & Str(PicFiles.Count) & " TIF fájl beolvasva ..."
Application.StatusBar = Str(aktfileszám) & " / " & Str(Filestotal) & " TIF fájl beolvasva ..."
célcella = célcella + 17
'Next vFile
'For Num = 1 To PicFiles.Count
' PicFiles.Remove 1
'Next Num
Next TIF
End If 'Vanfile = True
Columns("B:B").EntireColumn.AutoFit
End sub
'*********************************************************************************************************
Function FilePathSearch2007(ByRef found_files() As Variant, path_to_search As String, Optional file_filter As String = "*.*") As Boolean
Dim FileName As String
Dim tempfile As String
Dim index1 As Long, index2 As Long
Dim index As Long
If Right(path_to_search, 1) <> "\" Then path_to_search = path_to_search & "\"
FileName = Dir(path_to_search & file_filter)
If FileName = "" Then
FilePathSearch2007 = False
Exit Function
End If
ReDim found_files(1 To 100)
index = 1
found_files(index) = path_to_search & FileName
Do
FileName = Dir
If FileName = "" Then Exit Do
If index Mod 100 = 0 Then ReDim Preserve found_files(1 To index + 100)
index = index + 1
found_files(index) = path_to_search & FileName
Loop
ReDim Preserve found_files(1 To index)
For index1 = 1 To UBound(found_files)
For index2 = index1 To UBound(found_files)
tempfile = found_files(index1)
Select Case sorttype
Case xlAscending
If tempfile > found_files(index2) Then
found_files(index1) = found_files(index2)
found_files(index2) = tempfile
End If
Case xlDescending
If tempfile < found_files(index2) Then
found_files(index1) = found_files(index2)
found_files(index2) = tempfile
End If
End Select
Next
Next
FilePathSearch2007 = True
End Function
'*********************************************************************************************************
Public Sub RecursiveDir(colFiles As Collection, _
strFolder As String, _
strFileSpec As String, _
bIncludeSubfolders As Boolean)
'Fájl listát (elérési úttal) soronként Kollekcióba író rutin
'paraméterek: ColFiles = Kollekció neve, amit előre definiálni kell
' Strfolder = induló könyvtár
' strFileSpec= Fálj maszk
' bIncludeSubfolders = TRUE, ha alkönytárakat is át kell nézni...
'
Dim strTemp As String
Dim colFolders As New Collection
Dim vFolderName As Variant
If Len(strFolder) > 0 Then
If Right(strFolder, 1) <> "\" Then strFolder = strFolder & "\"
End If
strTemp = Dir(strFolder & strFileSpec)
Do While strTemp <> vbNullString
colFiles.Add strFolder & strTemp
strTemp = Dir
Loop
If bIncludeSubfolders Then
strTemp = Dir(strFolder, vbDirectory)
Do While strTemp <> vbNullString
If (strTemp <> ".") And (strTemp <> "..") Then
If (GetAttr(strFolder & strTemp) And vbDirectory) <> 0 Then
colFolders.Add strTemp
End If
End If
strTemp = Dir
Loop
For Each vFolderName In colFolders
Call RecursiveDir(colFiles, strFolder & vFolderName, strFileSpec, True)
Next vFolderName
End If
End Sub
Ezzel az a baj, hogy a gépemen, ami elég erős, nagyon szépen fut, amíg nem csinálok közben olyant, hoyg megnyitok egy Outlook levelet, és elkezdek írni bele... Ekkor az Excel makró futása szó nélkül vagy megszakad, vagy dob egy: application-defined or object defined error-t.
A makróban látszik, két módon is próbálkoztam, kollekcióval, aztán egy külön fájlfelderítő függvénnyel, ami többe írja a találatokat.
Ha jól működik, akkor egy lapnyi területre 3 képet rak, és melléjük írja a TXT tartalmat, nagyon jó beosztva a szélességet.
Ez van az én gépemem. Ha nem piszkálom közben, akkor nem csinálja össze magát az Excel 2007.
Ám ahol ennek futnia kell, ott már alapból hülyeségeket csinál, nem találja a fájlokat, lefagy, és csak akkor működik helyesen, ha nincs 60-nál több kép.
Akárhogy, több kupac kép feldolgozása alatt is max. 835132 K memóriahasználat volt, 2077928 (2 GB) fizikai mellett, tehát memória gond nem lehet, az i7-es proci sem terhelődött 59+75%-nál jobban.
Mi a tököm baja lehet az Excelnek ezzel?
#1012
Elküldve: 2011. 12. 13. 23:21
Idézet: hkpk - Dátum: 2011. 12. 13. 17:18
Változó napi számú (50 -500) képekről kell katalógust készíteni. Egy A4-es lapon legyen három kép bal oldalon, és mellettük jobbra a rövid leírás. A képek egységesen 1560 x 1024 px méretűek, 300 DPI-sek, és van hozzájuk egy rövid TXT leírás. [...]
Akárhogy, több kupac kép feldolgozása alatt is max. 835132 K memóriahasználat volt, 2077928 (2 GB) fizikai mellett, tehát memória gond nem lehet, az i7-es proci sem terhelődött 59+75%-nál jobban.
Mi a tököm baja lehet az Excelnek ezzel?
Az van kipróbáltam otthon egy mezei HT-s PIV masinán, ami a melóstól annyiban eltér, hogy HD sorozatú kártya van benne, és 3 GB RAM duálba Excel XP-vel...
És ugyanannyi idő alatt végez a makróval, mint a melós csudagépen az Excel 2007, de csont nélkül, és az elkészült fájlt villámgyorsan lehet menteni, formázni, megnyitni...
(Az Excel 2007 hihetetlenül nyögvenyelősen kezeli az elkészült fájlokat) Szóval az agyam eldobom...
Szerkesztette: hkpk 2011. 12. 13. 23:26 -kor
#1013
Elküldve: 2011. 12. 16. 19:50
Idézet: hkpk - Dátum: 2011. 12. 13. 17:18
Ezzel az a baj, hogy a gépemen, ami elég erős, nagyon szépen fut, amíg nem csinálok közben olyant, hogy megnyitok egy Outlook levelet, és elkezdek írni bele... Ekkor az Excel makró futása szó nélkül vagy megszakad, vagy dob egy: application-defined or object defined error-t.
[...]
Mi a tököm baja lehet az Excelnek ezzel?
X-Akta folytatódik....
Úgy tűnik ez minden olyan makró esetén fennáll, ami Excel 2007 alatt lett létrehozva / fejlesztve. Kikakadnak, megszakadnak, ha átváltasz a futás alatt valami másra, amibe pötyögni lehet (IE, Outlook, akármi)
Azokkal a makrókkal, amelyek régebbiek, nincs ilyen gond. Több, egymástól nagyon távoli gépen ugyanez a jelenség
#1014
Elküldve: 2011. 12. 17. 08:05
Ezeknek a fejlesztéseknek véleményem szerint csakis az a célja, hogy egyre izmosabb gépet kelljen beszerezni hozzájuk.
A 2007-esnek egyetlen jó új funkcióját fedeztem fel, ami a SZUMHATÖBB. Egyébként VPS (Vakulj Paraszt System, "A számítástechnikában az üveggyöngyök népszerű elnevezése, olyan technikai megoldás, ami a külső megjelenésen túl gyakorlatilag nem nyújt semmilyen többletet" – idézet egy rövidítés szótárból), tele csillogó-villogó csicsákkal. Az a baj, hogy a többlet hiányán kívül ez még olyan hibákat is okoz, mint amilyent leírtál.
Többen panaszkodnak, hogy pl. a Ctrl+c és a Ctrl+v sem működik sok esetben, de nem állandóan. Az ilyen hol-van, hol-nincs funkciók nagyon kellemetlenek.
Megszüntették a Ctrl+ és Ctrl- cellabeszúrás és cellatörlés lehetőségét, amit elég sűrűn használtam.
Vannak dolgok, amiket a 2003-as verzióban készítek el, mert ott sokkal egyszerűbb, és utána viszem át 2007-be. Szerintem a laponkénti 1024-szer több cellát sem sokan használják ki, mert amihez ennyi cella szükséges, azt már nem Excellel kell megoldani. Egyébként is kibírhatatlanul lelassítja a működést.
#1015
Elküldve: 2011. 12. 18. 14:59
Idézet: hkpk - Dátum: 2011. 12. 16. 19:50
Úgy tűnik ez minden olyan makró esetén fennáll, ami Excel 2007 alatt lett létrehozva / fejlesztve. Kikakadnak, megszakadnak, ha átváltasz a futás alatt valami másra, amibe pötyögni lehet (IE, Outlook, akármi)
Azokkal a makrókkal, amelyek régebbiek, nincs ilyen gond. Több, egymástól nagyon távoli gépen ugyanez a jelenség
És ha változtatsz valamit a makrón az otthoni Exceledben?
Hátha újrafordul, és utána jól fog működni másik taszkra váltás után is. (Bár ez elvileg VB script, ergo nincs minek fordulnia)
#1016
Elküldve: 2011. 12. 18. 22:22
Idézet: Sparow2 - Dátum: 2011. 12. 18. 14:59
Hátha újrafordul, és utána jól fog működni másik taszkra váltás után is. (Bár ez elvileg VB script, ergo nincs minek fordulnia)
Igen, úgy is kiakad, ha az Excel 2007 alatt kezdeményezett makrót 2002-es alatt megtupirozom, majd változtatás nélkül átviszem 2007-es alá.
Csak azokkal nincs gond a jelek szerint (vagy nem futottam bele), amik régebbi alatt lettek kezdve (azzal együtt, hogy ezek lettek módosítva 2007 alatt is). Nem sima taszk váltástól akad ki, hanem olyan taszkra kell váltani, amibe adatot lehet bepötyögni billentyűzetről, és kell is pötyögni. Tehát pl. gmail webes felülete.
Valami fordítás azért van, mert ezek bővítményekben (XLA) vannak mentve. Ezzel valamit csak csinál az Excel, mert időnként változik a fájl mérete és dátuma is, akkor is, ha nincs belemódosítva semmi. Ja, ugyanaz a kód Excel 2007 alatt nagyobb XLA fájlt eredményez...
(azért használok XLA formátumot, mert ezek működnek régebbi Excel alatt is, nem érdekelnek a 2007 új kódolási formái)
Szerkesztette: hkpk 2011. 12. 18. 22:26 -kor
#1017
Elküldve: 2011. 12. 18. 22:23
#1018
Elküldve: 2011. 12. 21. 18:49
Idézet: Delila - Dátum: 2011. 12. 07. 18:27
A makrót ahhoz a laphoz kell rendelned, ahol a leírt eredményt akarod elérni. Lapfülön jobb klikk, Kód megjelenítése. Ezzel bejutsz a VB szerkesztőbe. A jobb oldali üres lapra kell bemásolnod.
Úgy írtam meg, ahogy kérted, és hozzátettem, hogy ha az A oszlopban törölsz egy adatot (téves bevitel), akkor a mellette lévő B cella is üres lesz. Ha ezt nem akarod, akkor az If Target = "" Then Cells(Target.Row, 2) = "" sort töröld ki.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
If Target <> "" Then Cells(Target.Row, 2) = Date
If Target = "" Then Cells(Target.Row, 2) = ""
End If
End SubSzia!
Egy olyan kiegészítéshez szeretnék segítséget kérni, amikor a több oszlopból álló rekord bármely/vagy 1 konkrét cella értéke megváltozik, akkor kerülne a dátum rögzítésre.
Köszi, ha tudsz segíteni!
Elek
#1019
Elküldve: 2011. 12. 22. 07:55
Pontosíts egy kicsit!
- A táblázatodnál minden rekordban (sorban) jelenjen meg a dátum, ha beírsz-módosítasz egy cellában egy értéket?
- Hova kerüljön a dátum? A bevitel oszlopát követő oszlopba?
- Melyik oszlop(ok)ba bevitt érték hozza magával ezt a változtatást? Nem tartom valószínűnek, hogy minden oszlopnál igaz legyen. Ha az lenne, akkor 1-1 oszlopban vegyesen lennének dátumok, és más jellegű adatok.
#1020
Elküldve: 2011. 12. 24. 05:35
Idézet: Delila - Dátum: 2011. 12. 22. 07:55
Pontosíts egy kicsit!
- A táblázatodnál minden rekordban (sorban) jelenjen meg a dátum, ha beírsz-módosítasz egy cellában egy értéket?
- Hova kerüljön a dátum? A bevitel oszlopát követő oszlopba?
- Melyik oszlop(ok)ba bevitt érték hozza magával ezt a változtatást? Nem tartom valószínűnek, hogy minden oszlopnál igaz legyen. Ha az lenne, akkor 1-1 oszlopban vegyesen lennének dátumok, és más jellegű adatok.
A táblázatot egy eszköz-leltárhoz tudnám legjobban hasonlítani, ahol egy sorban(rekordban) szerepel egy termék jellemző tulajdonsága, fellelési helye, stb... és mondjuk a fellelési hely változás időpontja, vagy esetleg más jellemző érték megváltozása (dátum, esetleg dátum idővel) kerülne rögzítésre a rekordsor pl "J" oszlopban. Mindenesetre köszönöm a témával való foglalkozást is.
Kellemes Karácsonyi Ünnepeket és Boldog Új Évet Kívánok!

Súgó
A téma zárva.












