การแปลง / แปลงผลรวม (A1: D1) เป็น A1 + B1 + C1 + D1 ใน Excel


2

ดังนั้นสถานการณ์คือสิ่งนี้ฉันต้องการทราบว่ามีวิธีการแปลงผลรวมของช่วงของเซลล์เป็นผลรวมจากการเพิ่มแต่ละเซลล์แยกจากกันตามที่แสดงในชื่อเรื่อง ตัวอย่างเช่นสมมติว่าคนมีการคำนวณนี้ในเซลล์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 แม้ว่าฉันรู้พื้นฐานและฉันจะลองด้วยตัวเอง


3
ฉันสับสนว่าทำไมคุณต้องทำเช่นนี้ ...
Aurus Huang

คำตอบสั้น ๆ : ไม่คุณไม่สามารถทำได้เว้นแต่พิมพ์ด้วยตนเอง ฉันเห็นด้วยกับความคิดเห็นก่อนหน้า: ทำไมคุณต้องการมัน ผลลัพธ์จะเหมือนกันทุกประการ
MátéJuhász

สวัสดี @AurusHuang & Mate มีสองเหตุผลหลักแรกเพื่อแสดงให้นักเรียนเห็นวิธีการทำงานของสูตร (ซับซ้อนเล็กน้อยเพื่อป้อนรายละเอียด) และประการที่สองคิดสถานการณ์ที่คุณต้องสลับคอลัมน์รอบ ๆ และ คุณมีคอลัมน์รวมกับคอลัมน์อื่น ๆ (พูดก่อนหน้านี้)
ปรับปรุง

ขอบคุณ @Louis สำหรับการแก้ไข หากคำถามได้รับคำตอบหรือไม่เพียงพอโปรดปิด
ปรับปรุง

1
เป็นเวลานานที่ฉันเขียน VBA-macros แต่-function Range, forsimple-ลูปและฟังก์ชั่นCellsและOffsetควรทำเพื่อปัญหาของคุณ
IQV

คำตอบ:


1

แม้ว่าคุณจะแท็กสิ่งนี้ด้วยฟังก์ชั่นแผ่นงานที่คุณพูดถึงเกี่ยวกับการใช้ 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 ได้อย่างไร

ตัวอย่างด้วย A1: D1

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่างด้วย A1: D2

ป้อนคำอธิบายรูปภาพที่นี่

ตามความคิดเห็นในรหัสหากคุณอัปเดต

Range("B5").Value = ""

ไปยัง

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

คุณจะจบลงด้วย (ใน B5)

B4 = A1 + B1 + C1 + D1

สวัสดี @Dave! ขอขอบคุณ! เพียงแค่อยากรู้อยากเห็นทำไมไม่มีการยกเลิกสำหรับมัน ไม่สามารถทำได้หรือเป็นเพียงแค่กรณีของการแก้ปัญหานี้ เฉพาะในกรณีที่คุณมีเวลาตอบรับมิฉะนั้นขอขอบคุณอีกครั้ง และขออภัยที่ไม่ได้โพสต์คำถามของฉันในส่วนที่เกี่ยวข้องกับ VBA ฉันแค่คิดถึงมันหลังจากการแก้ไขของฉัน (หลังจากความคิดเห็นของ IQV)
ปรับปรุง

ขอบคุณอีกครั้ง @Dave ผมก็แค่อยากรู้. ฉันสามารถทำสำเนาแผ่นงานได้ตลอดเวลาเพื่อสำรองข้อมูล แต่ฉันไม่รู้ว่าเกี่ยวกับมาโคร VBA
ปรับปรุง

1

ตัวอย่างการทำงานที่น้อยที่สุดที่มีฟังก์ชั่น 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

ป้อนคำอธิบายรูปภาพที่นี่

หมายเหตุ: เป็นตัวอย่างขั้นต่ำไม่สามารถอ้างอิงคอลัมน์สองตัวอักษรได้อย่างถูกต้อง

* แก้ไข *

เพิ่มFunction ColumnNoToNameเพื่อจัดการการอ้างอิงเซลล์ด้วยคอลัมน์> 26

ป้อนคำอธิบายรูปภาพที่นี่

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

อะไร:ทำอย่างไร สิ่งนี้อนุญาตให้มีการประกาศหลายรายการในหนึ่งบรรทัดหรือไม่
เดฟ


ว้าว @ g.kov (อาจไม่ได้มีความหมายอะไรมากนักจากมือใหม่อย่างฉัน แต่ว้าว) ขอบคุณ! นี่ก็ยอดเยี่ยมมาก! ขอขอบคุณที่แบ่งปันและสละเวลาโพสต์
ปรับปรุง

สวัสดี @ เดฟฉันลงคะแนนทั้งคำตอบของคุณและ g.kov ยังไงกัน! แต่เนื่องจากฉันใหม่สำหรับ superuser ฉันต้องถึงเกณฑ์ขั้นต่ำสำหรับชื่อเสียง (15 ฉันคิดว่า) เพื่อให้การลงคะแนนของฉันปรากฏ ฉันขอโทษเกี่ยวกับเรื่องนั้น อย่างไรก็ตามฉันไม่รู้ว่าคุณหมายถึงอะไรโดยยอมรับคำตอบ
ปรับปรุง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.