Az „Excel” fórum célja, hogy keretet adjon az Excel felhasználók széles táborának tapasztalataik megosztására, és lehetőséget a segítséget kérőknek. Az alábbi összefoglaló azért készült, hogy segítse a helyes kérdésfeltevést.
– Írd le szabatosan a problémát. Úgy fogalmazz, hogy ne csak te magad, de a szakértő is megértse, mire szeretnél választ kapni.
– Írd le, hogy milyen verziójú Excellel dolgozol. (Vagy ha nem – ill. nem csak – Excel, akkor micsoda?)
– Írd le, hogy milyen úton indultál el, és hol akadtál el rajta.
– A kérdés megértése szempontjából sokat segíthet, ha feltölteszt egy képet, amin látszik, hogy mit szeretnél, vagy illusztrálja azt.
– Még jobb, ha feltöltesz egy minta munkafüzetet valahová (pl. data.hu). Feltöltés előtt távolítsd el belőle a nem publikus adatokat.
– Ha a feladat jellege olyan, célszerű az "előtte" és "utána" állapotokat bemutatni. (Miből kellene csinálni mit?)
– Ha VBA kódon kell javítani, másold be a releváns kódrészt. Rövid kód mehet hozzászólásba, hosszú kód inkább ide: http://pastebin.com/
– Ha valami nem úgy működik, ahogy kellene, add meg a rendellenes viselkedés jellemzőit, a hibaüzenetet, és a hibát okozó programsort.
Olyat tudsz a legegyszerűbben, hogy beteszel két képet, és makróval állítod a tulajdonságaikat. De képet beszúrni is lehet, csak sztem macerásabb.
A .visible tulajdonságot tudod állítani, és OK lesz.
(Fejből többet nem tudok, a szakirodalmam meg bent van, majd a többiek...)
-----
Az volt a bajom, hogy fogalmam sincs, hogyan kell cellába képet beszúrni. Én csak leteszem, és esetleg beállítom a cella méretének megfelelően, és megmondom, hogy a cellával együtt mozduljon a kép is (helye is, mérete is).
Képre szeretnék hivatkezni függvényel.úgy hogyha egy bizonyos cellába egy bizonyos érték (pl.1) van akkor egy másik cellába szúrjon be egy képet.pl.A1-es clella=1 akkor B1=egy bizonyos kép
Igaz ebben az esetben már nem sok értelme van a vRng tartománynak, mert ugyanazokat adod meg utána megint, akkor lenne értelme, ha ki tudnánk nyerni a vRng-ből, hogy mi a file neve, és mi a munkalap neve.
MÉGRE felfogtam egy részét annak, amit magyaráztatok nekem.
rWorkRange.Offset(0, 10).Value = "=VLOOKUP(RC[-10],PL_Wasko_SP_Standard_Services_Q1_2011.csv!B:L,10,0)" Helyett ez: rWorkRange.Offset(0, 10).FormulaR1C1 = "=VLOOKUP(RC[-10],PL_Wasko_SP_Standard_Services_Q1_2011.csv!C2:C12,10,0)" Vagy ahogy javasoltad:
Set vRng = wbPriceList.Worksheets(1).Range("B:L")...ami nem relatív
Tartomany = vRng.AddressLocal(ReferenceStyle:=xlR1C1, _ RowAbsolute:=False, ColumnAbsolute:=False, _ RelativeTo:=Worksheets(1).Cells(1, 12))...de ez már relatívvá teszi és akkor a Vlookup is tudja értelmezni!!!!
Egy mini lépést már előre jutottam :-) hála nektek :-DDD...
És végre felfogtam Szinda, amit írtál erről tartomány dologról...
Vettem három mély lélegzetet és elkeztem lépésről lépésre...tesztelgetni...és a végére felfogtam amit írtál :-))).
Nálam működik a Te progid, csak beírtam egy set-et a vRng=wbPriceList.Worksheets(1).Range("B:L") elé.
Ha mondatonként (F8) futtatod, akkor miután tároltad a Tartomany változóba az adatot, vidd az egeret a Tartomany szóra, és kiírja, hogy mi a tartalma, ha ott "O" van, szerintem nem lesz, akkor cserélned kell, ha nem "C", akkor is cserélned kell "C"-re.
Köszi szépen a magyarázatot. Szerintem te érthetően magyarázod, csak én vagyok értetlen :-DDD.
Tehát elvileg az alább bemásolt kódnak működnie kell.
Beleírtam ezt a tartomány dolgot és mivel angol excelem van nem kell semmit sem cserélgetnem /ha jól értem/.
vRng definiálva van
Tartomany definialva van
és most nem foglalkozom egyenlőre azzal, hogy ha nem talál megfelelést, akkor leáll ez a fajta vlookup /szóval, hogy worksheetfunction-t kell majd használnom.
De valamit továbbra is rosszul csinálok, mert nem működik...
Erre ír hibát továbbra is: vRng = wbPriceList.Worksheets(1).Range("B:L")
Tudom kicsit hopeless vagyok :-)
-----------------
Sub teszt2() Dim wbPriceList As Workbook Dim wbCheckFile As Workbook Dim rWorkRange As Range Dim vRng As Range Dim x As Long Dim Msg As String Dim Ans As Integer
MsgBox "Open the file you want to check!" Application.Dialogs(xlDialogOpen).Show Set wbCheckFile = ActiveWorkbook
MsgBox "Open the PriceList!" Application.Dialogs(xlDialogOpen).Show Set wbPriceList = ActiveWorkbook
For i = 1 To x wbCheckFile.Worksheets(i).Range("B:B").Insert Shift:=xlToRight wbCheckFile.Worksheets(i).Range("B1") = "UniqueCode" Set rWorkRange = wbCheckFile.Worksheets(i).Range("A2")
Do While rWorkRange.Value <> Empty rWorkRange.Offset(0, 1).Value = "=RC[21]&""_""&RC[24]&""_""&RC[26]&"" Q""&ROUNDUP(MONTH(RC[6])/3,0)&"" ""&YEAR(RC[6])" Set rWorkRange = rWorkRange.Offset(1, 0) Loop Next i
For i = 1 To x wbCheckFile.Worksheets(i).Range("B:B").Copy wbCheckFile.Worksheets(i).Range("B:B").PasteSpecial xlPasteValues wbCheckFile.Worksheets(i).Range("L:M").Insert Shift:=xlToRight wbCheckFile.Worksheets(i).Range("O:P").Insert Shift:=xlToRight
Kezdjük az elején. Küldtél egy kódot, amiben valmi nem volt.
Ezt én bemásoltam egy VBA-ba, és elkezdtem futtatni. Üres munkalapokat nyittam meg, mert ugye úgy indul a program, hogy két file-t megnyit... (Aztán az első file-ba beírtam egy két számot, hogy legyen valami, mert az üres cellákkal nem foglalkozik a ciklus).
Miután eljutottam a Te hibádhoz, akkor szépen sorjában megnéztem, hogy mit akar csinálni a program. vRng simán set-elte. Aztán rájöttem, hogy te a "rWorkRange.Offset(0, 10).Value =" után az egész képletet idézőjelbe tetted, azaz szövegként beírattad a cellába. Ezt írta Robbantomestre is, és ezért vágta/vágtuk három részre a képletet: "=VLOOKUP(RC[-10]," & Tartomany & ",10,0)" a részeket az & fűzi össze. Ha a tartomány helyett csak a vRng-t írom, akkor lehülyézett, mert az egy range a benne lévő adatokkal, de én annak a címére voltam kíváncsi, ezért kipróbáltam a vRng.Address-t. Ez pedig "B:M" volt, amire azt gondoltam, hogy jó. Erre írta Robbantomester, hogy a VBA-ban írt képleteknek relatív sor/oszlophivatkozást kell tartalmazniuk, azaz ott ezt kell lásd: "C[-10]:C[1]", legalábbis a "B:M" ezt jelenti a cells(1,12) cellához képest. Ezután kipróbáltam a vRng.AddressLocal-t, ahol szükség volt a további argumentumokra a zárójelben. ezt tároltam a Tartomány változóban.
Ekkor kiíratva a Tartományt, azt láttam, hogy a magyar excelem a "C"-ket "O"-val jelöli, hát persze, hogy nem fogadta el, ezért ez a két betűt kicseréltem, és utána szépen lefutott a program, és jó fkeres függvényt tett be a megfelelő sorba.
Do While rWorkRange.Value <> Empty Tartomany = vRng.AddressLocal(ReferenceStyle:=xlR1C1, _ RowAbsolute:=False, ColumnAbsolute:=False, _ RelativeTo:=Worksheets(1).Cells(1, 12))
tehát itt a már korábban definiált vRng-t használjuk?
tehát ez jó?: vRng = wbPriceList.Worksheets(1).Range("B:L")...valamiért erre mutat a debug, de a wbpriceList bizonyítottam működik, sok műveletben használja sikerrel a macro...de mi a gondja?
"Cells(1, 12)" ezt nem értem ebben a kontextustban...ez nem a 12-es oszlop első sorát jelenti? Nekem a vlookuphoz nem egy cellára, hanem egész rangre van szükségem, amiben keresgálhet, vagy totál nem értek valamit :-DDD...gondolom ez utóbbi.
'A magyar excel VBA-ja az oszlopot "O"-nak jelöli, ezt kell átcserélni "C"-re, ez a két sor azt csinálja :)
For i = 1 To x wbCheckFile.Worksheets(i).Range("B:B").Insert Shift:=xlToRight wbCheckFile.Worksheets(i).Range("B1") = "UniqueCode" Set rWorkRange = wbCheckFile.Worksheets(i).Range("A2")
Do While rWorkRange.Value <> Empty rWorkRange.Offset(0, 1).Value = "=RC[21]&""_""&RC[24]&""_""&RC[26]&"" Q""&ROUNDUP(MONTH(RC[6])/3,0)&"" ""&YEAR(RC[6])" Set rWorkRange = rWorkRange.Offset(1, 0) Loop Next i
For i = 1 To x wbCheckFile.Worksheets(i).Range("B:B").Copy wbCheckFile.Worksheets(i).Range("B:B").PasteSpecial xlPasteValues wbCheckFile.Worksheets(i).Range("L:M").Insert Shift:=xlToRight wbCheckFile.Worksheets(i).Range("O:P").Insert Shift:=xlToRight
For i = 1 To x Set rWorkRange = wbCheckFile.Worksheets(i).Range("B2") Set vRng = wbPriceList.Worksheets(1).Range("B:M") Egyébként mostanság ehhez a sorhoz írja a debug, hogy nem érti...de mi nem jó ebben? Bár igaz olyat is láttam, hogy ezt jelöli ki, de nem is itt van a hiba...MIT NEM ÉRT EZEN? ... Kikészít már :-D
Do While rWorkRange.Value <> Empty rWorkRange.Offset(0, 10).Value = "=VLOOKUP(RC[-10],vRng,10,0)"
A probléma a sor/oszlop relatív hivatkozással van, a formulaR1C1 se működött, nálam. Ezért megcsináltam az én verzióm, ami nálam lefut, kicsit csúnya, de működik. Sajnos van benne egy azaz kett csere az angol-magyar nyelv miatt, erre lehet nem lesz szükséged Wawabagus.
A Kód: (mármint amit beírtam, az egyik do while loop ciklus)
Do While rWorkRange.Value <> Empty Tartomany = vRng.AddressLocal(ReferenceStyle:=xlR1C1, _ RowAbsolute:=False, ColumnAbsolute:=False, _ RelativeTo:=Worksheets(1).Cells(1, 12)) 'A magyar excel VBA-ja az oszlopot "O"-nak jelöli, ezt kell átcserélni "C"-re, ez a két sor azt csinálja :)
ugyanis a vba a cellába beírandó képletet sor/oszlop relatív hivatkozással tudja csak értelmezni és valószínűleg ennek ez keresztbe tesz. Használhatsz .FormulaR1C helyett sima .Formula-t is. (Tudod, a .Value helyett)
Próbáltam, de nem nem érti. Beírj az első celléba, ahova kell és finish : #NAME?.
Kipróbáltam egy az egyben is. Megadva szépen a ranget és szépen kezdi is kitölteni, de az első olyan után cella után ahova nem talál megfelelést "n/a" lenne leáll az egésszel.
Olvastam a neten, hogy a worksheetfunction.vlookup-ot kéne itt használni, mert az nem robban le az első sikeretelen találat után...
De basszus lezsibbadtam ettől :-).
Egy hajszál választ el a kész macrotól :-D...és annyire idegesítő hogy ez a vlookup kérdés nem is annyira egyszerű...
Most már el kell mennem, de holnap folyt köv...NEM ADOM FEL :-)))...olyan szépen haladtam :-)
For i = 1 To x wbCheckFile.Worksheets(i).Range("B:B").Insert Shift:=xlToRight wbCheckFile.Worksheets(i).Range("B1") = "UniqueCode" Set rWorkRange = wbCheckFile.Worksheets(i).Range("A2")
Do While rWorkRange.Value <> Empty rWorkRange.Offset(0, 1).Value = "=RC[21]&""_""&RC[24]&""_""&RC[26]&"" Q""&ROUNDUP(MONTH(RC[6])/3,0)&"" ""&YEAR(RC[6])" Set rWorkRange = rWorkRange.Offset(1, 0) Loop Next i
For i = 1 To x wbCheckFile.Worksheets(i).Range("B:B").Copy wbCheckFile.Worksheets(i).Range("B:B").PasteSpecial xlPasteValues wbCheckFile.Worksheets(i).Range("L:M").Insert Shift:=xlToRight wbCheckFile.Worksheets(i).Range("O:P").Insert Shift:=xlToRight
For i = 1 To x Set rWorkRange = wbCheckFile.Worksheets(i).Range("B2") Set vRng = wbPriceList.Worksheets(1).Range("B:M")
Do While rWorkRange.Value <> Empty rWorkRange.Offset(0, 10).Value = "=VLOOKUP(RC[-10],vRng,10,0)" rWorkRange.Offset(0, 11).Value = rWorkRange.Offset(0, 9).Value - rWorkRange.Offset(0, 10).Value Set rWorkRange = rWorkRange.Offset(1, 0) Loop Next i
Izé... Nekem se sikerült sehogy sem, pedig próbálkoztam...
Aztán utánanéztem, és ezt találtam:
"UDF's do not have the same flexibility as a standard Procedure. A UDF cannot alter the structure of a Worksheet, such as change the Worksheet name, turn off gridlines, protect the Worksheet etc. They cannot change a physical characteristic of a cell, including the one that houses the UDF. So we cannot use a UDF to change the font colour, background colour etc of any cell. They cannot be used to try and change any part of another cell in any way at all. This means a UDF cannot place a value into any other cell except the cell housing the UDF."
"Ebből csak azt nem látom még, hogy a cél-cellát hogy hivatkozzam meg az UDF-ben..."
Úgy látom, elsikkadt a 14083. hsz.
"Lehet egy Change eseménykezelővel jobban lehetne boldogulni"
Képlet számolása nem vált ki a Change eseményt.
Ha pl. B1 cellában a képlet =A1, és A1 megváltozik, akkor lesz Change, de ekkor a Target A1 lesz, és B1-et csak a Target.DirectDependents tartományból tudod kihámozni. Ha a Target.DirectDependents egyetlen cella, akkor szerencséd van. Ha több cella, akkor melyik lehet az, amit át kell színezni?
Én a forrás cellából csak rámásolnám .PasteSpecial Paste:=xlPasteFormats módon a célcellára a formátumot. A fene állítgatná egyesével azokat (mert erre következtettem a hszodból)
Sőt. A legegyszerűbb a teljes oszlopra átmásolni, lassítani nem nagyon lassít...
Nehogy egyesével állítgass be minden cellaformátum tulajdonságot AfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBulgarianCatalanChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDetect languageDutchEnglishEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekHaitian CreoleHebrewHindiHungarianIcelandicIndonesianIrishItalianJapaneseKoreanLatinLatvianLithuanianMacedonianMalayMalteseNorwegianPersianPolishPortugueseRomanianRussianSerbianSlovakSlovenianSpanishSwahiliSwedishThaiTurkishUkrainianUrduVietnameseWelshYiddish⇄AfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBulgarianCatalanChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekHaitian CreoleHebrewHindiHungarianIcelandicIndonesianIrishItalianJapaneseKoreanLatinLatvianLithuanianMacedonianMalayMalteseNorwegianPersianPolishPortugueseRomanianRussianSerbianSlovakSlovenianSpanishSwahiliSwedishThaiTurkishUkrainianUrduVietnameseWelshYiddishDetect language » Hungarian