Sviluppare funzionalita su Microsoft Office con VBA Ricerca di decine in una tabella

LoginRegistrati
Stai vedendo 17 articoli - dal 1 a 17 (di 17 totali)
  • Autore
    Articoli
  • #21165 Risposta

    silverbx70
    Partecipante

      Buongiorno , rieccomi sono il vecchietto amico stretto del dottor Alzheimer . Ricorro nuovamente al Vostro aiuto per aiutarmi a risolvere un problema : Ho una tabella di <em>n </em>record ognuno formato da 9 numeri ; ho bisogno di sapere se alcuni di questi numeri appartengono alla stessa decina. Mi spiego meglio : 12 17 35 44 56 67 72 85 90  ( non soddisfa la condizione perche' due numeri appartengono alla sessa decina - 12 e 17 ) , 1 15 23 32 45 51 63 77 82 ( soddisfa la condizione perche' nessun numero appartiene alla stessa decina di un'altro ). Questo e' tutto. Probabilmente per Voi sara' una sciocchezza ma per me .....

      Non allego nessun listato perche' , nonostante le ripetute prove ,non ho cavato un ragno dal buco. Ringrazio tutti per l'attenzione e concludo ripetendo che , per chi vuole , c'e'  sempre "  'o ccafe pavato " . Buona giornata a tutti dal "vecchio 'nzallanuto"  

      #21166 Risposta

      Ciao silberbx70,

      Cosa intendi per una tabella <em>n </em> ( se significa qualcosa non ne conosco il significato)?

      Inoltre come output vuoi la stessa tabella con 1 e 0 nelle caselle in cui la condizione è soddisfatta o no?

      #21167 Risposta
      Luca73
      Luca73
      Partecipante
        18 pts

        Ciao il programma non serve ma un file si, almeno per capire come sono i dati. Celle diverse, stringhe di numeri con spazio,... 

        Io partirei con un vettore da 0 a 9 di booleani tutto a falso poi prenderei i singoli vettori e li ciclerei dividendo ognuno di componenti per 10 e ne prendendo l'intero, ovvero la decina di appartenenza, (oppure la cifra più a sinistra) verifico se la relativa posizione del vettore è falsa non è duplicata altrimenti la metto a vero e comincio con il numero dopo.

        Devi poi spiegare come vuoi il risultato.....

        Ciao

        Luca

         

        #21170 Risposta

        vecchio frac
        Senior Moderator
        • Sfida #1
          171 pts

          silverbx70 ha scritto:

          sono il vecchietto amico stretto del dottor Alzheimer

           voi mi farete morire 

          #21171 Risposta

          vecchio frac
          Senior Moderator
          • Sfida #1
            171 pts

            Luca73 ha scritto:

            Io partirei con un vettore da 0 a 9 di booleani

            Buona l'idea, io farei invece una collection al volo in cui infilerei le decine ricavate dai numeri e costruirei così una piccola UDF che restituisce vero o falso se la riga di numeri (da A a I) non contiene ripetizioni di decine oppure sì. La filosofia è la stessa.

            Option Explicit
            
            Function decine(riga)
            Dim cel As Range
            Dim coll As Collection
            
                Application.Volatile
                
                On Error GoTo e
                Set coll = New Collection
                
                For Each cel In Range(Cells(riga, 1), Cells(riga, 9))
                    coll.Add cel \ 10, CStr(cel \ 10)
                Next
                
                decine = True
                Exit Function
                
            e:
                If Err.Number = 457 Then
                    decine = False
                    Exit Function
                End If
                
            End Function
            #21176 Risposta

            silverbx70
            Partecipante

              Ciao , no e' che la n e' in corsivo per cui il programma l'ha letta come .

              La N sta per un numero indefinito ( come adesso avrai capito sicuramente ).  Il risultato dovrebbe andare in una variabile . I dati sono omogenei e sono sortati dal piu' piccolo al piu' grande.

              Provo con il listato del coetaneo "VECCHIO" frac ed ovviamente faro' sapere.

              A dopo 

              P.S. Se funziona gli compro un frac nuovo   

              'O Viecchio

              #21177 Risposta

              vecchio frac
              Senior Moderator
              • Sfida #1
                171 pts

                silverbx70 ha scritto:

                Se funziona gli compro un frac nuovo

                Anche una birra va benissimo 🙂

                Se ci riesci da solo meglio, perchè non ti ho spiegato come funziona... vediamo se ti arrabatti 🙂

                #21178 Risposta
                Luca73
                Luca73
                Partecipante
                  18 pts

                  Ciao 

                  Ecco un paio di proposte una basata su range (come VF: ciao) e una basata su stringa.

                  Function DecineRipetute(MiaStringa) As Boolean
                  
                  Dim MioVettoreInput
                  Dim MioVettoreOutput(0 To 9) As Boolean
                  Dim Indice As Integer
                  
                  DecineRipetute = False
                  For Indice = 0 To 9
                      MioVettoreOutput(Indice) = False
                  Next
                  MioVettoreInput = Split(MiaStringa, " ")
                  For Indice = 0 To UBound(MioVettoreInput, 1)
                      If Not MioVettoreOutput(MioVettoreInput(Indice) \ 10) Then
                          MioVettoreOutput(MioVettoreInput(Indice) \ 10) = True
                      Else
                          DecineRipetute = True
                          Exit Function
                      End If
                  Next
                  End Function
                  
                  Function DecineRipetute2(RangeW) As Boolean
                  
                  Dim MioVettoreOutput(0 To 9) As Boolean
                  Dim Indice As Integer
                  Dim CellW As Range
                  DecineRipetute2 = False
                  
                  For Indice = 0 To 9
                      MioVettoreOutput(Indice) = False
                  Next
                  For Each CellW In RangeW
                      If Not MioVettoreOutput(CellW \ 10) Then
                          MioVettoreOutput(CellW \ 10) = True
                      Else
                          DecineRipetute2 = True
                          Exit Function
                      End If
                  Next
                  End Function
                  

                   

                  #21179 Risposta

                  vecchio frac
                  Senior Moderator
                  • Sfida #1
                    171 pts

                    Un problema, mille soluzioni 🙂

                    #21181 Risposta

                    vecchio frac
                    Senior Moderator
                    • Sfida #1
                      171 pts

                      Oppure con una formuletta:

                      =MATR.SOMMA.PRODOTTO(CONTA.SE(A1:I1;A1:I1)-1)>0

                      Questa dovrebbe verificare se ci sono duplicati nella riga. Vale per la riga 1 (da A1 a I1) ma naturalmente basta trascinare giù per applicarla alle righe della tabella interessata e restituisce VERO o FALSO se esiste almeno un duplicato (ma non identifica le celle duplicate).

                      Non riesco a forzare la divisione per dieci (per tener conto delle sole decine), ma Luca che è esperto di formule forse riesce a correggerla 🙂

                      Altrimenti puoi usare anche una formattazione condizionale.

                      Un problema, centomila soluzioni 🙂

                      #21183 Risposta
                      Luca73
                      Luca73
                      Partecipante
                        18 pts

                        Ciao a livello formule opterei per 

                        =MAX(FREQUENCY(A1:H1;{0\10\20\30\40\50\60\70\80\90}))>1

                        a voi la traduzione.....anche della forma vettoriale

                        Ricordo (come mi insegno qualcuno ma non ricordo più chi forse Scossa..) che per scrivere un vettore di numeri basta scriverlo in celle diverse, poi riferirlo nella cella come range, selezionarlo e poi pigiare F9

                        Nel caso io ho scritto i Valori in A10 J10 da 0 a 90 poi la mia formula era

                        =MAX(FREQUENCY(A1:H1;A10:J10))>1 poi ho selezionato A10:J10 e ho pigiato F9. Molto utile anche perchè la scrittura dei vettori ho scoperto cambiare da italiano ad inglese...

                        Ciao

                        Luca

                        #21184 Risposta
                        Luca73
                        Luca73
                        Partecipante
                          18 pts

                          La formula va modificata come

                          =MAX(FREQUENCY(A1:H1;{0\9\19\29\39\49\59\69\79\89\99}))

                          altrimenti crea errori sulle decine intere

                          si puo semplificare come 

                          =MAX(FREQUENCY(A1:H1;COLUMN(A1:J1)*10-1))

                          Ciao

                          Luca

                          #21185 Risposta

                          vecchio frac
                          Senior Moderator
                          • Sfida #1
                            171 pts

                            vecchio frac ha scritto:

                            Luca che è esperto di formule forse riesce a correggerla

                            Io lo sapevo 🙂

                            Luca73 ha scritto:

                            =MAX(FREQUENCY(A1:H1;COLUMN(A1:J1)*10-1))

                            #21189 Risposta

                            riprendendo l'inizio della funzione di Luca73, ho implementato una funzione molto intuitiva. Essa va chiamata in ogni cella della tabella, non lavora sul range della tabella

                            Function DecineRipetute(MiaStringa As String) As Boolean
                            
                            Dim Vettore_int() As Integer       ' vettore di numeri
                            Dim Vettore_str() As String        ' vettore stringa
                            Dim temp As Integer
                            Dim n_Vettore As Byte              ' massima lunghezza sarà 9 quindi basta
                            
                            'Inizializzo il vettore di numeri
                             
                            Vettore_str = Split(MiaStringa, " ")
                            n_Vettore = UBound(Vettore_str)    ' dimensioni del vettore stringa
                            ReDim Vettore_int(n_Vettore)       ' ridimensiono vettore dei numeri
                            
                            ' Creo un vettore di numeri con solo le decine
                            For i = 0 To n_Vettore
                                 temp = Vettore_str(i)               ' converto la stringa automaticamente in intero
                                 Vettore_int(i) = temp - temp Mod 10 ' Assegno i valori a un vettore di numeri con le decine di ogni elemento
                            Next
                            
                            ' Sottraggo gli elementi del vettore a coppie e verifico se la differenza sia nulla
                            ' essendo già ordinati è sufficiente testare le coppie consecutive
                            
                            For i = 0 To n_Vettore - 1
                                 temp = Vettore_int(i + 1) - Vettore_int(i)
                                 If temp = 0 Then
                                     DecineRipetute = True   ' True se la differenza è 0 ed esco dalla funzione
                                     Exit Function
                                 End If
                            Next
                            
                            DecineRipetute = False           ' False se la differenza è diversa da 0
                            
                            
                            End Function
                            #21192 Risposta

                            Luca73 stavo rileggendo il to codice, non mi è chiaro cosa esegua questa linea di codice:  

                              Not MioVettoreOutput(MioVettoreInput(Indice) \ 10)

                            Se ho capito crei un vettore output con 10 decine, e cambi il valore associato alla decina se il numero compare: è un'ottima soluzione se non ci sono numeri maggiori di 99

                             

                             

                            #21208 Risposta

                            silverbx70
                            Partecipante

                              Carissimi , purtroppo leggendo i vostri suggerimenti mi fate sentire come “ ‘nu carnacuttaro “ alla corte di chef stellati ( il “carnacuttaro” era un ambulante che andava in giro con il suo pentolone di brodo a vendere carne lessa , poco pregiata , ai passanti ) . Vi chiedo scusa per questa digressione culinario/dialettale e veniamo al punto. Sono riuscito ad elaborare un listato “ appena decente “ che mi permette di avere il risultato richiesto. Ovviamente essendo io all’alfabetizzazione del VBA , ho usato quelle poche nozioni delle quali sono a conoscenza . Usate dei termini , chiaramente appropriati , dei quali non ne conoscevo nemmeno l’esistenza ( tipo collection , for each  , UDF ecc… ). Ma una Function come parte ??.

                              Comunque , grazie ai vostri suggerimenti ci sono riuscito . Vi prometto che , tra una seduta dal geriatra ed una dall’ortopedico , trovero’ il tempo per studiare. Al momento mi arrangio e come giustamente dice un proverbio “ Chi e meglio nun tene ca’ mugliera se cocca “ liberamente tradotto in “ Chi non ha di meglio va a letto con la …moglie “. Purtroppo non avendo utilizzato appieno il listato di vecchio frac ma solo il suggerimento , mi limitero’ a regalargli solo il cappello a cilindro . Un abbraccio “ paterno “.

                              ‘O viecchio

                              P.S. Vi allego il file di esempio ( e non ridete ……..)

                              Allegati:
                              You must be logged in to view attached files.
                              #21214 Risposta

                              vecchio frac
                              Senior Moderator
                              • Sfida #1
                                171 pts

                                Queste digressioni ci vogliono, fanno bene alla salute e al morale. Tanto più che in questi giorni mi sto occupando proprio di stress lavoro correlato e con i mille impazzimenti dovuti al mio capo 🙂

                                Sto guardando il tuo lavoro (grazie per avermi dedicato la sub 🙂 ) ma a parte l'uso di GoTo che non mi piace per niente, tuttavia qualcosa mi sfugge, lo scenario sembra diverso dall'ipotesi che mi ero fatto. E certo, qualcosa si può limare e riscrivere ma il lavoro è lodevole e visto che funziona come ti aspetti... good job 🙂

                                 

                              LoginRegistrati
                              Stai vedendo 17 articoli - dal 1 a 17 (di 17 totali)
                              Rispondi a: Ricerca di decine in una tabella
                              Gli allegati sono permessi solo ad utenti REGISTRATI
                              Le tue informazioni:



                              vecchio frac - 2750 risposte

                              albatros54
                              albatros54 - 791 risposte

                              patel
                              patel - 687 risposte

                              Marius44
                              Marius44 - 591 risposte

                              Luca73
                              Luca73 - 553 risposte