search intr-un range

Informatii despre cum se utilizeaza Microsoft Excel 2007. Calcule, Formule, Functii, Tabele pivot, Analiza datelor, etc
catalinho
Mesaje: 191
Membru din: Dum Feb 21, 2010 11:30 am

Re: search intr-un range

Mesaj de catalinho » Lun Apr 25, 2016 2:09 pm

Salut again,

Pls, se pare ca am multe valori in celula in care se cauta valorile din range:(
Formula este perfecta, insa pls se pot returna toate valorile identificate in range?

Multumesc

Mharoco
Mesaje: 52
Membru din: Mie Apr 22, 2015 1:28 pm

Re: search intr-un range

Mesaj de Mharoco » Sâm Mai 07, 2016 11:22 am

Cu formule cred ca este foarte greu, sau ar fi o formula "kilometrica" sau una nu foarte usor de depanat. Un cod VBA sau o functie UDF cred ca ar fi mai usor.

iji
Mesaje: 9
Membru din: Vin Mai 20, 2016 9:52 pm

Re: search intr-un range

Mesaj de iji » Sâm Mai 21, 2016 1:17 am

Mharoco scrie:[...]Un cod VBA sau o functie UDF cred ca ar fi mai usor.
Ce ar trebui să conțină acea funcție?
  • argumentele funcției: fraza în care se caută; zona nomenclator; separatorul de listă; textul care să apară când nu se găsește nimic.
  • rezolvarea erorilor
  • o buclă: pentru fiecare element din nomenclator
    - dacă se găsește elementul în frază, se înmagazinează în rezultat (concatenare cu tot cu separator)
    - dacă nu se găsește, nu se face nimic
  • la ieșirea din buclă
    - dacă nu s-a găsit nimic, funcția afișează textul pentru "negăsit"
    - dacă s-a găsit măcar un element, se elimină ultimul separator și spațiul
Avem pe-aici programatori în VBA?
Am cârpit ceva, dar așa... ca un începător.
Codul e pus într-un Add-In (.xlam), ceea ce înseamnă că va putea fi folosit și în alte situații.

Cod: Selectaţi tot

Option Explicit

Function gaseste(fraza As String, zona_nomenclator As Range, separator_lista As String, text_rezultat_negativ As String) As String

Dim cell As Range

On Error GoTo RezolvEroare

gaseste = ""

For Each cell In zona_nomenclator
    If InStr(UCase(fraza), UCase(cell.Value)) <> 0 Then gaseste = gaseste & cell.Value & separator_lista & " "
Next cell

If gaseste = "" Then
    gaseste = text_rezultat_negativ
Else
    gaseste = Left(gaseste, Len(gaseste) - 2)
End If

Exit Function

RezolvEroare:
gaseste = "!!!! EROARE !!!!"

End Function

În worksheet, formula din B2:

Cod: Selectaţi tot

=gaseste(A2;nomenclator;";";"-")
unde nomenclator este tabelul din E1:E5 declarat ca tabel (Insert Table).
Până la urmă tot voi învăța să NU mai scriu pe internet cât timp nu știu să comunic cu oamenii.

Indigo
Mesaje: 774
Membru din: Sâm Sep 26, 2009 8:05 pm

Re: search intr-un range

Mesaj de Indigo » Sâm Mai 21, 2016 12:16 pm

@iji,

nu stiu cum sa interpretez:
Avem pe-aici programatori în VBA?

Ca nou forumist era "normal" sa te fi uitat la cateva (sa nu spun, studiat, anumite raspunsuri) postari de pe aici...
si ca, nu ai gasit niciun cod ceva care sa se ridice la nivelul tau sau al asteptarilor tale...si de aici intrebarea:
Avem pe-aici programatori în VBA?

Bine ai venit, sa ne scoti din nevoie!

In consecinta ai postat un Add-in (.xlsm) care sa caute anumite cuvinte intro fraza.
Cu umila recunostinta va atrag atentia ca aveti cate un spatiu dupa fiecare ultim cuvant gasit (daca ar fi dupa mine nici semnul acesta ";", nu ar avea ce cauta dupa ultimul cuvant.)

Dupa "indelungi" cautari am gasit o solutie la problema:
in loc de:
gaseste = Left(gaseste, Len(gaseste) - 2)
as folosi ori:
gaseste = Left(gaseste, Len(gaseste) - 3) - acesta va elimina spatiul de dupa ultimul cuvant
ori:
gaseste = Left(gaseste, Len(gaseste) - 4) - acesta va elimina semnul ";" si spatiul de dupa ultimul cuvant

Mii de multumiri ca doriti sa ne ajutati.

iji
Mesaje: 9
Membru din: Vin Mai 20, 2016 9:52 pm

Re: search intr-un range

Mesaj de iji » Sâm Mai 21, 2016 9:28 pm

-2 din formulă exact asta face -> elimină ; și spațiul

întrebarea cu programatorii se referea la viitor, nu la trecut.
adică îmi exprimam speranța că va veni cineva care se pricepe
și care să zică ce reguli de bună practică am încălcat cu acel cod.

am deranjat fără să fie intenția mea.
Până la urmă tot voi învăța să NU mai scriu pe internet cât timp nu știu să comunic cu oamenii.

Indigo
Mesaje: 774
Membru din: Sâm Sep 26, 2009 8:05 pm

Re: search intr-un range

Mesaj de Indigo » Sâm Mai 21, 2016 9:55 pm

întrebarea cu programatorii se referea la viitor, nu la trecut. adică îmi exprimam speranța că va veni cineva care se pricepe
și care să zică ce reguli de bună practică am încălcat cu acel cod.
Puteai sa spui asa, decat sa intrebi:
Avem pe-aici programatori în VBA?
-2 din formulă exact asta face -> elimină ; și spațiul
Nu. nu face asta. Reciteste codul sau testeaza codul.

iji
Mesaje: 9
Membru din: Vin Mai 20, 2016 9:52 pm

Re: search intr-un range

Mesaj de iji » Dum Mai 22, 2016 11:56 am

Indigo scrie:Reciteste codul sau testeaza codul.
De două zile chiar o folosesc ca să definesc taguri și nu îmi pune ; și spațiu la sfârșit pentru cod cu -2.

În schimb, nu observasem o problemă care nu apărea pentru țările testate (oarecum speciale în limba română, ex. Cehia > ceh, cehesc; Finlanda > finlandez),
dar apare pentru alte țări (ex. "Maroc" > "marocan") și la taguri: pentru "know" găsește și "unknown, acknowledge", ceea ce e neplăcut.
Până la urmă tot voi învăța să NU mai scriu pe internet cât timp nu știu să comunic cu oamenii.

iji
Mesaje: 9
Membru din: Vin Mai 20, 2016 9:52 pm

Re: search intr-un range

Mesaj de iji » Dum Mai 22, 2016 1:08 pm

Cod: Selectaţi tot

Function gaseste(fraza As String, zona_nomenclator As Range, separator_lista As String, text_rezultat_negativ As String) As String

Dim cell As Range

On Error GoTo RezolvEroare

gaseste = ""

For Each cell In zona_nomenclator
'    If InStr(UCase(fraza), UCase(cell.Value)) <> 0 Then gaseste = gaseste & cell.Value & separator_lista & " " 'problema: gaseste "Maroc" in "marocan"
    If reFindWord(cell.Value, fraza) <> 0 Then gaseste = gaseste & cell.Value & separator_lista & " " 'rezolva problema "Maroc", dar dureaza foarte mult pana intoarce rezultatul
Next cell

If gaseste = "" Then
    gaseste = text_rezultat_negativ
Else
    gaseste = Left(gaseste, Len(gaseste) - 2)
End If

Exit Function

RezolvEroare:
gaseste = "!!!! EROARE !!!!"

End Function

Function reFindWord(FindWord As String, SearchText As String, Optional MatchCase As Boolean = False) As Boolean

'functie postata de Ron Rosenfeld pe http://stackoverflow.com/questions/28100969/excel-exact-word-matching

    Dim RE As Object
    Dim sPattern As String
Set RE = CreateObject("vbscript.regexp")
sPattern = "\b" & FindWord & "\b"
With RE
    .Pattern = sPattern
    .ignorecase = Not MatchCase
    reFindWord = .test(SearchText)
End With
End Function
Până la urmă tot voi învăța să NU mai scriu pe internet cât timp nu știu să comunic cu oamenii.

iji
Mesaje: 9
Membru din: Vin Mai 20, 2016 9:52 pm

Re: search intr-un range

Mesaj de iji » Dum Mai 22, 2016 1:53 pm

am mutat funcția în fișier
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.
Până la urmă tot voi învăța să NU mai scriu pe internet cât timp nu știu să comunic cu oamenii.

catalinho
Mesaje: 191
Membru din: Dum Feb 21, 2010 11:30 am

Re: search intr-un range

Mesaj de catalinho » Sâm Mai 28, 2016 6:43 am

Multumesc!

Închis

Înapoi la “Intrebari despre Excel 2007”