XL 2016 Remplacer cellules vides par zéro dans plage variable.

KTM

XLDnaute Impliqué
Bonjour chers amis du forum,
Dans mon fichier joint je voudrais par macro exécuter les taches suivantes:
1- Remplacer les vides par 0 dans la plage jusqu'à la dernière colonne utilisée.
2-Convertir les données de la colonne B en colonnes.
J'ai élaboré ce qui suit mais quelque chose ne va pas. Prière me corriger.
Merci
VB:
Sub convert()
Application.ScreenUpdating = False
Dim dl, dercol As Long
Dim Rg As Range, Qui As String, Plage As String, pg As Range

With Sheets("Convert")
dl = .Range("B" & Rows.Count).End(xlUp).Row
Qui = "/"
Plage = "B5:B" & dl
Set Rg = Range(Plage).Find(Qui)
If Not Rg Is Nothing Then
On Error Resume Next
dercol = .Cells(1, .Cells.Columns.Count).End(xlToLeft).Column
Set pg = .Range("C5").Offset(dl, dercol)
     pg.SpecialCells(xlCellTypeBlanks).Value = 0
    .Columns("C:D").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    .Range("B5:B" & dl).TextToColumns Destination:=.Range("B5"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
        :="/", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), _
        TrailingMinusNumbers:=True
End If
End With
Application.ScreenUpdating = True
End Sub
 

Pièces jointes

  • Classeur1.xlsm
    29.8 KB · Affichages: 4

TooFatBoy

XLDnaute Barbatruc
Bonjour,

Déjà, ta variable dc (dernière colonne) n'est pas bonne puisque tu n'as pas de valeur dans la vraie dernière colonne de ton tableau sur la ligne 5.

En suite, ta variable pg n'est pas bonne non plus puisque tu prends une seule cellule (C5) et que tu te décales, non pas du nombre de colonnes de ton tableau comme tu sembles le croire, mais d'un nombre de colonnes égal au numéro de la dernière colonne de ton tableau (en supposant que dc contienne vraiment le numéro de la dernière colonne de ton tableau).

Je pense qu'il faudrait que tu détermines la plage de ton tableau avec CurrentRegion, et que tu remplaces, ou combines, l'Offset avec un Resize.

Sinon, travaille avec un tableau structuré, ça simplifie la vie. 😉
 

job75

XLDnaute Barbatruc
Bonjour KTM, Marcel32, le forum,

Je ne vois pas l'intérêt de la question 1 mais bon :
VB:
Sub convert()
Dim ncol%, tablo, i&, x$, n%, maxi%
With Sheets("Convert").[B5].CurrentRegion
    ncol = .Columns.Count
    tablo = .Columns(1).Resize(, 2) 'matrice, plus rapide, au moins 2 éléments
    For i = 1 To UBound(tablo)
        x = CStr(tablo(i, 1))
        n = Len(x) - Len(Replace(x, "/", ""))
        If n > maxi Then maxi = n
    Next
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    If maxi Then .Columns(2).Resize(, maxi).Insert xlToRight
    .Columns(1).TextToColumns .Cells(1), xlDelimited, Other:=True, OtherChar:="/" 'commande Convertir
    .Resize(, ncol + maxi).Replace "", 0, xlWhole 'à quoi ça sert ???
End With
End Sub
A+
 

Pièces jointes

  • Classeur(1).xlsm
    30.5 KB · Affichages: 2

Discussions similaires