2 votes

Converting/transforming la somme de (A1:D1) en A1+B1+C1+D1 dans Excel

Donc, la situation est la suivante, je veux savoir s'il existe un moyen de convertir la somme d'une plage de cellules en la somme résultant de l'addition de chaque cellule, séparément, comme indiqué dans le titre. Par exemple, disons que quelqu'un a ce calcul dans la cellule E1, E1 = SOMME(A1:D1) et veut le diviser en la somme des cellules composantes séparées, comme dans E1 = A1 + B1 + C1 + D1.

Aussi, ce serait génial si quelqu'un pouvait indiquer comment faire cela pour une plage de cellules, comme dans le cas : E1 = SOMME(A1:D2) étant converti en E1 = A1 + B1 + C1 + D1 + A2 + B2 + C2 + D2.

ÉDITER : Quelqu'un a suggéré que j'utilise VBA, et j'y ai aussi pensé. Si quelqu'un a des suggestions à ce sujet, ce serait grandement apprécié (je ne suis pas très bon en programmation VBA, bien que je connaisse les bases et je vais essayer par moi-même.

1voto

Dave Points 25050

Bien que vous ayez étiqueté ceci avec la fonction Feuille de Calcul, vous parlez d'utiliser VBa dans la question. Ce VBa fait les deux exemples que vous avez donnés

Option Explicit
Sub EeekPirates()

Dim formule As String
formule = Range("B4").formule

Dim split1() As String
split1 = Split(formule, "(")

Dim temp As String
temp = Replace(split1(1), ")", "")

Dim splitty() As String
splitty = Split(temp, ":")

Dim premiereColonne As Integer
premiereColonne = AscW(Left(splitty(0), 1))

Dim deuxiemeColonne As Integer
deuxiemeColonne = AscW(Left(splitty(1), 1))

Dim premiereLigne As Integer
premiereLigne = Right(splitty(0), 1)

Dim deuxiemeLigne As Integer
deuxiemeLigne = Right(splitty(1), 1)

Range("B5").Value = ""   ' cela pourrait être mis à jour en `B4 = ` 
Dim i As Integer
Dim j As Integer

For j = premiereLigne À deuxiemeLigne
    For i = premiereColonne À deuxiemeColonne
        Range("B5").Value = Range("B5").Value & Chr(i) & j & "+"
    Prochain i
Prochain j

Dim longueur As Integer
longueur = Len(Range("B5").Value) - 1
Range("B5").Value = Gauche(Range("B5").Value, longueur)

End Sub

N'oubliez pas qu'il n'y a pas d'annulation, donc faites d'abord une sauvegarde.

Comment ajouter VBA dans MS Office?

Exemple avec A1:D1

entrer la description de l'image ici

Exemple avec A1:D2

entrer la description de l'image ici

Conformément aux commentaires dans le code, si vous mettez à jour de

Range("B5").Value = ""

à

Range("B5").Value = "B4 = "

Vous obtiendrez (dans B5)

B4 = A1 + B1 + C1 + D1

1voto

g.kov Points 859

Exemple de travail minimal avec la fonction VBA unroll(), qui prend une référence à une cellule avec une seule fonction (comme sum, count, min) et déroule son argument (une liste de plages) en une liste de cellules individuelles.

Option Explicit

Function rangeText(s As String) As String
Dim i As Integer, j As Integer
i = Excel.WorksheetFunction.Find("(", s)
j = Excel.WorksheetFunction.Find(")", s)
rangeText = Mid(s, i + 1, j - i - 1)
End Function

Function rangeToList(s As String)
Dim rg As Range: Set rg = Range(s)
Dim i, j As Integer: Dim c As String
For j = 0 To rg.Rows.Count - 1
  For i = 0 To rg.Columns.Count - 1
    c = c + IIf(c <> "", ",", "") + Chr(64 + rg.Column() + i) + Format(rg.Row() + j)
  Next i
Next j
rangeToList = c
End Function

Function unroll(x As Range) As String
  Dim s As String: Dim i, j As Integer: Dim list() As String
  If Not x.HasFormula Then
   s = "Pas une formule"
  Else
  s = rangeText(x.Formula)
  list = Split(s, ",")
  s = ""
  For i = 0 To UBound(list)
    s = s + IIf(i > 0, ",", "") + rangeToList(list(i))
  Next i
End If
unroll = s
End Function

description de l'image

Note : en tant qu'exemple minimal, il ne gère pas correctement les références de colonnes à deux lettres.

* Modifier *

Ajouté Function ColumnNoToName pour gérer les références de cellules avec des colonnes > 26.

description de l'image

Option Explicit

Function rangeText(s As String) As String
Dim i As Integer, j As Integer
i = Excel.WorksheetFunction.Find("(", s)
j = Excel.WorksheetFunction.Find(")", s)
rangeText = Mid(s, i + 1, j - i - 1)
End Function

Function ColumnNoToName(colNo As Integer) As String
  Dim lo, hi As Integer: Dim s As String
  lo = (colNo - 1) Mod 26
  If colNo > 26 Then
    hi = (colNo - 1 - lo) \ 26
    s = Chr(64 + hi)
  End If
  s = s + Chr(64 + lo + 1)
  ColumnNoToName = s
End Function

Function rangeToList(s As String)
Dim rg As Range: Set rg = Range(s)
Dim i, j As Integer: Dim c As String
For j = 0 To rg.Rows.Count - 1
  For i = 0 To rg.Columns.Count - 1
    c = c + IIf(c <> "", ",", "") _
      + ColumnNoToName(rg.Column() + i) _
      + Format(rg.Row() + j)
  Next i
Next j
rangeToList = c
End Function

Function unroll(x As Range) As String
  Dim s As String: Dim i, j As Integer: Dim list() As String
  If Not x.HasFormula Then
   s = "Pas une formule"
  Else
  s = rangeText(x.Formula)
  list = Split(s, ",")
  s = ""
  For i = 0 To UBound(list)
    s = s + IIf(i > 0, ",", "") + rangeToList(list(i))
  Next i
End If
unroll = s
End Function

Function cellFormula(x As Range) As String
  cellFormula = x.Formula
End Function

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X