여러 열의 고유 값


0

다음과 같은 스프레드 시트가 있습니다.

Prod No     Store 1 $    Store 1 Qty    Store 2 Sale    Store 2 Qty  etc
A               4.00         1             7.50            2
B               0            0             15.00           1
C               4.00         2              -8             -1
D               5.00         1              5.00           1

각 부품에 대한 고유 한 가격을 모두 받아야하고 각 가격에 대한 수량을 합산해야합니다. 예를 들어,

Prod No A has 4.00 1 unit and 7.50 2 units
Prod No B has 0.00 0 units and 15.00 1 unit
Prod No C has 4.00 2 units and -8 -1 unit
Prod No D has 5.00 2 units

또한 각 가격에 대한 고유 한 가격 및 수량의 목록이 필요합니다.

예를 들어,

4.00 3 units
7.50 2 units
0.00 0 units
-8 -1 unit
15.00 1 unit
5.00 2 units

위의 항목에서 시트의 레이아웃을 이해하는 것은 매우 어렵습니다. (또는 스크린 샷을 게시 할 수 있습니까?) 그러면 레이아웃을 더 잘 이해할 수 있습니까?
jimbobmcgee

OK, Markdown을 보면 나는 당신의 시트가 어떻게 보이는지 볼 수있다. 몇 가지 질문 : 1 가격 / 수량 쌍 (또는 적어도 합리적인 최대치)의 고정 번호가 있습니까? 2 얼마나 더 범위를 좁혀서 시트를 조금 더 비정규 화 된 것으로 재 배열해야합니까? 매크로 / VBA에 대한 제한 사항은 무엇입니까?
jimbobmcgee

답변:


0

우선, 데이터를보다 수평적인 형태로 저장하는 경우 장기적으로 볼 때 더 많은 행운이 남을 것으로 생각합니다.

Store      Product     Qty    Sales
Store 1    A           1      4.00
Store 1    B           0      0.00
Store 1    C           2      4.00
Store 1    D           0      0.00

열 쌍이 아닌 단일 열에 대해 조회하는 것이 훨씬 쉽습니다.

(규모와 규모에 따라 별도의 Store, Product 및 Sales 테이블이있는 Access 데이터베이스가 그보다 더 좋을 수도 있습니다)

즉, 가지고있는 물건에 갇혀 있고 시트에 VBA 매크로를 숨길 수 있다면 다음을 시도해 볼 수 있습니다.

  1. 호출 된 VBA 프로젝트에 클래스 모듈 추가 Tuple, 포함 :

    Private szKey As String
    Private nValue As Double
    
    Public Property Get Key() As String
        Key = szKey
    End Property
    Public Property Let Key(newKey As String)
        szKey = newKey
    End Property
    
    Public Property Get Value() As Double
        Value = nValue
    End Property
    Public Property Let Value(newValue As Double)
        nValue = newValue
    End Property
    
  2. 일반 모듈을 추가합니다 (예 : Module 1 귀하의 프로젝트에 포함 된 내용 :

    Public Function Summarize(ByRef rng As Range) As String
        If rng.Cells.Count Mod 2 = 1 Then Err.Raise 100, "", "Expected range of even cells"
    
        Dim coll As New Collection
    
        On Error Resume Next
        Dim flag As Boolean: flag = False
        Dim prevCel As Range, cel As Range: For Each cel In rng.Cells
            If flag Then
                Dim Key As String: Key = "" & prevCel.Value2
                coll(Key).Value = coll(Key).Value + cel.Value2
    
                If Err.Number <> 0 Then
                    Err.Clear
                    Dim t1 As New Tuple
                        t1.Key = "" & prevCel.Value2
                        t1.Value = cel.Value2
                        coll.Add t1, Key
                    Set t1 = Nothing
                End If
            End If
            Set prevCel = cel
            flag = Not flag
        Next cel
        On Error GoTo 0
    
        Dim t2 As Variant: For Each t2 In coll
            If Len(Summarize) Then Summarize = Summarize & ", "
            Summarize = Summarize & Format(t2.Key, "#0.00") & " @ " & t2.Value
        Next t2
    End Function
    
  3. 그런 다음 워크 시트에서 다음과 같은 수식을 입력 할 수 있습니다.

    ="Product " & $A2 & " has " & Summarize($B2:$I2)
    

    가능한 모든 상점 수를 충당 할만큼 충분히 넓은 범위로 $ B2 : $ I2 범위를 대체해야합니다. 또한 Sale / Qty 값이 쌍으로되어 있기 때문에 짝수 크기의 범위를 사용해야합니다. 그렇지 않으면 #VALUE 오류.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.