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

    BOLDOS75
    Partecipante

      Buongiorno nel file che allego, quando provo i codici vba in Foglio 2 ,mi esce errore 13.

      Il mio scopo è con il primo codice (Sub Totale_Colonna_B() ) copiare e sommare valori da Foglio1 colonna B2:B27 che abbiano la stessa data, in Foglio2 la data una sola e copiare il risultato nella stessa, se nella colonna B non ci sono dei valori ma nella colonna a c'è la data vorrei che in foglio2 alla stessa data corrispondente e cella in B si colorasse esempio di giallo.

      Nel secondo codice (Sub Totale_Colonna_C_e_D() )  Foglio1 sommare le celle C2:C27  poi D2:D27 che abbiano la stessa data e copiare il tutto nel Foglio2 iniziando da  C2 idem per  D2 .

      Nel foglio 1 anche se dovessi avere nella colonna A solo esempio 5 date  e colonna B-C-D- relativo valore i codici dovrebbero verificare il Range B2:B27 , C2:C27  poi D2:D27 e colorare le celle vuote in Foglio2

      Attualmente quando eseguo il codice va in errore 

      Allegati:
      You must be logged in to view attached files.
      #46880 Score: 0 | Risposta

      LucaSR
      Partecipante
        15 pts

        Ciao quando ti esce l'errore, clicca su Debug e fai uno screenshot della parte di codice evidenziato.

        Dopo di che posta le immagini e vediamo dove sta il problema

        #46885 Score: 0 | Risposta

        vecchio frac
        Senior Moderator
          272 pts

          Errore 13: tipo non corrispondente. Una semplice operazione di debug passo passo ti aiuta sicuramente. Come dice LucaSR del resto.

          Se avvio passo passo la sub Totale_Colonna_C_e_D, l'esecuzione si ferma con l'errore incriminato su questa riga:

              data = DateValue(Foglio1.Cells(i, 2))
          

          e cosa c'e' in Foglio1.Cells(i, 2) con i= 1 ? (percio' --> cella B1) c'e' l'intestazione della colonna, cioe' "COLONNNA B" (sic, con tre N). 

          Quindi quale sara' il problema? quale dovrebbe essere il valore da prelevare?

          Vedi tu come puoi risolvere.

          #46896 Score: 0 | Risposta

          BOLDOS75
          Partecipante

            Ho corretto il codice (Sub Totale_Colonna_B) che si trova nel foglio1, alla fine ho messo un  ( MsgBox("La Selezione Celle da Cancellare? ") , quando eseguo con F5  e compare MsgBox  se seleziono NO funziona regolarmente , se seleziono SI esce errore.

            Poi nel Foglio2 codice ( Sub Totale_Colonna_C_e_D) in cui voglio sommare e poi copiare, quando eseguo il codice  con F8 controllando con la finestra (Variabili locali ) quando mi trovo al  i (Espressione )=(Valore) 5    e evidenziato la riga del codice   dict(data) = IIf(dict(data) + tot = 0, "", dict(data) + tot) mi esce errore.

            Allego il file e provandolo spero si capisca il problema.

            Uso MOPP2021

            #46898 Score: 0 | Risposta

            BOLDOS75
            Partecipante

              Riallego il file.

              #46901 Score: 0 | Risposta

              BOLDOS75
              Partecipante

                riallego

                Allegati:
                You must be logged in to view attached files.
                #46905 Score: 0 | Risposta

                Oscar
                Partecipante
                  44 pts

                  Cosa dovresti fare con questo

                  Foglio2.Range("B24").Select
                  Selection.Copy
                  Foglio2.Range("B2:B20").Select

                  Poi perchè le macro sul foglio , non sarebbe meglio in un modulo o nel Pulsante

                  #46914 Score: 0 | Risposta

                  LucaSR
                  Partecipante
                    15 pts

                    C'è tanta confusione nell'aria, perché si prova a guidare senza aver studiato per prendere la patente   

                    #46917 Score: 0 | Risposta

                    BOLDOS75
                    Partecipante

                      Foglio2.Range("B24").Select                              Seleziono la cella B24 
                      Selection.Copy                                                         la copio
                      Foglio2.Range("B2:B20").Select                          seleziono B2:B20 poi con  il successivo messaggio 

                      è solo un controllo poi lo tolgo se il codice andrà bene.

                      Come avrete capito  sto cercando di imparare per questo che ho bisogno un aiuto.

                      #46918 Score: 0 | Risposta

                      LucaSR
                      Partecipante
                        15 pts

                        Inizia a scordarti del metodo Select e scrivi direttamente Copy.

                        Poi selezioni un range, lo copi ed invece di incollare, riselezioni?

                        #46921 Score: 0 | Risposta

                        BOLDOS75
                        Partecipante

                          Ok , il codice  qua sotto dov'e l'errore o gli errori?

                          Option Explicit
                          
                          '''' Copio da Foglio1 la somma di C1:C27 e D2:D27 con stessa la data in Foglio2 colonna C e D
                          ''''Il Range in Foglio1 da B2:D27 è fisso
                          
                          Sub Totale_Colonna_C_e_D()
                          Dim dict As Object
                          Dim i As Long
                          Dim tot As Double
                          Dim data
                          Set dict = CreateObject("Scripting.Dictionary")
                          
                          i = MsgBox("Verifica la COPIA nel Foglio2 Colonna C e D ", vbYesNo + vbQuestion, "AVVISO") '--Modifica
                          If i = vbNo Then Exit Sub
                          
                          For i = 2 To 28
                              data = DateValue(Foglio1.Cells(i, 1))
                               tot = Foglio1.Cells(i, 3).Value
                                If dict.Exists(data) Then
                                 dict(data) = IIf(dict(data) + tot = 0, "", dict(data) + tot)
                                  
                              Else
                                  dict.Add data, IIf(tot = 0, "", tot)
                              End If
                          
                          Next i
                              
                          With Foglio2.Range("C1:D" & dict.Count)
                              .Value = Application.Transpose(dict.items)
                              .Interior.Color = xlNone
                              .SpecialCells(xlCellTypeBlanks).Interior.Color = vbYellow
                          End With
                          
                          Set dict = Nothing
                          
                          End Sub
                          
                          #46951 Score: 0 | Risposta

                          Oscar
                          Partecipante
                            44 pts

                            Prova questa formula la incolli nel Foglio2 in B2 , se vuoi tutti i risultati la trascini in giù

                            Ma si può fare anche con una macro

                            =SOMMA.SE(Foglio1!$A$2:$A$27;Foglio2!A2;Foglio1!$B$2:$B$27)

                             

                            #47064 Score: 0 | Risposta

                            BOLDOS75
                            Partecipante

                              La formula somma gia usata ma voglio usare il codice vba.

                               

                              #47079 Score: 0 | Risposta

                              Oscar
                              Partecipante
                                44 pts

                                OK

                                Private Sub CommandButton1_Click()
                                Foglio2.Range("B2:B65") = ""
                                   For X = 2 To 65
                                   For Y = 2 To 27
                                If Foglio1.Cells(Y, 2) <> "" Then
                                If Foglio1.Cells(Y, 1) = Foglio2.Cells(X, 1) Then Foglio2.Cells(X, 2) = Foglio2.Cells(X, 2) + Foglio1.Cells(Y, 2)
                                   End If
                                   Next
                                   Next
                                End Sub
                                #47097 Score: 0 | Risposta

                                alexps81
                                Moderatore
                                  55 pts

                                  Ciao @boldos75

                                  visto che quel codice iniziale te lo avevo proposto io...a questo punto ti giro un aggiornamento dato che vorresti fare la stessa cosa per colonna B, C e D. Facciamo tutto in un sol colpo con questa procedura.

                                  Metti in un Modulo Standard (e non nel Foglio2 o in qualunque altro Foglio....già te lo avevo detto in altro Thread. Se per sbaglio cancelli il Foglio ti perdi tutto il codice.)

                                  Option Explicit
                                  
                                  '''' Copio in Foglio2 la somma dei valori di Foglio1 con la stessa data in Foglio1
                                  ''''Il Range in Foglio1 da B2:D27 è fisso
                                  
                                  Sub Totale_Colonne_B_C_D()
                                  Dim dict As Object
                                  Dim i As Long
                                  Dim tot(1 To 3) As Double
                                  Dim data As Variant, tempArray As Variant
                                  Set dict = CreateObject("Scripting.Dictionary")
                                  
                                  i = MsgBox("Verifica la COPIA nel Foglio2 Colonna B ", vbYesNo + vbQuestion, "AVVISO")
                                  If i = vbNo Then Exit Sub
                                  
                                  For i = 2 To 27
                                      data = DateValue(Foglio1.Cells(i, 1))
                                      
                                      If Not dict.Exists(data) Then
                                          tot(1) = 0
                                          tot(2) = 0
                                          tot(3) = 0
                                      Else
                                          tempArray = dict(data)
                                          tot(1) = tempArray(1)
                                          tot(2) = tempArray(2)
                                          tot(3) = tempArray(3)
                                      End If
                                      
                                      tot(1) = tot(1) + Foglio1.Cells(i, "B").Value
                                      tot(2) = tot(2) + Foglio1.Cells(i, "C").Value
                                      tot(3) = tot(3) + Foglio1.Cells(i, "D").Value
                                      
                                      dict(data) = tot
                                  Next i
                                  
                                  '==============================================================
                                  'scrivo il dizionario in Foglio2 nel Range("B2:D" & dict.Count)
                                  Dim outputArr() As Variant
                                  Dim items As Variant
                                  
                                  ReDim outputArr(1 To dict.Count, 1 To 3)
                                  items = dict.items
                                  
                                  For i = 1 To dict.Count
                                      outputArr(i, 1) = IIf(items(i - 1)(1) = 0, "", items(i - 1)(1))
                                      outputArr(i, 2) = IIf(items(i - 1)(2) = 0, "", items(i - 1)(2))
                                      outputArr(i, 3) = IIf(items(i - 1)(3) = 0, "", items(i - 1)(3))
                                  Next i
                                  
                                  Foglio2.Unprotect
                                  With Foglio2.Range("B2:D" & dict.Count + 1)
                                      .Value = outputArr
                                      .Interior.Color = xlNone
                                      .SpecialCells(xlCellTypeBlanks).Interior.Color = vbYellow
                                  End With
                                  Foglio2.Protect
                                  
                                  Set dict = Nothing
                                  
                                  End Sub

                                  non è stato semplice ma alla fine sono riuscito.   

                                  #47120 Score: 0 | Risposta

                                  BOLDOS75
                                  Partecipante

                                    Buonasera, l'ultima soluzione proposta è ottima e perfettamente funzionante è come volevo. Ringrazio moltissimo per la disponibilità e la cortesia, e la professionalità dimostrata.

                                    Con questo chiudo la discussione 

                                    #47130 Score: 1 | Risposta

                                    Oscar
                                    Partecipante
                                      44 pts

                                      alexps81 ha scritto:

                                      non è stato semplice ma alla fine sono riuscito. 

                                      Osta Alex che macro che hai fatto , mi complimento con tè  

                                    Login Registrati
                                    Stai vedendo 17 articoli - dal 1 a 17 (di 17 totali)
                                    Rispondi a: Errore 13
                                    Gli allegati sono permessi solo ad utenti REGISTRATI
                                    Le tue informazioni: