Использование Power BI для создания указанных c столбцов (как заголовков, так и данных в заголовке) на основе заданных условий c в других столбцах - PullRequest
0 голосов
/ 28 февраля 2020

Я впервые начал это с VBA, и мне посоветовали использовать PowerBI. Тем не менее, я не знаю, можно ли решить мою проблему с помощью powerBI.

У меня есть файл, который будет отправляться периодически, с указанием c информации, которую нужно сгруппировать. Я пытаюсь создать макрос VBA, чтобы автоматизировать подготовку файла и сделать его пригодным для импорта в другом инструменте.

У меня около 40 колон, но иногда меньше. Место столбцов иногда меняется, поэтому я не могу сослаться на место столбца (A, B, C ...). Мне нужно искать имя столбца.

Кроме того, я должен искать некоторые конкретные c столбец. Если в этих столбцах есть данные, мне нужно добавить элемент c для каждого случая в ранее объединенные столбцы.

Ниже приведен пример кода

Вот описание фиктивных данных:

| Клиент | ID | Инфо Супермен | Информация Тип продукта | Spe c 1 | Spe c 2 | Spe c a | Spe c b | Информация о типе клиента | Тип объекта информации | География |

Когда ни «spe c 1», ни «spe c 2», ни «Spe c a», ни «Spe c b» не имеют значений, которые мне нужны для группировки данных в следующим образом (включая заголовки): "Клиент" + "Супермен" + Браво + "Тип информационного клиента" + Тип информационного объекта "т.е. ClientSpermanBravoInfo

Если есть значение для Spe c 1 или 2:" Клиент "" Супермен "AlphaBravo" Тип информации о клиенте "Тип услуги информации"

Если есть значение для Spe c 1 или 2 и Spe c a и b: "Клиент" "Супермен" AlphaAlphaBravo " Тип информационного клиента "Тип средства информации".

Пока у меня есть следующий код VBA, но использование PowerBI предоставило бы более простое и более элегантное решение. Я искал, например, ресурсы, близкие к этому: https://powerbi.microsoft.com/en-us/blog/power-bi-desktop-april-update-feature-summary/ для запроса данных определенным c способом и создания столбцов на основе определенных c условий, но я не могу найти решение.

Dim data


        data = .Resize(.Rows.Count - 1).Offset(1).Value
    End With


    Dim result As Dictionary
    Set result = New Dictionary
    Dim i
    For i = 1 To UBound(data, 1)
        Select Case True
            Case _
                data(i, headers("Costumer")) = "" Or _
                data(i, headers("Zone ")) = "" Or _
                    MsgBox "Empty row"
                    Exit For
            Case _
                data(i, headers("Spec A")) = "" And _
                data(i, headers("Spec B")) = "" And _
                data(i, headers("Spec_C ")) = "" And _
                data(i, headers("Spec_D ")) = ""
                    result(result.Count) = _
                        q & "Costumer" & data(i, headers("Costumer”)) & _
                        q & "Alpha" & _
                        q & "Zone" & data(i, headers("Zone")) & _
                          q
            Case _
                data(i, headers("Spec_1")) = "" And _
                data(i, headers("Spec_2")) = "" And _
                data(i, headers("Spec_3")) = "" And _
                data(i, headers("Spec_4")) = "" And _
                data(i, headers("Spec_5")) = "" And _
                data(i, headers("Spec_6")) = "" And _
                data(i, headers("Spec_7")) = ""
                    result(result.Count) = _
                        q & "Costumer" & data(i, headers("Costumer")) & _
                        q & "Alphabet" & _
                        q & "Zone" & data(i, headers("Zone")) & _
                        q
            Case Else
                    result(result.Count) = _
                        q & " Costumer" & data(i, headers("Costumer ")) & 
                        q & "AlphabetAlpha" & _ 
                        q & " Zone " & data(i, headers("Zone")) & _
                        q
        End Select

    Next
    ' output result data to sheet 2
    If result.Count = 0 Then
        MsgBox "No result data for output"
        Exit Sub
    End If
    With ThisWorkbook.Sheets(2)
        .Cells.Delete
        .Cells(1, 1).Resize(result.Count).Value = _
            WorksheetFunction.Transpose(result.Items())
    End With
    MsgBox "Completed"



Sub TralaNome()

    Const q = """"

    ' get source data table from sheet 1
    With ThisWorkbook.Sheets(1).Cells(1, 1).CurrentRegion

   ' check if data exists
        If .Rows.Count < 2 Or .Columns.Count < 2 Then
            MsgBox "No data table"
            Exit Sub
        End If

   ' retrieve headers name and column numbers dictionary
        Dim headers As Dictionary
        Set headers = New Dictionary
        Dim headCell
        For Each headCell In .Rows(1).Cells
            headers(headCell.Value) = headers.Count + 1
        Next

   ' check mandatory headers

        For Each headCell In Array(("Costumer", "ID", "Zone“,  "Product Quali", "Spec A", "Spec B", "Spec_C", "Spec_D", "Spec_1",  " Spec_2", " Spec_3", " Spec_4", " Spec_5", " Spec_6", " Spec_7", "Chiavetta", "Tipo_di _prodotto",  "Unicorno_Cioccolato", “cacao tree“)
            If Not headers.Exists(headCell) Then
                MsgBox "Header '" & headCell & "' doesn't exists"
                Exit Sub
            End If
        Next
        Dim data

 ' retrieve table data
        data = .Resize(.Rows.Count - 1).Offset(1).Value
    End With

   ' process each row in table data
    Dim result As Dictionary
    Set result = New Dictionary
    Dim i
    For i = 1 To UBound(data, 1)
                    MsgBox "Empty row"
                    Exit For
                    result(result.Count) = _
                        q & "ID " & data(i, headers("ID ")) & _
                        q & " Tipo_di _prodotto " & data(i, headers("Tipo_di _prodotto")) & _
                        q & " Unicorno_Cioccolato " & data(i, headers("Unicorno_Cioccolato")) & _
                        q & " cacao tree " & data(i, headers("cacao tree "))&_qEnd Select

    Next

    ' output result data to sheet 2
    If result.Count = 0 Then
        MsgBox "No result data for output"
        Exit Sub
    End If
    With ThisWorkbook.Sheets(2)
        .Cells.Delete
        .Cells(1, 1).Resize(result.Count).Value = _
            WorksheetFunction.Transpose(result.Items())
    End With
    MsgBox "Completed"


     End Sub


   Sub NewColumnNames()

   Dim OrignialColumnNames As String
   Dim a As Integer
   Dim NewColumnNames As Integer


   Spec A = Amber A 
  Spec_B = Amber B
  Spec_C = Amber C
  Spec_D = Amber D
  Spec_1 = Zio_1
  Spec_2 = Zio_2
  Spec_3 = Zio_3
  Spec_4 = Zio_4
  Spec_5  = Zio_5
  Spec_6 = Zio_6
  Spec_7 = Zio_7
  Noup_Start = Mip_F
  Noup_End = Nip_D
  Snouba = Snup_N
  SnipChocolat = Choco_F

    End Sub

1 Ответ

1 голос
/ 28 февраля 2020

Если вы можете использовать PowerQuery вместо ответа PowerBI, если данные были загружены в powerquery (Данные .... Из таблицы / Ярости ... [x] моя таблица имеет заголовки), то добавление простого пользовательского столбца, вероятно, будет сделать это.

Добавить столбец ... Пользовательский столбец ... с формулой, аналогичной приведенной ниже; он объединяет столбцы, используя символ &, основываясь на значениях других столбцов в этой строке, независимо от того, где эти столбцы появляются или сколько их столбцов

= if [Spec 1]=null and [Spec 2]=null then [Client]&" "&[ID]&" "&[Info Superman] else
if [Spec 1]<>null and [Spec 2]<>null then [Info Product type]&" "&[Info Superman] else
null

Затем можно использовать Transform ... Group By. .. сгруппировать по этому столбцу и сохранить обратно в книгу с помощью Файл ... Закрыть и Загрузить ...

...