› Sviluppare funzionalita su Microsoft Office con VBA › Errore 13
-
AutoreArticoli
-
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.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
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.
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
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
C'è tanta confusione nell'aria, perché si prova a guidare senza aver studiato per prendere la patente
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.
Inizia a scordarti del metodo Select e scrivi direttamente Copy.
Poi selezioni un range, lo copi ed invece di incollare, riselezioni?
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
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)
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
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.
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
non è stato semplice ma alla fine sono riuscito.
Osta Alex che macro che hai fatto , mi complimento con tè
-
AutoreArticoli