Hirdetés

2024. május 3., péntek

Gyorskeresés

Útvonal

Fórumok  »  Szoftverfejlesztés  »  Visual Basic

Hozzászólások

(#1551) 26centi


26centi
csendes tag

sziasztok,
én is most teszem kezdőlépéseimet vba-ban. és nem szeret engem. se.

egy óriási adathalmaz adott feltétel alapján kiválasztott sorát szeretném egy másik munkalap, változóban (n) tárolt számú sorába másolni. kreáltam is egy kódot.

Do
Sheets("tools in SAP 3100").Activate 'forrás munkalap

If Cells(i, 14) = "#Hiányzik" Then
Rows(i).Select ' átmásolandó sor
Selection.Copy
Sheets("missing cost centers").Select 'cél munkalap
Rows(n).Select 'ezen a ponton kiakad, Application-defined or object defined error üzenettel Hibakód:1004
ActiveSheet.rows(n).Paste
n = n + 1

End If
i = i + 1

Loop Until Cells(i, 1) = ""

sajnos a hibakód helpjét elolvasva sem kaptam a leghalványabb utalást sem hogy mi a nyűgje. két sorral feljebb pedig ugyanez az utasítás működik.

van valakinek ötlete, hogy miért nem vagyunk barátok?

előre is kösz,
derűs, dolgos munkanapot

(#1552) martonx válasza 26centi (#1551) üzenetére


martonx
veterán

Szia!

Így látatlanban az n-re gyanakodnék. Ez egy globális változó? Létezik ezen a helyen, ahol használni akarod?

Én kérek elnézést!

(#1553) 26centi válasza martonx (#1552) üzenetére


26centi
csendes tag

nos nem tudom mit jelent az pontosan, hogy létezik-e ezen a helyen, de miután deklaráltam, és még értéket is adtam neki ugyanezen subrutinban, gondolom létezik. ha más nem, értékadásnál már nyafogott volna, hogy baja van, de az lefut. :W

Sub missing_cost_centers()

Dim i, n As Integer

i = 9
n = 2
Do
Sheets......

(#1554) ArchElf válasza 26centi (#1553) üzenetére


ArchElf
addikt

Sheets("missing cost centers").Select 'cél munkalap
helyett lehet, hogy egy
Sheets("missing cost centers").Activate 'cél munkalap
kellene...

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#1555) Homer válasza 26centi (#1551) üzenetére


Homer
tag

Szia!
Ha tudod a sorok számát akkor:

Sub Akarmi()
Worksheets(1).Select
Dim ujsor As Integer
ujsor = 1
For Index = 1 To 10
Rows(CStr(Index) & ":" & CStr(Index)).Select
If Cells(Index, 2).Text <> "#HIÁNYZIK" Then
Selection.Copy
Worksheets(2).Select
Rows(CStr(ujsor) & ":" & CStr(ujsor)).Select
ActiveSheet.Paste
Worksheets(1).Select
ujsor = ujsor + 1
End If
Next Index
End Sub

Egyébként én cellánként másolgatnám az értékeket anélkül, hogy mindig kijelölgetném a második worksheetet valahogy így:

Ha a vizsgált cella értéke megfelelő akkor
Worksheets(2).Cells(XY).text=worksheets(1).cells(ZY).text
(Sokkal gyorsabb lesz afutása a makrónak, és nem vibrál a kép futás közben ;) )

Jah, bocs, elfelejtettem írni, hogy az a baj, hogy a sor kijelölésének formája:
Rows("1:1").select
Ebből gondolom látod mi a gond: String paramétert várna a rows sub
Remélem segítettem :)

[ Szerkesztve ]

(#1556) Homer válasza 26centi (#1551) üzenetére


Homer
tag

Ha tudod a sorok számát akkor még ehhez hasonlóval is próbálkozhatsz:

For Each elem In Range("A1:A10")
MsgBox (elem.Text)
Next

(#1557) martonx válasza Homer (#1555) üzenetére


martonx
veterán

tényleg a kép vibrálásra alkalmazd a makród elején az application.screenupdate = false
a makród végén meg az application.screenupdate = true módszert
Ezzel is rendesen lehet gyorsítani a futáson.

Én kérek elnézést!

(#1558) 26centi válasza Homer (#1555) üzenetére


26centi
csendes tag

Helló,

Kösz az ötleteket, sajnos a megoldás nem ez lett. :F Nem értem, hogy miért, de annak ellenére, hogy egy alőző sorban aktiválom (mindegy, hogy .select vagy .activate-el) a cél munkalapot, a rows(n).select sort csak úgy fogadja el, hogy előtte a munkalapot is beírom.
Ez működik:
Worksheets("missing cost centers").Activate
Worksheets("missing cost centers").Rows(n).Select

Ez nem működik:
Worksheets("missing cost centers").Activate
Rows(n).Select (Rows(CStr(n) & ":" & CStr(n)).Select -el sem)

A makrót ugyan a forrás munkalaphoz hoztam létre, de ha ez a baj, akkor sem értem a hibaüzenetet. Ha a cél munkalap aktiválása a sor kiválasztás sorra már nem hat, akkor miért nem választja ki az n. sort az anya-(forrás)munkalapon???

Úgy látszik itt még bőven van mit megtanulni a hivatkozásokról, mert a hétköznapi logika alapján ez elég katyvasz.

Egyébként kösz a tippeket, a cellánkénti másolás és a képernyőfrissítés kikapcsolása is hasznomra lesz még. :))

Derűs, dolgos munkanapot

(#1559) ArchElf válasza 26centi (#1558) üzenetére


ArchElf
addikt

Használd akkor így:
Worksheets("missing cost centers").Activate
ActiveWorksheet.Rows(n).Select

(vagy ActiveSheet - fejből nem tudom...)

AE

[ Szerkesztve ]

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#1560) Homer válasza 26centi (#1558) üzenetére


Homer
tag

Szia!
"A makrót ugyan a forrás munkalaphoz hoztam létre..."
Szerintem ezzel is lehet gond. Csinálj egy modult és másold át abba a makródat. Egy próbát megér.

Közben rájöttem, hogy balgaságot írtam. :B
A Rows nem csak Stringet hanem integert is el kellene hogy fogadjon, tehát a
Rows("2:2").select-nek ugyan úgy működnie kéne mint a Rows(2)-nek.
Bocs. :)

(#1561) Baboka


Baboka
tag

Sziasztok!

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A1:A50")) Is Nothing Then Exit Sub
If Selection.Cells.Count > 1 Then Exit Sub
If Target <> "" Then
Rows(Target.Row).Interior.ColorIndex = 10
Else
Rows(Target.Row).Interior.ColorIndex = xlNone
End If
End Sub

ezt a programot szeretném úgy átalakítani hogy ha kijelölök egy cellát akkor az egész sort beszinezze, de ha másik cellát jelölök ki akkor az előző sor visszaálljon az előző állapotába.

(#1562) Homer válasza Baboka (#1561) üzenetére


Homer
tag

Szia!

Nem teljesen értettem amit akartál, de ha minden igaz akkor ilyesmi válaszra vársz. :)
Egyrészt az nem teljesen világos, hogy az intersect minek bele? Gondolom a több cella egyszerre történő kijelölése végett van benne, így ez esetben az általam javasolt megoldás nem működik majd. De azért gondolkodtam rajta. Tess:

Public elozo, default As Integer
Const uj = 3

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

'Az új sor színének beállítására
Rows(Target.Row).Interior.ColorIndex = uj

'Annak a vizsgálatára, hogy kell-e visszaállítani formátumot, azaz első kijelölés, vagy már volt előtte kijelölve valami?
If elozo <> 0 Then
Rows(elozo).Interior.ColorIndex = default
End If

'Az előzőleg kijelölt sor száma
elozo = ActiveCell.Row

' itt az eredeti cella formátumát kellene beállítani az 5 helyett de ezt pontosan nem értettem a leírásodból... :S
default = 5
End Sub

(#1563) Sweet Lou 6


Sweet Lou 6
addikt

Üdv.

Tud valaki linkelni olyan forrást, amelyből megtanulhatom a VB.NET szintaktikáját? :R

sweetlou6.wordpress.com

(#1564) Homer válasza Sweet Lou 6 (#1563) üzenetére


Homer
tag

Üdv.

Pár könyv amiket én nézegettem:
Magyar és angol nyelven is elérhetők:
Fekete (és Kék) könyv. (Black book)
Alex Mackey - A NET 4.0 és a VS 2010

Csak angol:
Visual Basic 2010 Programmer's Reference
Professional Visual Basic 2010 and .NET 4
Visual_Studio_2010_All-in-One_For_Dummies

...és ha nagyon kezdő vagy (, mint én is), akkor ezek is hasznosak lehetnek, mert a VB alapok elsajátításához szerintem jók:
James Foxall - Tanuljuk meg a Visual Basic 2005 használatát 24 óra alatt
Demeter M. Ibolya - Visual Basic 6.0 lépésről lépésre
Juhász Tibor, Kiss Zsolt- Visual basic 2008-2010 Programozasi összefoglalo
Tóth Bertalan - Programozzunk vb rendszerben

(Úgy írtam a neveket, hogy rákeresve gugliban az első-második találat már a közvetlen link lesz.)

[ Szerkesztve ]

(#1565) Sweet Lou 6 válasza Homer (#1564) üzenetére


Sweet Lou 6
addikt

köszönöm szépen :R

sweetlou6.wordpress.com

(#1566) martonx válasza Sweet Lou 6 (#1563) üzenetére


martonx
veterán

internet :Y

Én kérek elnézést!

(#1567) Sweet Lou 6 válasza martonx (#1566) üzenetére


Sweet Lou 6
addikt

igen, de annyira nem vagyok még jó angolból, hogy onnan tanuljam...

[ Szerkesztve ]

sweetlou6.wordpress.com

(#1568) martonx válasza Sweet Lou 6 (#1567) üzenetére


martonx
veterán

Pedig a videók elég beszédesek, legyenek bármilyen nyelven.

Én kérek elnézést!

(#1569) Baboka válasza Homer (#1562) üzenetére


Baboka
tag

Köszönöm ez egyelőre jó. Az előző formátumnál arra gondoltam hogy ez a színezés ez egy előre formázott táblázatban lesz, nagyon sok oszlopa van azért kell ez hogy az egész sort átszínezi ha rajta állok és ha más sorba kerül az aktív cella akkor, az előző sornak a formátumát állítsa vissza. Nem tudom mennyire írom érthetően, még eléggé amatőr vagyok VBA-ból :D

(#1570) Homer válasza Baboka (#1569) üzenetére


Homer
tag

Örülök, hogy segíthettem. :)

Egyébként ajánlok neked is egy könyvet:
Balogh Gábor - Visual Basic és Excel programozás
a neten megtalálod...

Megpróbálom elmagyarázni mi nem volt teljesen világos:

- Szóval ha van egy táblázatod amiben minden sor (esetleg minden oszlop is) egyforma formátumú, akkor nem gond ha előre meghatározott stílust állítasz be default értéknek.
régi sor(x) stílus = régi formátum

- Ha a sorok megegyeznek, de az oslopok formátuma eltér (pl színük más) akkor a cellék formátumát egyesével kell állítgatni.
régi cella(régi sor, oszlop(1...x)) formátuma = default cellastílus (régi sor, oszlop(1...x) formátuma

- Ha az eredeti sorok formátumai is eltérnek egymástól (azaz különbözőek), akkor még bonyolultabb a helyzeted, mert a default értéket az eredeti stílus szerint kell meghatározni.
tehát pl a visszaállításnál a
cella1 stílus = eredeti cellaformátum1.oszlop
cella2 stílus = eredeti cellaformátum2.oszlop
...

Tudom nem teljesen érthető a magyarázat, bocs. :)

(#1571) Baboka válasza Homer (#1570) üzenetére


Baboka
tag

Sajnos a legutóbbi lesz, megpróbálom akkor ezt a megoldást, ezer köszönet :))

(#1572) EkSYS


EkSYS
senior tag

Sziasztok!

Abban tudna valaki segiteni hogy hogyan lehet egy combobox tartalmát betölteni egy adott tartományból? (esetleg egy egyszerü példa is hasznos lenne :K )

köszi!

Szerk: rá is jöttem:
Me.ComboBox1.List = Worksheets("Sheet1").Range("B12:B376").Value

[ Szerkesztve ]

Eki - az eredeti

(#1573) erich85T


erich85T
csendes tag

Sziasztok!

Múltkor már írtam a fórumban, és kaptam is segítséget amiért nagyon hálás vagyok, nagyon megkönnyítette a munkámat. Azonban akadt egy másik problémám is amit megkellene oldanom excelben, remélem ismét sikerül valamiféle segítséget kapnom.

Feladat: Kamatszámítás
Adott egy excel táblázat egy „Tartozások”, valamint egy „Jegybanki alapkamat” munkalappal.
A „Tartozások” munkalapon az alábbi oszlopok vannak:
Tartozás kezdetének dátuma - Tartozás kiegyenlítésének dátuma – Név - Tartozás összege (kamat nélkül) - Tartozás összege (kamattal)
Az első 4 oszlopban lévő adatok adottak, nekem az 5. oszlopba kellene valamilyen módon Excel segítségével összeget számolnom a „Tartozás kezdetének dátuma „ valamint a „Tartozás kiegyenlítésének dátuma” alapján a „Jegybanki alapkamat” fülön lévő értékekkel.

A probléma az, hogy egy adott kezdő dátumtól az adott kiegyenlítés dátumáig akár több jegybanki alapkamat változás is történik. Eszerint több jegybanki alapkamattal kell számolni az adott intervallumban ahhoz, hogy megkapjuk a „Tartozás összege (kamattal)” oszlop értékeit.

Tehát röviden: Egy kezdő és egy befejező dátum közötti intervallumban az alaptartozásra akarom megkapni a kamattal számolt tartozás összegét úgy, hogy az adott dátumtól dátumig lévő időszakban több jegybanki alapkamattal kell számolnom.

Excel fájl: http://muszakitanacsado.hu/doksi/kamatszamitas2.xlsx

Találkozott e már valakin hasonló feladattal? Van-e valakinek valamiféle megoldása rá? Excelben ez egyszerűen megoldható vagy makroprogramot kell rá írni?

Előre is köszönöm a hozzászólásokat! :) :R

(#1574) martonx válasza erich85T (#1573) üzenetére


martonx
veterán

Hát fel kellett fognom a problémát. Makroval biztosan meg lehet oldani, de azzal sem egyszerű. Függvények szvsz erre nem alkalmasak.
Igaziból háttal ülsz a lovon. A nagy cégek nem véletlenül csinálják, hogy:
1. Vagy minden hónap végén ráteszik a késedelmi kamatot a folyószámlára, az éppen aktuális kamattal
2. Vagy a késedelmi kamat kiterhelésekori éppen aktuális kamattal számolnak, és ha pl. az ügyfél fizetni akar, vagy értesítőt küldenek neki, akkor ez az éppen aktuális szám szerepel rajta.
3. A kettő módszer keveréke, havonta ráteszik a késedelmi kamatot, akit pedig hó közben érdekel az aktuális állás, annak a 2-es módszerrel kiszámolják az utolsó hóközijét.
A szerződések apró betűs részeiben ez szerepelni is szokott. Éppen ezért, mert így utólag ember legyen a talpán, aki visszanézi a régi kamatokat, ezekhez számol munkanapokat, és a többi. Br...
De biztosan meg lehet csinálni, ha rengeteg időt rászánsz, biztos egész szép megoldások is születhetnek.
A problémád inkább algoritmikus jellegű, mintsem VB specifikus.

Én kérek elnézést!

(#1575) erich85T válasza martonx (#1574) üzenetére


erich85T
csendes tag

Köszönöm válaszod! Más véleményét is szívesen meghallgatom még. :)

(#1576) martonx válasza erich85T (#1575) üzenetére


martonx
veterán

Illetve még annyi, hogy azt nem tudom mi lenne az APEH/törvények által megkövetelt eljárás rend?
Leginkább azon lepődnék meg, ha ténylegesen visszamenőlegesen kellene számolgatni, az általad vázolt megoldás szerint.

Én kérek elnézést!

(#1577) ArchElf válasza martonx (#1576) üzenetére


ArchElf
addikt

Elméletileg mindig az elszámolás napján (havi elszámolásnál mindig a hónap fix napján, éves elszámolásnál az év fix napján; stb.) érvényes kamatlábbal kell számolni.

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#1578) martonx válasza ArchElf (#1577) üzenetére


martonx
veterán

Akkor jól sejtettem, hogy ilyen a gyakorlatban nincs, hogy én most kitalálom, hogy nekem tartzotott XY 2005 és 2008 között, és most kiszámolom az akkori kamatokkal a késedelmét visszamenőleg.
Persze matematikai, excel, algoritmus feladványnak jó.

Én kérek elnézést!

(#1579) ArchElf válasza martonx (#1578) üzenetére


ArchElf
addikt

Hát, ha akkor tartozott és a szerződés szerint az aktuális kamatláb az irányadó, akkor az akkori értékekkel kell kiszámolni (már ha a szerződés pl az írja elő, hogy havonta kell nyilvántartani a tartozás mértékét).

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#1580) martonx válasza ArchElf (#1579) üzenetére


martonx
veterán

természetes, viszont ha 2008-ban megszűnt a tartozása, mi jogalapod van most kitalálni, hogy de te kérsz késedelmi kamatot?
Illetve ha eddig nem küldtél neki, az akkori késedelméről kamatot, akkor most egyszer csak küldhetsz?

Én kérek elnézést!

(#1581) kozicsd


kozicsd
tag

Sziasztok

Lenne egy pár nagyon alap feladat, amit az öcsémnek meg kellene csinálnia. Én a vba-t nem vágom, ezért fordulok hozzátok, hogy le tudjam ellenőrizni. Nagyon fontos lenne :)
1.feladat:Írasd ki egy kollekció összes elemnének a nevét!
2.feladat:Az első 100 páratlan számot add össze!
3.feladat:Írj eljárást, ami az összes cellát nagybetűssé teszi!
4.feladat:Írj eljárást, ami paraméterként kap két fájlt, és az első fájl tartalmát belemásolja a másodikba!

Köszönöm előre is a segítséget :)

üdv
Dávid

(#1582) ArchElf válasza kozicsd (#1581) üzenetére


ArchElf
addikt

Linkeld be a megoldásaid (amit felraksz monjuk a pastebin-re) és ha nem megy, megmondjuk mi bennük a gond.

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#1583) kozicsd válasza ArchElf (#1582) üzenetére


kozicsd
tag

Szia

Az a baj, hogy én C-ben meg tudnám csinálni, de Vba-ban kell, és ahhoz semmit nem értek :S Tehát még ötletem sincs hogy induljak neki.

(#1584) ArchElf válasza kozicsd (#1583) üzenetére


ArchElf
addikt

C és VBA közti alapvető különbségek:
nincs { }
nincs ; a sor végén
nincs == helyette is = kell
nincs != helyette <> kell
nincs return, hanem Exit Funtion és Exit Sub
a visszaadandó értéket Function esetén a funkció nevének megfelelő változóba (nem kell inicializálni) kell tenni.
For-nak Next a párja, a break pedig az Exit For (continue nincs se for-ban, se loop-ban)
nem
if ( ... )
{ ... }
else
{ ... }

hanem
If ... Then
...
Else
...
End If
nem
while (...)
{ ... }
hanem
do while (...)
...
loop

ha egy metódus Sub és nem Function akkor nincs visszaadott érték és nem kell az argumentumokat zárójelbe tenni
Nem kell a változókat inicializálni (kivéve az osztályokat).

+ van help, a metódusokat meg lehet találni benne

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#1585) kozicsd válasza ArchElf (#1584) üzenetére


kozicsd
tag

Köszi Főnök, sokat segítettél :DDD

(#1586) vilag


vilag
tag

Halihó!

Egy újabb problémával találtam magam szemben VBA kapcsán.

Van nekem egy adattáblám ami, ugyebár tartalmazza az adatokat.
Userformon szeretnék keresést eszközölni a megfelelő kulcsadat segítségével.
A probléma pedig abban áll, hogy jelenleg csak úgy tudom visszakérni a megfelelő sor megfelelő oszlopának adatát, ha megmondom neki, hogy hanyadik oszlopból kérem vissza a kívánt adatot.
A cél viszont az lenne, hogy ne oszlopszámot kelljen megadnom, hanem az oszlopfejléc nevét, mert könnyen lehet, hogy még plusz oszlopokat kell közbeszúrnom, és ekkor minden egyes oszlopszámra hivatkozó kódrészletet újra kéne kézzel számolnom.
Jelenleg így használom:

ComboBox4.Text = gtorzs.Cells(gsor, 7)

ahol gtorzs=a munkalap neve
gsor=a kiván sor sorszáma
7=oszlop száma

Tehát azt szeretném, hogy a "7" helyett legyen az oszlopfejléc neve (tudom, az hosszabb lesz, de így bárhová tehetném a táblán belűl).

Hogyan tudnám ezt kivitelezni?

Köszönöm a segítséget!
Üdv, vilag

(#1587) Homer válasza vilag (#1586) üzenetére


Homer
tag

Én úgy oldanám meg első körben, hogy a fejléc sorain végigmennék egy each cells in row(1) ciklussal, aztán egy változóban eltárolnám azt az oszlopszámot ahol a cella értéke megyezik a keresett oszlopnévvel. Ezután már hivatkozhatsz arra az oszlopra mint oszlop sorszám...

(#1588) Homer válasza Homer (#1587) üzenetére


Homer
tag

Vagy pl:

Public Sub test()
Dim Keresett As String
Keresett = "Keresettoszlopszövege"
oszlop = 1
Dim megvan As Boolean
megvan = False
While Worksheets("Munka1").Cells(1, oszlop) <> Keresett And Not megvan And _ Worksheets("Munka1").Cells(1, oszlop) <> ""
oszlop = oszlop + 1
If Worksheets("Munka1").Cells(1, oszlop) = Keresett Then megvan = True
Wend
If megvan Then MsgBox (Keresett & " megvan, a következő oszlopban: " & oszlop) Else MsgBox ("Nincs meg")
End Sub

Mondjuk ha a keresett oszlop pont az első akkor nem működik, de nem tartana sokáig módosítani, hogy azzal is működjön. (Neked is hagyok gondolkodni valót :) )

(#1589) EkSYS


EkSYS
senior tag

sziasztok!

Ha valaki esetleg tud segíteni abban hogy miként lehet egy makró futása közben egy user inputtal várakoztatni a továbbfutást (mondjuk egy formon van több text és combo, és amikor ezek tartalmát ellenőríztetem egy makróval akkor ha üres textb.-t talál akkor klikkeljen bele a text.-be és egy msgbox vagy ok után menne tovább) , érdekelne
b

Eki - az eredeti

(#1590) martonx válasza EkSYS (#1589) üzenetére


martonx
veterán

Lehet nem jól értelek, de pont így ahogy írod.

Én kérek elnézést!

(#1591) vilag válasza Homer (#1588) üzenetére


vilag
tag

Üdv!

Ez akár jó is lehetne, de túl hosszú és ha jól látom akkor minden egyes (keresett) oszlopfejléc szövegre meg kéne írni, ami több fáradtság lenne, mint ha minden egyes változáskor (ami mondjuk ritkán fog változni ha egyszer elkészült az egész) kézzel újraszámozom a megfelelő kódrészletet.

Nincs esetleg valami rövidebb megoldás?

Én gondoltam a vlookup-ra, de aztán elvetettem, minthogy meg kéne adni melyik oszlopban keresse a keresési értéket, de ha ezt tudnám akkor már nem volna szükség az egészre.

Tulajdonképpen nekem az is elég lenne, ha találnánk valami olyan megoldást ami megmondja, hogy a keresett szöveg milyen számú oszlop milyen számú sorában van (persze elég csak az oszlop száma is). Innen már nyert ügyünk lenne.

Egyébként köszönöm az eddigi ötletelést is!

(#1592) Homer válasza vilag (#1591) üzenetére


Homer
tag

Ha olyan függvényt írsz ami paraméterként megkapja a keresett szöveget, visszaadási értéke pedig az oszlop száma akkor elég egyszer megírni:

Pl:

private function oszlop(byval mitkeresel as string) as integer
itt pedig a fent leírt módszerrel
end

(#1593) Homer válasza vilag (#1591) üzenetére


Homer
tag

Ha olyan függvényt írsz ami paraméterként megkapja a keresett szöveget, visszaadási értéke pedig az oszlop száma, akkor elég egyszer megírni, utána használhatod a függvényt ahányszor, és ahol csak akarod!

Valahogy így:

private function oszlop(byval mitkeresel as string) as integer
itt, a fent leírt módszerrel a fejlécsor összes elemén végigmész, majd
ha megvan a keresett oszlop akkor
return keresettoszlopszám
else
msgbox("Nincs meg minden oszlop")
end

[ Szerkesztve ]

(#1594) martonx válasza vilag (#1591) üzenetére


martonx
veterán

A baj az, hogy amit szeretnél az kivitelezhető, de összetettsége miatt baromira nem egy fórum keretein belül.
Klasszikusan elértél arra a szintre, ahol vagy veszed a fáradtságot és magadtól kimókolod a megoldást, vagy fizetsz érte, és helyetted egy szabadúszó programozó valamelyik ráérős estéjén megcsinálja neked.

Én kérek elnézést!

(#1595) Homer válasza martonx (#1594) üzenetére


Homer
tag

Nem olyan bonyolult ez. Nekem nem ez a munkám, de érdekel a dolog.
Ezt hoztam össze:

Public Sub proba()
....MsgBox (keres("h"))
End Sub

Public Function keres(mit As String) As Integer
...Dim elem As Object
...Dim oszlop As Integer
...oszlop = 0
...For Each elem In Range("A1", "Q1")
.....oszlop = oszlop + 1
.........If mit = elem.Value Then
.............keres = oszlop
.........End If
...Next
End Function

Hogy olvashatóbb legyen bepontpontpontoztam. :) Persze ha picit még gondolkodnék rajta biztosan találnék más megoldást is. (Pl. az elem típusa nem túl elegáns object-ként kezelve, dehát műxik.)

A lényeg, hogy ha írsz egy ilyen function-t akkor azt bárhányszor meghívhatod a fenti sub-ban. Ez a megoldás A-tól Q oszlopig vizsgálja az egyezéseket. Ha nincs egyezés akkor 0-val tér vissza a függvény.

[ Szerkesztve ]

(#1596) martonx válasza Homer (#1595) üzenetére


martonx
veterán

Nekem meg ez a munkám, de annyira nem érdekel a dolog, hogy a nagyon hosszú leírásból egyáltalán kibogozzam, hogy mit is szeretne emberünk. A megoldásod tényleg elég egyszerű.

Én kérek elnézést!

(#1597) vilag válasza Homer (#1595) üzenetére


vilag
tag

Üdv!

Esetleg mit szóltok az excel "hol.van" (match) függvényére. Nekem úgy tűnik használható lenne az adott problémára.

Az ötlet egyébként a kollégámé, őt illeti a dícséret.

Microsoft excel súgó:
"A függvény egy olyan elem tömbben elfoglalt relatív pozícióját adja vissza, amely megadott értékkel megadott módon egyezik. A HOL.VAN abban különbözik a többi kereső függvénytől, hogy a megtalált elem helyét adja meg, és nem magát az elemet.

Szintaxis

HOL.VAN(keresési_érték;tábla;egyezés_típus)

Keresési_érték: Az az érték, amelynek segítségével a táblázatban a keresett érték megtalálható."

(#1598) ArchElf válasza vilag (#1597) üzenetére


ArchElf
addikt

Igen, és a Match elfogad wildcard-ot is (* és ?)

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#1599) Homer válasza vilag (#1597) üzenetére


Homer
tag

Én még sosem használtam eddig a HOL.VAN függvényt, de jah, igazad van! Azzal is meg lehet oldani a feladatot. (Mondjuk a fenti megoldásom is hasonló eredményt adna.) :)
A konkrét feladattól függ, hogy én melyiket használnám. Ha nem muszáj makrobizni, akkor én a helyedben megmaradnék a "gyári" függvényeknél...

(#1600) martonx válasza Homer (#1599) üzenetére


martonx
veterán

Igen, a VBA makró jártasságod következő szintje, amikor visszatérsz a gyári függvényekhez, és szükség szerint azokat hívogatod makróból.
A HOl.VAN egyébként az OFSZET-tel kiegészítve brutál dolgokat tud.

Én kérek elnézést!

Útvonal

Fórumok  »  Szoftverfejlesztés  »  Visual Basic
Copyright © 2000-2024 PROHARDVER Informatikai Kft.