Преобразование / преобразование суммы (A1: D1) в A1 + B1 + C1 + D1 в Excel

488
streamline

Итак, ситуация такова, я хочу знать, есть ли способ преобразовать сумму диапазона ячеек в сумму, полученную в результате добавления каждой ячейки отдельно, как показано в заголовке. Например, скажем, у кого-то есть это вычисление в ячейке E1, E1 = SUM(A1:D1)и он хочет разбить его на сумму отдельных компонентных ячеек, как в E1 = A1 + B1 + C1 + D1 .

Кроме того, было бы замечательно, если бы кто-то мог указать, как это сделать для диапазона ячеек, как в случае: E1 = SUM (A1:D2)преобразование в E1 = A1 + B1 + C1 + D1 + A2 + B2 + C2 + D2.

РЕДАКТИРОВАТЬ: Кто-то предложил мне использовать VBA, и я тоже думал об этом. Если у кого-то есть какие-либо предложения по этому вопросу, это будет с благодарностью (я не очень хорош в программировании на VBA, хотя я знаю основы и попробую сам.

2
Я запутался, зачем тебе это нужно ... Aurus Huang 7 лет назад 3
Короткий ответ: нет, вы не можете сделать это, если не введете его вручную. Я согласен с предыдущим комментарием: зачем тебе это? Результат будет точно таким же. Máté Juhász 7 лет назад 0
Привет, @AurusHuang & Mate, есть две основные причины, во-первых, показать студентам, как работать с формулами (немного сложнее вводить в детали), и, во-вторых, подумать о сценарии, в котором нужно перемешивать столбцы, и у вас есть столбец с суммами других (скажем, предыдущих) столбцов. streamline 7 лет назад 0
Спасибо, Луи, за правки. Если на вопрос дан ответ или он неадекватен, закройте его. streamline 7 лет назад 0
Я думаю, что вы можете сделать это с VBA. Это будет немного сложно и сложно. Но у вас есть доступ ко всем элементам диапазона, вы можете перебирать элементы и разыменовывать отдельные элементы диапазона. IQV 7 лет назад 0
Привет @IQV, это были мои мысли, точно. Тем не менее, мне было интересно, есть ли какая-нибудь команда / функция в Excel, о которой я не знал. Кроме того, я немного знаком с программированием макросов, но боюсь, что не буду производить самый чистый код. У вас есть какие-нибудь предложения? Спасибо за ваш вклад! streamline 7 лет назад 0
Я давно писал VBA-макросы. Но `Range` -функция, простые` for`-циклы и функции `Cells` и` Offset` должны сделать это для вашей задачи. IQV 7 лет назад 1
Почему это важно, если вы создаете чистый код? Вы пишете макрос, а не программу! Во-вторых, вы можете использовать Range ("A1"). Formula, чтобы получить формулу. Отсюда вы выполняете логику и заменяете содержимое ячейки Dave 7 лет назад 0
это может сделать простая программа на любом языке программирования, вы можете нанять кого-нибудь, чтобы написать для этого веб-интерфейс, это может стоить вам, но не дорого, как кто-то может сделать это за 10 долларов. barlop 7 лет назад 0
@ barlop, вопрос был не в том, чтобы заплатить кому-то, чтобы сделать это, а в том, чтобы узнать, как это сделать. У меня есть много студентов, которые специализируются в области компьютерных наук, и это может сделать это бесплатно. это не проблема ... streamline 7 лет назад 0
@ streamline хорошо, вам немного повезло, что вы получили ответ, который дал вам запрограммированное решение ... потому что сайт для программирования - stackoverflow, но они сказали бы, что не задают вопросы типа домашней работы, когда кто-то говорит, что хочет написанная программа .. Они могли даже сказать, что здесь, за исключением того, что, возможно, возможно, что это не нуждалось в программировании. Если вы хотите учиться, то ожидаемое разочарование состоит в том, чтобы увидеть, ну хорошо, это требует VBA, а затем попробуйте и сделайте что-нибудь попроще, например, сделайте макрос, в котором, если вы наберете = A в ячейке, он скажет = Z, а если вы застряли, спросите .. barlop 7 лет назад 0
@ Барлоп, я ценю любые ответы, даже критику, если это конструктивно. Как я уже сказал, я хотел показать своим ученикам, которые имеют минимальные навыки Excel, кое-что о вычислении дисперсии для нескольких выборок, и это дает право перемешивать столбцы вокруг. Что касается «подарка», я попросил совета. Быть счастливчиком - это вопрос интерпретации. Модераторы должны закрыть / заблокировать неадекватный / неподходящий вопрос, а опытные пользователи - сообщить / изменить его, как / при необходимости. Я убежден, что ответ Дейва, несомненно, поможет многим людям! streamline 7 лет назад 0
Преобразованный - сильное слово. SUM (A1: D2) совпадает с SUM (A1, A2, B2, ... D2) совпадает с = A1 + A2 .... + D2 совпадает с SUM (A1: A2, B1: B2) , ..., D1: D2). Я считаю, что использование VBA даже не является фактором, если вы не любите программирование ради программирования. Ради забавы программисты делают мирские вещи, как это, но это то, что делают программисты. ejbytes 7 лет назад 0

2 ответа на вопрос

2
Dave

Хотя вы отметили это функцией «Рабочий лист», вы говорите об использовании VBa в вопросе. Этот VBa делает оба примера, которые вы дали

Option Explicit Sub EeekPirates()  Dim formula As String formula = Range("B4").formula  Dim split1() As String split1 = Split(formula, "(")  Dim temp As String temp = Replace(split1(1), ")", "")  Dim splitty() As String splitty = Split(temp, ":")  Dim firstCol As Integer firstCol = AscW(Left(splitty(0), 1))  Dim secondCol As Integer secondCol = AscW(Left(splitty(1), 1))  Dim firstRow As Integer firstRow = Right(splitty(0), 1)  Dim secondRow As Integer secondRow = Right(splitty(1), 1)  Range("B5").Value = "" ' this could be updated to `B4 = `  Dim i As Integer Dim j As Integer  For j = firstRow To secondRow For i = firstCol To secondCol Range("B5").Value = Range("B5").Value & Chr(i) & j & "+" Next i Next j  Dim length As Integer length = Len(Range("B5").Value) - 1 Range("B5").Value = Left(Range("B5").Value, length)  End Sub 

Просто помните, что отмены нет, поэтому сначала сделайте резервную копию.

Как добавить VBA в MS Office?

Пример с А1: D1

enter image description here

Пример с А1: D2

enter image description here

Согласно комментариям в коде, если вы обновляете с

Range("B5").Value = "" 

в

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

Вы закончите с (в B5)

B4 = A1 + B1 + C1 + D1 
Привет, @Dave! Спасибо! Просто из любопытства, почему нет отмены для этого? Это не может быть сделано, или это просто случай для этого решения? Только если у вас есть время, чтобы ответить на него, в противном случае, еще раз спасибо. И извините за то, что не опубликовал мой вопрос в разделе, связанном с VBA. Я думал об этом только после своего редактирования (после комментария IQV). streamline 7 лет назад 0
Еще раз спасибо, @Dave. Мне было просто любопытно. Я всегда могу дублировать лист, чтобы иметь резервную копию, но я не знал этого о макросах VBA. streamline 7 лет назад 0
2
g.kov

Минимальный рабочий пример с функцией VBA unroll(), которая принимает ссылку на ячейку с одной функцией (например sum, count, min) и раскатывает ее аргумент (список диапазонов) в виде списка отдельных клеток.

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 = "Not a formula" 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 

enter image description here

Примечание: как минимальный пример, он неправильно обрабатывает двухбуквенные ссылки на столбцы.

* Редактировать *

Добавлено Function ColumnNoToNameдля обработки ссылок на ячейки со столбцами> 26.

enter image description here

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 = "Not a formula" 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 
Что делает `:`? Это просто позволяет несколько объявлений в одной строке? Dave 7 лет назад 0
@Dave: см., Например, [Использование двоеточий для размещения двух операторов в одной строке в Visual Basic] (http://stackoverflow.com/a/1413425/3219646). g.kov 7 лет назад 0
Вау, @ g.kov (это, вероятно, не так много значит, для новичка, как я, но вау), спасибо! Это тоже здорово! Спасибо, что поделились и нашли время, чтобы опубликовать его. streamline 7 лет назад 0
Привет, @Dave, я проголосовал за оба ответа, твой и g.kov. Как еще! Но, поскольку я новичок в суперпользователе, я должен достичь некоторого минимального порога репутации (15, я думаю), чтобы мой голос был показан. Я сожалею о том, что. Я не знаю, что вы подразумеваете под принятием ответов. streamline 7 лет назад 0

Похожие вопросы