具有动态单元格值的Excel查询

时间:2020-09-02 18:04:09

标签: excel powerquery m

我需要一些帮助来组织需要做的事情。 我有一个股票报价器代码列表,需要下载每个代码才能显示在查询表中。即使是简化版本,也是如此:

enter image description here

我已经为网络查询构建了一个url,但是由于我的代码更改为每个请求,因此我不知道如何查询查询的代码单元(C2,G2等)。如果我为这些单元格命名,但是否必须为它们每个命名?有没有一种方法可以根据单元格引用来查看单元格值? 在下面的示例中,它必须位于 来源= Json.Document(Web.Contents(meurl1)),在这里我会投放meurl1&C2或类似的内容。 有什么主意吗?

let
meurl1 = Excel.CurrentWorkbook(){[Name="meurl1"]}[Content]{0}[Column1],
Source = Json.Document(Web.Contents(meurl1 )),
#"Converted to Table" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"date", "close", "high", "low", "open"}, {"Column1.date", "Column1.close", "Column1.high", "Column1.low", "Column1.open"}),
#"Changed Type" = Table.TransformColumnTypes(#"Expanded Column1",{{"Column1.date", type datetime}}),
#"Renamed Columns" = Table.RenameColumns(#"Changed Type",{{"Column1.date", "Date"}, {"Column1.close", "Close"}, {"Column1.high", "High"}, {"Column1.low", "Low"}, {"Column1.open", "Open"}}),
#"Reordered Columns" = Table.ReorderColumns(#"Renamed Columns",{"Date", "Open", "High", "Low", "Close"}),
#"Sorted Rows" = Table.Sort(#"Reordered Columns",{{"Date", Order.Descending}})

1 个答案:

答案 0 :(得分:0)

下面的示例将在单个表中加载所有行情指示器的数据-而不是在每个行情指示器中单独的表。

  1. 在Excel文件中创建一个名为tickers的命名范围,该范围在单个列中包含所有代码(您需要获取数据)。

  2. 将下面的代码复制粘贴到Power Query的“高级编辑器”中-然后查看它是否提供了预期的输出。

我提供了三个示例(verticalTablehorizontalTableanotherHorizontalTable)。查看这三个参数中哪一个最适合您和您的数据。

我不确定meurl1的值在您的文件中是什么,所以我只是从您的问题中复制粘贴了它。


let
    tickers = Excel.CurrentWorkbook(){[Name="tickers"]}[Content][Column1],
    url = Excel.CurrentWorkbook(){[Name="meurl1"]}[Content]{0}[Column1],
    getTickerData = (someTicker as text) as table => 
        let
            response = Web.Contents(url & someTicker),
            parsed = Json.Document(response),
            toTable = Table.FromRecords(parsed, type table [
                date = datetime, open = number, high = number, low = number, close = number
            ])
        in toTable,
    // This approach should stack your ticker data vertically.
    // It's not what you asked for, but it might be a bit quicker than the approaches below.
    verticalTable = 
        let
            looped = List.Transform(tickers, each [ticker = _, data = getTickerData(ticker)]),
            toTable = Table.FromRecords(looped, type table [ticker = text, data = record]),
            expanded = Table.ExpandTableColumn(toTable, "data", {"date", "open", "high", "low", "close"}, {"Date", "Open", "High", "Low", "Close"})
        in expanded,
    // This approach will stack your ticker data horizontally, but with all tickers sharing a single
    // Date column.
    horizontalTable = 
        let
            allData = List.Transform(tickers, each [ticker = _, data = getTickerData(ticker)]),
            uniqueDates = List.Distinct(List.Combine(List.Transform(allData, each [data][date]))),
            looped = List.Accumulate(
                allData,
                Table.FromColumns({uniqueDates}, type table [Date = datetime]),
                (tableState as table, tickerData as record) as table =>
                    let
                        columnsToExpand = List.RemoveItems(Table.ColumnNames(tickerData[data]), {"date"}),
                        joined = Table.NestedJoin(tableState, "Date", tickerData[data], "date", "_toExpand"),
                        expanded = Table.ExpandTableColumn(joined, "_toExpand", columnsToExpand, List.Transform(columnsToExpand, each tickerData[ticker] & " (" & Text.Proper(_) & ")"))
                    in expanded
            )
        in looped,
    // This approach will stack your ticker data horizontally, but the difference here is each ticker
    // will have its own Date column.
    anotherHorizontalTable = 
        let
            looped = List.Accumulate(
                tickers,
                {},
                (tableColumns as list, ticker as text) as list =>
                    let
                        tickerTable = getTickerData(ticker),
                        renamed = Table.TransformColumnNames(tickerTable, each ticker & " (" & Text.Proper(_) & ")"),
                        columnNames = Table.ColumnNames(renamed),
                        columns = Table.ToColumns(renamed),
                        columnsWithMeta = List.Transform(List.Positions(columns), each columns{_} meta [columnName = columnNames{_}]),
                        combined = tableColumns & columnsWithMeta
                    in combined
            ),
            toTable = Table.FromColumns(looped, List.Transform(looped, each Value.Metadata(_)[columnName]))
        in toTable
in
    anotherHorizontalTable