Sviluppare funzionalita su Microsoft Office con VBA Una piccola sfida "intuitiva"

Login Registrati
Stai vedendo 21 articoli - dal 1 a 21 (di 21 totali)
  • Autore
    Articoli
  • #51572 Score: 0 | Risposta

    scossa
    Partecipante
      37 pts

      Visto che l'ambiente un po' langue eccovi una piccola sfida nata da un'intuizione probabilmente banale quanto inutile.

      Si chiede di scrivere la sub Numero() che memorizzi nella variabile nNumero il numero 3745245841850493 (3.745.245.841.850.493) e lo mostri, integro (senza arrotondamento) in un MsgBox:

      Grande Numero

      Il codice deve quindi contenere le istruzioni

      Sub Numero()
      '''''
       nNumero = nNumero + 125
       MsgBox nNumero & vbCrLf & Format(nNumero, "#,##0")
      '''''
      End Sub

      N.B.: la Sub deve funzionare anche con versioni vecchie di Excel (almeno fino alla 2010) a 32 bit.

      #51574 Score: 0 | Risposta

      Oscar
      Partecipante
        45 pts

        Ciao Scossa così va bene 

        Sub Numero()
        nNumero = "3745245841850493"
        MsgBox nNumero & vbCrLf & Format(nNumero, "0,000")
        End Sub
        #51575 Score: 0 | Risposta

        scossa
        Partecipante
          37 pts

          Ciao,

          per evitare questa soluzione avevo già corretto la richiesta (vedi messaggio iniziale), quindi non va bene: nNumero deve essere un numero.

          #51576 Score: 0 | Risposta

          maxpit
          Partecipante
            7 pts

            Buonaserata a tutti,

            ci provo con questa:

            Sub Numero()
             
                Dim nNumero As Variant
                nNumero = CDec(374524584) * 10000000 + 1850493
                nNumero = nNumero + 125
                MsgBox nNumero & vbCrLf & Format(nNumero, "#,##0")
            
            End Sub
            

            A presto

            #51577 Score: 0 | Risposta

            scossa
            Partecipante
              37 pts

              Mi sembra che il numero non corrisponda (3745245840185618) però la soluzione potrebbe andare.

              Ma il bello deve ancora arrivare  

              #51578 Score: 0 | Risposta

              maxpit
              Partecipante
                7 pts

                Buonasera scossa,

                ho corretto il numero caricato come decimal ... mi ero perso uno zero nel mezzo di 1850493 

                #51579 Score: 0 | Risposta

                scossa
                Partecipante
                  37 pts

                  Sì, non avevo visto bene il codice e ho frainteso, vedio messaggio corretto sopra.

                  #51583 Score: 0 | Risposta

                  Marius44
                  Moderatore
                    58 pts

                    Salve

                    Potrebbe essere questa una delle soluzioni?

                    `Option Explicit
                    
                    Sub MsgNumero() '3745245841850493
                    Dim dNum As Double
                    dNum = 3.74524584185049E+15
                    dNum = sNum + 125
                    MsgBox Format(dNum, "################") & vbLf & _
                           Format(dNum, "####,###,###,###,###")
                    End Sub`

                    Ciao,

                    Mario

                    #51585 Score: 0 | Risposta

                    scossa
                    Partecipante
                      37 pts

                      Marius44 ha scritto:

                      Potrebbe essere questa una delle soluzioni?

                       

                      Non mi pare corretta se usi Double hai l'arrotondamento alla decina 3.745.245.841.850.490 anziché 3.745.245.841.850.493

                      In realtà la soluzione è molto più semplice:

                      Sub Numero()
                        Dim nNumero As Variant
                      
                        nNumero = CDec("3745245841850368")
                        nNumero = nNumero + 125
                        MsgBox nNumero & vbCrLf & Format(nNumero, "#,##0")
                      
                      End Sub
                      

                      e ricordavo, male, che il tipo Decimal fosse a 8 byte e non 12.

                      Comunque non era questo il risultato che volevo ottenere    e lo scopo della sfida.

                      Il tutto è nato perché volevo verificare quanto affermato in questa nota, in particolare

                      Implicit conversions of LongLong to smaller integrals are not allowed.

                      interpretandola come "una variabile LongLong non viene implicitamente convertita in Long o Integer"

                      Per cui mi serviva creare una variabile di tipo LongLong ma sugli Excel a 32 bit Dim As LongLon non è riconosciuto e la funzione di conversione cLngLng() non è disponibile .... però c'è uno stratagemma per creare concretamente una variabile di tipo LongLong (vartype 20) ed utilizzarla: dichiararla Variant e assegnarle il valore della proprietà Cells.CountLarge

                      Sub TestLongLong()
                        Dim nNumero As Variant
                        
                        nNumero = Cells.CountLarge * 500000000 + 17312312
                        Debug.Print VarType(nNumero)
                        Debug.Print nNumero, Format(nNumero, "#,##0")
                      
                      End Sub

                      sulla base della predetta nota credevo che una volta creata sarebbe bastato fare l'operazione contraria:

                      Sub TestLongLongRev()
                        Dim nNumero As Variant
                        
                        nNumero = Cells.CountLarge * 500000000 + 17312312
                        Debug.Print VarType(nNumero)
                        Debug.Print nNumero, Format(nNumero, "#,##0")
                        nNumero = (nNumero - 17312312) / 500000000
                        Debug.Print VarType(nNumero)
                        Debug.Print nNumero, Format(nNumero, "#,##0")
                      
                      End Sub

                      però anche se il risultato è corretto Vartype restituisce 5 (vbDouble)  

                      #51586 Score: 0 | Risposta

                      Raffaele53
                      Partecipante
                        23 pts

                        Ciao a tutti

                        Option Explicit
                        Sub Numero()
                        Dim nNumero As LongLong
                        nNumero = "3745245841850368" '3745245841850493
                        nNumero = nNumero * 1
                        nNumero = nNumero + 125
                        MsgBox nNumero & vbCrLf & Format(nNumero, "0,000")
                        End Sub
                        #51587 Score: 0 | Risposta

                        scossa
                        Partecipante
                          37 pts

                          Raffaele53 ha scritto:

                          Dim nNumero As LongLong

                          Excel 32 bit non consente il tipo LongLong (come precisato nel post iniziale la soluzione deve essere valida anche sui sistemi a 32 bit).

                          Comunque leggi tutta la mia ultima risposta.

                          #51588 Score: 0 | Risposta

                          vecchio frac
                          Senior Moderator
                            272 pts

                            scossa ha scritto:

                            Visto che l'ambiente un po' langue eccovi una piccola sfida

                            Grazie scossa    non ho letto ancora niente, voglio leggere la sfida e provare, poi leggo il resto    datemi un pochino di tempo

                            #51590 Score: 0 | Risposta

                            vecchio frac
                            Senior Moderator
                              272 pts

                              Propongo la mia.

                              Adesso leggo tutto il thread    se ho contravvenuto a istruzioni gia' date, chiedo scusa da adesso.

                              `Sub Numero()
                              Dim nNumero
                                  '3745245841850493
                                  nNumero = "3745245841850493"
                                  MsgBox nNumero & vbCrLf & Format(nNumero, "#,##0")
                                  
                                  nNumero = Left(nNumero, Len(nNumero) - 3) & (Right(nNumero, 3) + 125)  '3745245841850618
                                  MsgBox nNumero & vbCrLf & Format(nNumero, "#,##0")
                               
                              End Sub
                              `

                              Edit: ho letto il thread, la risposta di scossa che invalida la mia proposta e il successivo post #51585 che utilizza CountLarge. Non e' affatto una sfida intuitiva   

                              #51592 Score: 0 | Risposta

                              scossa
                              Partecipante
                                37 pts

                                vecchio frac ha scritto:

                                Non e' affatto una sfida intuitiva 

                                Perché no? è intuitiva perché ho avuto l'intuizione di usare la proprietà .CountLarge  

                                #51594 Score: 0 | Risposta

                                vecchio frac
                                Senior Moderator
                                  272 pts

                                  scossa ha scritto:

                                  è intuitiva perché ho avuto l'intuizione

                                  Ah ok    ma tu sei di un altro pianeta e non conti   

                                  #52461 Score: 0 | Risposta

                                  LukeReds
                                  Partecipante
                                    19 pts

                                    ciao,

                                    soluzione !artigianale" per semplificare le cose. Scrive il numero con i punti delle migliaia nella msgbox, non riesco ora a scrivere anche il numero senza punti

                                     

                                     

                                    Sub msgnumerica()
                                    Range("A1") = 3.74524584185049E+15
                                    Range("A1").NumberFormat = "#,##0"
                                    Columns("A:A").EntireColumn.AutoFit
                                    MsgBox Range("A1").Text
                                    End Sub
                                    #52462 Score: 0 | Risposta

                                    scossa
                                    Partecipante
                                      37 pts

                                      LukeReds ha scritto:

                                      Scrive il numero con i punti delle migliaia nella msgbox,

                                      Non va bene, c'è un arrotondamento alla decina: 3.745.245.841.850.490 anziché 3.745.245.841.850.493

                                      #52470 Score: 0 | Risposta

                                      LukeReds
                                      Partecipante
                                        19 pts

                                        ora non arrotonda

                                         

                                        Sub msgnumerica()
                                        d = Right("3745245841850493", 3)
                                        s = Left("3745245841850493", 13)
                                        Range("A1") = s
                                        Range("A1").NumberFormat = "#,##0" & "." & d
                                        Columns("A:A").EntireColumn.AutoFit
                                        MsgBox Range("A1").Text
                                        End Sub
                                        #52471 Score: 0 | Risposta

                                        scossa
                                        Partecipante
                                          37 pts

                                          Ok, ma la richiesta non era così banale; leggi i primi post (#51574 e successivi).

                                          #52475 Score: 0 | Risposta

                                          LukeReds
                                          Partecipante
                                            19 pts

                                            cosi mi pare ci siamo, non ho controllato tutte le risposte in caso ce ne sia già una simile, se possibile, cancellate questo post grazie

                                            Sub msgnumerica()
                                            Dim c As Integer, i As Integer, ris1 As String, ris2 As String
                                            Dim num1, num2
                                            num1 = CDec("3745245841850493")
                                            num2 = CDec("3745245841850493") + 125
                                            l = Len(num1)
                                            For i = l To 1 Step -1
                                               c = c + 1
                                               ris1 = Mid(num1, i, 1) & ris1: ris2 = Mid(num2, i, 1) & ris2
                                               If c = 3 And i > 1 Then
                                                   ris1 = "." & ris1:  ris2 = "." & ris2
                                                   c = 0
                                               End If
                                            Next i
                                            MsgBox (ris1 & vbCrLf & ris2)
                                            End Sub

                                             Ci si potrebbe complicare la vita supponendo che il numero risultante dalla somma del primo con 125 possa avere lunghezza maggiore.....

                                             

                                            #52476 Score: 0 | Risposta

                                            scossa
                                            Partecipante
                                              37 pts

                                              LukeReds ha scritto:

                                              cosi mi pare ci siamo, non ho controllato tutte le risposte .....

                                              male, perché così ti sfugge il "perché" di questa sfida (#51585).

                                               

                                              scossa ha scritto:
                                              però anche se il risultato è corretto Vartype restituisce 5 (vbDouble) 

                                              Che poi, a pensarci bene, non dovevo neanche meravigliarmi di questo, visto che nNumero l'ho dichiarato as Variant.

                                            Login Registrati
                                            Stai vedendo 21 articoli - dal 1 a 21 (di 21 totali)
                                            Rispondi a: Una piccola sfida "intuitiva"
                                            Gli allegati sono permessi solo ad utenti REGISTRATI
                                            Le tue informazioni: