3
votes

Comment additionner le premier chiffre d'une série de nombres

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


2 commentaires

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)


7 Réponses :


1
votes
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

3 commentaires

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



4
votes

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))


10 commentaires

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.



1
votes

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


0 commentaires

1
votes

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.


0 commentaires

1
votes

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


0 commentaires

3
votes

Somme des premiers chiffres

La fonction

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) .

Version de la baie

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

Version de la plage

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

Réparation rapide

  • Vous avez oublié Dim cellref As Range .
  • Vous avez oublié Set dans Set cellref = Cells (5, colnum) .
  • Vous avez mal orthographié celref dans sumfirst = sumfirst + (Left (cellref, 1)) .
  • Vous avez oublié Set cellref = Nothing
  • Integer est mort a >, Long prévaut.

Le Code

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

0 commentaires

2
votes

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


0 commentaires