Изменить источник данных Power Query - PullRequest
0 голосов
/ 14 июня 2019

EDIT:

Я отладил и обнаружил, что, хотя я вижу все таблицы запросов перед собой в ссылочных листах, Excel сосчитал и нашел 0 таблиц запросов в любых листах.


РЕДАКТИРОВАТЬ 2:

Итак, я обнаружил, что QueryTables существует под ListObjects. Итак, сейчас я пытаюсь создать новое соединение с источником данных следующим образом:

tw.Worksheets(2).ListObjects(1).QueryTable.Connection = "OLEDB;" & M1
tw.Worksheets(5).ListObjects(1).QueryTable.Connection = "OLEDB;" & M1
tw.Worksheets(3).ListObjects(1).QueryTable.Connection = "OLEDB;" & M2
tw.Worksheets(6).ListObjects(1).QueryTable.Connection = "OLEDB;" & M2
tw.Worksheets(4).ListObjects(1).QueryTable.Connection = "OLEDB;" & M3
tw.Worksheets(7).ListObjects(1).QueryTable.Connection = "OLEDB;" & M3

ОРИГИНАЛЬНЫЙ ПОЧТА

Я хочу использовать VBA для дальнейшей автоматизации процесса отчетности. Первым шагом является обновление всех данных на основе данных за квартал и год, введенных на странице сводки.

Вот как это выглядит в данный момент Qd_sht

Моя цель - сделать 3 вещи и иметь возможность обновлять данные.

  1. Изменить квартал
  2. Отчет об изменении года
  3. Нажмите кнопку Обновить все

Ниже приведен мой код, который я пытаюсь использовать для этого. У меня есть Excel 16, и я пытаюсь обновить Macro Workbook с помощью соединений Excel. Где я сталкиваюсь с проблемой «Подпись вне диапазона»:
tw.Worksheets(2).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M1

Public Sub Refresh_All()

    Dim tw As ThisWorkbook: Set tw = ThisWorkbook
    Dim qd As Worksheet: Set qd = tw.Worksheets("Quarterly Data")
    Dim yr As String: yr = qd.Range("H11").Value2
    Dim qrtr As String: qrtr = qd.Range("G11").Value2
    Dim fpath As String: fpath = "X:\Dump Report for Loans\" & yr
    Dim ldr As String: ldr = "\Loan Dump Report (000.Original).xlsx"
    Dim M1 As String
    Dim M2 As String
    Dim M3 As String

    If qrtr = "Q1" Then
        M1 = fpath & "\02-01-" & yr & ldr
        M2 = fpath & "\03-01-" & yr & ldr
        M3 = fpath & "\04-01-" & yr & ldr

        tw.Worksheets(2).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M1
        tw.Worksheets(2).QueryTables(1).Refresh
        tw.Worksheets(3).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M2
        tw.Worksheets(3).QueryTables(1).Refresh
        tw.Worksheets(4).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M3
        tw.Worksheets(4).QueryTables(1).Refresh
    ElseIf qrtr = "Q2" Then
        M1 = fpath & "\05-01-" & yr & ldr
        M2 = fpath & "\06-01-" & yr & ldr
        M3 = fpath & "\07-01-" & yr & ldr

        tw.Worksheets(2).QueryTables(1).Item Connection:=M1
        tw.Worksheets(2).QueryTables(1).Refresh
        tw.Worksheets(3).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M2
        tw.Worksheets(3).QueryTables(1).Refresh
        tw.Worksheets(4).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M3
        tw.Worksheets(4).QueryTables(1).Refresh
    ElseIf qrtr = "Q3" Then
        M1 = fpath & "\08-01-" & yr & ldr
        M2 = fpath & "\09-01-" & yr & ldr
        M3 = fpath & "\010-01-" & yr & ldr

        tw.Worksheets(2).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M1
        tw.Worksheets(2).QueryTables(1).Refresh
        tw.Worksheets(3).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M2
        tw.Worksheets(3).QueryTables(1).Refresh
        tw.Worksheets(4).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M3
        tw.Worksheets(4).QueryTables(1).Refresh
    ElseIf qrtr = "Q4" Then
        M1 = fpath & "\11-01-" & yr & ldr
        M2 = fpath & "\12-01-" & yr & ldr
        M3 = fpath & "\01-01-" & yr + 1 & ldr

        tw.Worksheets(2).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M1
        tw.Worksheets(2).QueryTables(1).Refresh
        tw.Worksheets(3).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M2
        tw.Worksheets(3).QueryTables(1).Refresh
        tw.Worksheets(4).QueryTables(1).Item Connection:="EXCEL.Worksheets;" & M3
        tw.Worksheets(4).QueryTables(1).Refresh
    Else:
        MsgBox "ERROR!! NO QUARTER ENTERED!!"
    End If

    ThisWorkbook.RefreshAll

End Sub

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 19 июня 2019

После некоторого внешнего обсуждения с @chillin, мы пришли к решению, которое будет использовать M/Power Query, чтобы сделать его более динамичным. Ниже приведен код, который прекрасно работает. Еще раз спасибо @ Chillin.

let  

    GetNamedRangeInCurrentWorkbook = (nameOfRange as text) as any => Excel.CurrentWorkbook(){[Name=nameOfRange]}[Content][Column1]{0},  
    quarterFromSheet = Text.From(GetNamedRangeInCurrentWorkbook("quarter")),  
    yearFromSheet = Text.From(GetNamedRangeInCurrentWorkbook("year")),  
    quarterNumber = try Number.From(Text.End(quarterFromSheet, 1)) otherwise error "Could not convert 'quarter' to a number",   
    filename = "Loan Dump Report (000.Original).xlsx",  
    startOfFinancialYear = #date(Number.From(yearFromSheet), 2, 1),  
    MonthInFilePath = (startDate as date, quarter as number, month as number) as date => Date.AddMonths(startDate, ((quarter-1) * 3) + month - 1), 
    DetermineFilePath = (month as number) as text =>  

    let
        targetMonth = MonthInFilePath(startOfFinancialYear, quarterNumber, month), folderPath = "X:\Dump Report for Loans\" & Date.ToText(targetMonth, "yyyy") & "\", subFolder = Date.ToText(targetMonth, "MM-dd-yyyy"), fullFilePath = folderPath & subFolder & "\" & filename
    in
        fullFilePath  

in
    DetermineFilePath
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...