J'utilisais le script que j'ai trouvé ici: https://excelribbon.tips.net/T008349_Counting_All_Characters .html
Cela fonctionne comme prévu, mais quand il y a d'autres objets comme des images, le script me renvoie l'erreur 438 "L'objet ne prend pas en charge cette propriété ou cette méthode". Lorsque j'ai supprimé les images, le script fonctionnait à nouveau correctement.
Y a-t-il une option pour mettre dans le script quelque chose comme "ignorer les images"? Ou existe-t-il un meilleur type de script pour y parvenir? Je ne suis pas du tout doué pour VBA, toute aide sera très appréciée.
4 Réponses :
Il semble que vous puissiez ajouter un if-check comme celui-ci ( Code VBA pour exclure les images png et gif lors de l'enregistrement des pièces jointes pour" PNG "et" GIF ".).
Vous avez juste à changer le if-check pour vérifier le type d'image que vous utilisez "JPG" ou "JPEG"? Faites simplement correspondre l'extension au if-check en remplaçant "PNG" ou "GIF" par votre extension en MAJUSCULES.
Ajoutez le if-check juste au-dessus de l'endroit où l'erreur se produit ou mieux encore, ajoutez-le au-dessus de la portée de l'endroit où l'erreur se produit.
J'ai pris le script de votre lien et je l'ai modifié. Cela fonctionne maintenant .
C'est loin d'être parfait (il y a des cas où il peut encore planter), mais maintenant il prend en charge la gestion des Shapes sans propriété .TextFrame :
Sub CountCharacters()
Dim wks As Worksheet
Dim rng As Range
Dim rCell As Range
Dim shp As Shape
Dim bPossibleError As Boolean
Dim bSkipMe As Boolean
Dim lTotal As Long
Dim lTotal2 As Long
Dim lConstants As Long
Dim lFormulas As Long
Dim lFormulaValues As Long
Dim lTxtBox As Long
Dim sMsg As String
On Error GoTo ErrHandler
Application.ScreenUpdating = False
lTotal = 0
lTotal2 = 0
lConstants = 0
lFormulas = 0
lFormulaValues = 0
lTxtBox = 0
bPossibleError = False
bSkipMe = False
sMsg = ""
For Each wks In ActiveWorkbook.Worksheets
' Count characters in text boxes
For Each shp In wks.Shapes
If TypeName(shp) <> "GroupObject" Then
On Error GoTo nextShape
lTxtBox = lTxtBox + shp.TextFrame.Characters.Count
End If
nextShape:
Next shp
On Error GoTo ErrHandler
' Count characters in cells containing constants
bPossibleError = True
Set rng = wks.UsedRange.SpecialCells(xlCellTypeConstants)
If bSkipMe Then
bSkipMe = False
Else
For Each rCell In rng
lConstants = lConstants + Len(rCell.Value)
Next rCell
End If
' Count characters in cells containing formulas
bPossibleError = True
Set rng = wks.UsedRange.SpecialCells(xlCellTypeFormulas)
If bSkipMe Then
bSkipMe = False
Else
For Each rCell In rng
lFormulaValues = lFormulaValues + Len(rCell.Value)
lFormulas = lFormulas + Len(rCell.Formula)
Next rCell
End If
Next wks
sMsg = Format(lTxtBox, "#,##0") & _
" Characters in text boxes" & vbCrLf
sMsg = sMsg & Format(lConstants, "#,##0") & _
" Characters in constants" & vbCrLf & vbCrLf
lTotal = lTxtBox + lConstants
sMsg = sMsg & Format(lTotal, "#,##0") & _
" Total characters (as constants)" & vbCrLf & vbCrLf
sMsg = sMsg & Format(lFormulaValues, "#,##0") & _
" Characters in formulas (as values)" & vbCrLf
sMsg = sMsg & Format(lFormulas, "#,##0") & _
" Characters in formulas (as formulas)" & vbCrLf & vbCrLf
lTotal2 = lTotal + lFormulas
lTotal = lTotal + lFormulaValues
sMsg = sMsg & Format(lTotal, "#,##0") & _
" Total characters (with formulas as values)" & vbCrLf
sMsg = sMsg & Format(lTotal2, "#,##0") & _
" Total characters (with formulas as formulas)"
MsgBox Prompt:=sMsg, Title:="Character count"
ExitHandler:
Application.ScreenUpdating = True
Exit Sub
ErrHandler:
If bPossibleError And Err.Number = 1004 Then
bPossibleError = False
bSkipMe = True
Resume Next
Else
MsgBox Err.Number & ": " & Err.Description
Resume ExitHandler
End If
End Sub
Voici une approche simplifiée qui pourrait fonctionner un peu mieux. Je pense qu'être explicite des types de formes que vous voulez compter sera une façon plus propre de procéder.
Option Explicit
Private Function GetCharacterCount() As Long
Dim wks As Worksheet
Dim rng As Range
Dim cell As Range
Dim shp As Shape
For Each wks In ThisWorkbook.Worksheets
For Each shp In wks.Shapes
'I'd only add the controls I care about here, take a look at the Shape Type options
If shp.Type = msoTextBox Then GetCharacterCount = GetCharacterCount + shp.TextFrame.Characters.Count
Next
On Error Resume Next
Set rng = Union(wks.UsedRange.SpecialCells(xlCellTypeConstants), wks.UsedRange.SpecialCells(xlCellTypeFormulas))
On Error GoTo 0
If not rng Is Nothing Then
For Each cell In rng
GetCharacterCount = GetCharacterCount + Len(cell.Value)
Next
end if
Next
End Function
Sub CountCharacters()
Debug.Print GetCharacterCount()
End Sub
Salut Ryan, merci beaucoup, cela fonctionne très bien. Cependant, lorsque j'utilise juste un simple fichier contenant quelques textes dans les cellules et du texte dans la zone de texte, il ne compte que les caractères de la zone de texte, sauf si j'utilise une fonction pour au moins une des cellules. Savez-vous pourquoi cela se produit?
Vous pouvez essayer:
Option Explicit
Sub test()
Dim NoOfChar As Long
Dim rng As Range, cell As Range
NoOfChar = 0
For Each cell In ThisWorkbook.Worksheets("Sheet1").UsedRange '<- Loop all cell in sheet1 used range
NoOfChar = NoOfChar + Len(cell.Value) '<- Add cell len to NoOfChar
Next cell
Debug.Print NoOfChar
End Sub