les nombres suivants commencent dans la cellule B5: 23 34 45 56 45 54 Je veux additionner le premier chiffre de chacun et afficher le résultat dans la cellule C9
J'ai essayé différents ajustements du code ci-dessous.
Sub sum_first_digit() Dim colnum As Integer Dim sumfirst As Integer sumfirst = 0 For colnum = 2 To 7 Step 1 cellref = Cells(5, colnum) sumfirst = sumfirst + (Left(celref, 1)) Next colnum Range("C9").Value = sumfirst End Sub
La cellule C9 attendue pour avoir le numéro 23.
Le réel est
Erreur d'exécution 13: incompatibilité de type
7 Réponses :
Sub sum_first_digit() Dim Col As Long, X As Long For Col = 2 To 7 X = X + Left(Cells(5, Col), 1) Next Col Range("C9") = X End Sub
Que faire si l'une des cellules est vide ou contient du texte?
Fera des recherches supplémentaires pour comprendre comment cela a fonctionné Merci!
@Variatus, ni l'un ni l'autre ne semblait être le problème, donc je ne sais pas pourquoi j'aborderais tous les scénarios
Je ne sais pas pourquoi une formule ne pourrait pas fonctionner. En utilisation C9,
=SUMPRODUCT(--LEFT(B5:G5&0)) 'an array formula that will skip over blank and text cells =SUM(IFERROR(--LEFT(B5:G5&0), 0))
Parce que cela générera une erreur lorsque l'une des cellules est vide.
Essayez la formule modifiée ci-dessus.
J'adore votre idée et je l'ai votée! Si l'utilisateur entre une valeur de texte par erreur, la formule renvoie un #VALUE! l'erreur peut, en fait, être bénéfique.
S'ils ont saisi «une valeur de texte par erreur», ils devraient peut-être recevoir une erreur #VALUE et non une fausse valeur numérique. Cependant, une sorte de formule matricielle pourrait facilement fournir un contrôle des erreurs.
@Variatus, une fonction avec la plage passée en argument ne serait-elle pas plus utile qu'une sous-procédure? (btw, je ne suis pas autorisé à voter pour)
++ Toujours préférer les formules à VBA :)
@SiddharthRout - uniquement lorsque la solution de la formule est simple. Les solutions de formules trop compliquées peuvent réduire considérablement la surcharge de calcul par vba. Je recherchais stackoverflow.com/questions/54246535/... plus tôt et l'a vu comme une solution vba, pas une formule bien qu'une formule compliquée puisse le faire.
Vrai que. Mais cela dépend aussi pour qui je le crée. Beaucoup de mes clients n'ont pas de macros activées sur leurs PC Office. Ils ne s'inquiètent pas des frais généraux alors ... Ils sont heureux d'aller de l'avant avec des formules ... LOL
Ouais bien, certains clients doivent trop compliquer une formule juste parce qu'ils essaieront de modifier une formule matricielle et ne peuvent pas comprendre la partie CSE.
Cela semble une question de goût. Dans la plupart des cas, je préfère qu'une feuille de calcul soit pilotée par VBA ou utilise des fonctions de feuille de calcul. Les hybrides sont plus difficiles à entretenir car ils nécessitent deux ensembles de compétences. Parler de maintenance VBA est préférable car il permet de programmer des annotations tout en étant plus rapide à écrire et plus facile à lire que les formules complexes.
Veuillez essayer ceci.
Sub sum_first_digit() Dim colnum As Integer Dim sumfirst As Integer Dim CelRef As Variant For colnum = 2 To 7 CelRef = Left(Cells(5, colnum).Value, 1) sumfirst = sumfirst + Val(CelRef) Next colnum Range("C9").Value = sumfirst End Sub
Le problème est dans la variable CellRef . Vous avez d'abord écrit avec 2 lettres L et ensuite avec seulement 1 lettre L .
Utilisez toujours la commande Option Explicite en haut de votre module. Cela vous oblige à déclarer toutes les variables et à éviter ce genre d'erreur.
Code correct:
Sub sum_first_digit() Dim colnum As Integer Dim sumfirst As Integer Dim cellref As Variant 'Change this type to another more specific (int, long or string) sumfirst = 0 For colnum = 2 To 7 Step 1 cellref = Cells(5, colnum) If IsNumeric(Left(cellref , 1)) Then sumfirst = sumfirst + Left(cellref , 1) Next colnum Range("C9").Value = sumfirst End Sub
L'erreur est parce que la variable ** celref ** est non déclaré et donc vide. Left ("", 1) est également vide. De cette façon, vous essayez d'ajouter un texte à un nombre et c'est pourquoi les types sont incompatibles.
Essayez
sumfirst + (Left (celref, 1)) est String
sumfirst est Integer final
integer = string -> error Type Mismatch
Sub sum_first_digit() Dim colnum As Integer Dim sumfirst As Integer sumfirst = 0 For colnum = 2 To 7 Step 1 cellref = Int(Cells(5, colnum) / 10) sumfirst = sumfirst + cellref Next colnum Range("C9").Value = sumfirst End Sub
Sub sum_first_digit() Dim cellref As Range Dim colnum As Long Dim sumfirst As Long sumfirst = 0 For colnum = 2 To 7 Set cellref = Cells(5, colnum) sumfirst = sumfirst + (Left(cellref, 1)) Next colnum Range("C9").Value = sumfirst Set cellref = Nothing End Sub
Dans la cellule C9, utilisez la formule: = SFD (B5: G5)
.
Sub SumOfFirstDigit2() Const cRow As Long = 5 Const cCol1 As Variant = 2 Const cCol2 As Variant = 7 Const cTarget As String = "C9" Dim j As Long Dim sumFirst As Long For j = cCol1 To cCol2 If IsNumeric(Cells(cRow, j)) Then If Cells(cRow, j) > 0 Then _ sumFirst = sumFirst + CLng(Left(Cells(cRow, j), 1)) End If Next Range(cTarget).Value = sumFirst End Sub
Sub SumOfFirstDigit() Const cRow As Long = 5 Const cCol1 As Variant = 2 Const cCol2 As Variant = 7 Const cTarget As String = "C9" Dim j As Long Dim sumFirst As Long Dim vnt As Variant vnt = Range(Cells(cRow, cCol1), Cells(cRow, cCol2)) For j = 1 To UBound(vnt, 2) If IsNumeric(vnt(1, j)) Then If CLng(vnt(1, j)) > 0 Then _ sumFirst = sumFirst + CLng(Left(vnt(1, j), 1)) End If Next Range(cTarget).Value = sumFirst End Sub
Dim cellref As Range
. Set
dans Set cellref = Cells (5, colnum)
. celref
dans sumfirst = sumfirst + (Left (cellref, 1))
. Set cellref = Nothing
Integer
est mort a >, Long
prévaut. Function SFD(Range As Range) As Long Dim vnt As Variant, i As Long, j As Long vnt = Range For i = 1 To UBound(vnt) For j = 1 To UBound(vnt, 2) If IsNumeric(vnt(i, j)) Then If CLng(vnt(i, j)) > 0 Then SFD = SFD + CLng(Left(vnt(i, j), 1)) End If Next Next End Function
Je préférerais utiliser les formules suggérées par @ user10931127, mais si vous voulez toujours du code VBA, essayez ce code VBA d'une ligne
Sub Sample() [C9] = [INDEX(SUM(VALUE(LEFT(A1:A6,1))),)] End Sub
Si vous voulez une explication comment cela fonctionne, consultez CECI
Non, les valeurs sont en B5, C5, D5, etc. Merci.
Vous avez touché le jack pot dans les solutions. Vous devriez en accepter un (veuillez voir la case à cocher à côté de la solution qui vous chatouille)