Kategorie szkoleń | Egzaminy | Kontakt
  • 2
  • 0
  • 1

Dzień dobry.

Mam dwie tabele w Excelu.

Tabela 1 zawiera zestawienie wszystkich połączeń telefonicznych oraz ich statusy. Jeden wiersz to jedno połączenie. Do jednego numeru telefonu można wykonać kilka prób połączeń, to znaczy, że jeden numer telefonu może pojawić się w kilku wierszach.

W tabeli 2 potrzebna jest informacja, jakie były statusy połączeń dla każdego numeru telefonu. Nr tel powinien być wartością unikatową, natomiast statusy każdego połączenia powinny być dodane w kolejnych kolumnach.

W załączeniu przesyłam przykład. Będę bardzo wdzięczna za pomoc w rozwiązaniu problemu.

Pozdrawiam.
Karolina.

Załączniki

  • xlsx

    przykład.xlsx ( 9K )
Karolina_Garbacz
  • Zapytał
  • @ Karolina_Garbacz | 26.09.2019
    • 0
    • 0
    • 0
Zaloguj się aby zadać pytanie
Pokrewne

Odpowiedzi (2)

  • 0

Cześć.

Nie lubię prostych rozwiązań, więc proponuję takie. Mirek pewnie zmieści to w jednej linijce kodu. ;)

Function pobierz()
Dim conn As Object, db As Object, rst As Object, dbPath As String, keysRs As Object, KomDocelNrTel As Range, ZAKRES As Range, SPR As Range, KomDocelOld As Range, xlWB As Workbook, xlSH2 As Worksheet, test As Range
Dim i As Integer, x As Integer

On Error GoTo PrzyBłędzie

Set xlWB = ThisWorkbook
Set xlSH2 = xlWB.Sheets("Arkusz2")
Set conn = CreateObject("DAO.DBEngine.120")
Set ZAKRES = Sheets("Arkusz1").Range("a1", Range("a1").End(xlDown).Offset(0, 1))
dbPath = xlWB.FullName
Set db = conn.OpenDatabase(dbPath, False, True, "Excel 12.0 Xml;HDR=Yes;")
Set keysRs = db.openrecordset("SELECT [Numer Telefonu] FROM [Arkusz1$" & ZAKRES.Address(False, False) & "] GROUP BY [Numer Telefonu]")

If xlWB.Sheets("Arkusz2").Range("a2") = "" Then
    Set KomDocelNrTel = xlWB.Sheets("Arkusz2").Range("a2")
    Set SPR = xlSH2.Range("a1")
Else
    Set KomDocelNrTel = xlWB.Sheets("Arkusz2").Range("a1").End(xlDown).Offset(1, 0)
    Set SPR = xlSH2.Range("a1", xlSH2.Range("a1").End(xlDown))
End If

Set KomDocelOld = KomDocelNrTel

i = 0
Do Until keysRs.EOF
    x = 1
    Set rst = db.openrecordset("SELECT * FROM [Arkusz1$" & ZAKRES.Address(False, False) & "]  WHERE [Numer telefonu]=" & keysRs.Fields(0))
    Set test = SPR.Find(keysRs.Fields(0), , xlValues, xlWhole)
    
    If Not test Is Nothing Then
        Set KomDocelNrTel = test
    Else
        Set KomDocelNrTel = KomDocelOld.Offset(i, 0)
    End If
    
    KomDocelNrTel.Value = keysRs.Fields(0)
    
    Do Until rst.EOF
        KomDocelNrTel.Offset(0, x).Value = rst.Fields(1)
        rst.MoveNext
        x = x + 1
    Loop
    
    i = i + 1
    keysRs.MoveNext
Loop

KoniecPracy:
On Error Resume Next
keysRs.Close
db.Close

Set db = Nothing
Set conn = Nothing
Set keysRs = Nothing
Set xlWB = Nothing
Set xlSH2 = Nothing
Set ZAKRES = Nothing
Set test = Nothing
Set KomDocelNrTel = Nothing
Set KomDocelOld = Nothing
Set SPR = Nothing
Exit Function

PrzyBłędzie:
MsgBox Error$
Resume KoniecPracy

End Function

Kod aktualizuje tabelę w Arkuszu 2, więc jeśli numer już tam ujęty zostanie dodany z nowym statusem, to nie zostanie utworzony nowy wiersz, tylko zaktualizowany będzie już istniejący. Czyli w tabeli 2 zawsze będą unikatowe numery telefonów.

Tomasz_Kasprzycki
  • Odpowiedział
  • @ Tomasz_Kasprzycki | 27.09.2019
    • 2
    • 4
    • 8
  • 1

Ja dla odmiany zaproponuję rozwiązanie w Power Query, to narzędzie jest stworzone właśnie do takich przypadków. :)

let
    Źródło = Excel.CurrentWorkbook(){[Name="Tabela1"]}[Content],
    max = List.Max(Table.Group(Źródło, {"Numer telefonu"}, {{"Liczność", each Table.RowCount(_), type number}})[Liczność]),
    kolumny = List.Generate(() => 1, each _ <= max, each _ + 1, each "Column" & Text.From(_)),
    #"Pogrupowano wiersze" = Table.Group(Źródło, {"Numer telefonu"}, {{"status", each Table.LastN(Table.Transpose(_), 1), type table}}),
    #"Rozwinięty element status" = Table.ExpandTableColumn(#"Pogrupowano wiersze", "status", kolumny, List.Transform(kolumny, each Text.Replace(_, "Column", "Status ")))
in
    #"Rozwinięty element status"

 

 
Mirosław_Janiak
  • Odpowiedział
  • @ Mirosław_Janiak | 27.09.2019
    • 1
    • 7
    • 1