Промяна на пътя на външния източник на данни на обобщена таблица с макрос на Excel

Работя върху проект в MS Excel, където имам няколко обобщени таблици, които четат данни от текстов файл, разделен с табулатори, с имена на колони в първия ред (в същата директория като файла на Excel), използвайки текстовия драйвер на Microsoft. Сблъсках се с проблем, при който, когато копирам текстовите и Excel файловете в нова директория и се опитам да обновя данните, той казва, че не може да намери текстовите файлове. За съжаление изглежда няма начин да кажа на Excel, че искам пътищата до текстовите файлове да бъдат относителни, а не абсолютни. Всички осеви таблици използват една и съща връзка с данни, така че реших, че не би трябвало да е твърде предизвикателно да напиша макрос, който да актуализира връзката за данни, за да препраща към правилния текстов файл и да има бутон, свързан с макроса, който да актуализира файлови пътища и опресни данните за мен.

Не съм много запознат с VBA и онлайн документацията изглежда е доста лоша, така че не успях да накарам това да работи -- мога да създам правилния път на файла и да обновя данните, но не съм бил може да разбере как да актуализира връзката, за да използва новия файлов път, но да запази всичките си стари настройки за импортиране/разбор на файлове. Също така се опитах да запиша макрос, докато ръчно актуализирах източника на данни, но по някаква причина това винаги ми дава грешки, които прекъсват записа, така че това не помогна.

Следното е низът за свързване и текстът на командата, използвани в момента от връзката, но няма нищо за това как да се анализират/импортират данните (файлът е разделен с табулатори или има заглавки в първата колона и т.н.), така че не съм сигурен как да се уверите, че връзката запазва тези данни.

Низ за връзка:

DefaultDir=C:/directoryPath;Driver={Microsoft Text Driver (*.txt; *.csv)};
  DriverId=27;FIL=text;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;
  SafeTransactions=0;Threads=3;UserCommitSync=Yes;

Текст на командата:

SELECT *
FROM tableName.txt tableName

Ако някой знае как да напише макрос, който ще актуализира пътя във връзката към текстовия файл, моля, споделете кода или ако знаете как просто да направите пътя относителен, това също би било чудесно. Всяка помощ ще бъде високо оценена!

РЕДАКТИРАНЕ:

Бърках си с него още малко и успях да променя низовете за свързване, за да използвам новия път. Въпреки това, когато отида да обновя обобщената таблица, тя импортира всички данни като текст, вместо да познае дали трябва да бъде числова и т.н. (въпреки че получава заглавките на колоните поне от първия ред на текстовия файл). Някакви идеи как да му кажа да отгатва типовете данни (или просто да запази старите типове данни)? Кодът, който използвам в момента е:

Public Sub Test()
    Dim wb As Excel.Workbook
    Dim pc As PivotCache
    Dim path As String

    Set wb = ActiveWorkbook
    path = wb.path

    For Each pc In wb.PivotCaches
        'Debug.Print pc.Connection
        pc.Connection = "ODBC;DBQ=" & path & ";DefaultDir=" & path & ";Driver={Microsoft Text Driver (*.txt; *.csv)};DriverId=27;FIL=text;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UserCommitSync=Yes"

    Next
End Sub

person scaevity    schedule 24.08.2012    source източник
comment
MsgBox (ThisWorkbook.Path) трябва да помогне   -  person enderland    schedule 25.08.2012
comment
@enderland С какво би помогнало това?   -  person scaevity    schedule 25.08.2012
comment
Мисля, че това, което @enderland се опитва да каже, е, че когато използвате Thisworkbook.Path, той ще ви даде пълното име на директорията, където живее (мисля, че за сървъри обаче ще ви даде картографирано име на устройство, а не пълното UNC път). Не можете да вземете това плюс името на файла, за да получите новата си променлива DefaultDir. За достъп до тази променлива бих предложил да запишете макрос и да извършите отново връзката с текстовия файл, за да видите как Excel ще има достъп до него.   -  person Joseph    schedule 25.08.2012
comment
@joseph4tw Добре, но във въпроса си по-горе казах, че вече знам как да получа пътя. Споменах също, че се опитах да запиша макрос, но продължавах да получавам грешки, които спряха записа на макроса (мога да се свържа с текстов файл, но когато се опитам да запиша процеса, той вече не работи по някаква причина -- може би записът пречи на връзката или нещо подобно, не знам).   -  person scaevity    schedule 25.08.2012
comment
@scae уау, съжалявам за това. Напълно пренебрегнах тези изречения. Можете да опитате да преминете през QueryTables. Ще публикувам пример.   -  person Joseph    schedule 25.08.2012


Отговори (3)


Добре, така че успях да го направя и реших да споделя. Преминах през всяка връзка в работната книга и промених пътя й към новия път към текстовите файлове (създаден чрез получаване на пътя на активната работна книга и добавяне на името на директорията на текстовите файлове). Освен това, за да се уверя, че импортира текстовия файл правилно всеки път, когато трябваше да включа файл „schema.ini“ с информацията за импортиране (в същата директория като текстовия файл).

person scaevity    schedule 18.09.2012
comment
Оценявам, че публикацията ви е на повече от 8 години и вероятно сте продължили напред ... но ако има някакъв шанс да споделите окончателния си код (също използвайки ini ) файл - това би било чудесно, тъй като вярвам, че имам точно същият проблем като първоначалния!? - person Big Chris; 07.02.2021

Не съм напълно запознат със създаването на обобщени таблици точно по този начин, но обикновено можете да стигнете до информацията за обобщената таблица като Connection, като погледнете обекта QueryTable. Вижте този пример:

Option Explicit

Public Sub UpdatePivotTableConnections()
    Dim ws As Excel.Worksheet
    Dim qt As Excel.QueryTable
    Dim fileName As String

    For Each ws In ThisWorkbook.Worksheets
        For Each qt In ws.QueryTables
            fileName = GetFileName(qt)
            MsgBox "The file name for PivotTable '" & qt.Name & "' is: " & fileName
        Next
    Next
End Sub

Public Function GetFileName(ByRef qt As QueryTable) As String
    Dim s() As String
    s = Split(qt.Connection, "\")
    GetFileName = s(UBound(s))
End Function

Това не е пълен отговор, но е начало (не обичам да публикувам непълни отговори, но това беше единственият начин да ви покажа примерен код.) Вижте какво получавате с тази информация, ако имате достъп до информацията от там , опитайте да погледнете низа QueryTable.Connection и вижте как можете да го анализирате и замените за всяка обобщена таблица.

person Joseph    schedule 25.08.2012
comment
Добре, току-що опитах това и работи правилно за обикновени таблици, но не вижда обобщените таблици. Някакви други предложения? - person scaevity; 27.08.2012
comment
Не вижда тези осеви таблици? Това е странно. Когато щракнете вътре в таблицата, получавате ли менюто с инструменти за обобщена таблица в лентата? можете ли да щракнете с десния бутон върху таблицата и да стигнете до менюто с опции за обобщена таблица? Дори когато опитам Data-›From Text и използвам CSV файл, той пак създава QueryTable (а не обобщена таблица), до която мога да стигна. Можете ли да публикувате как създавате таблицата, моля? - person Joseph; 27.08.2012
comment
Използвах съветника за обобщена таблица (alt + d + p), за да създам таблиците. Всъщност разбрах как да редактирам низовете за връзки, но сега получавам нов проблем (вижте редакцията във въпроса ми по-горе). Предложенията ще бъдат оценени! - person scaevity; 27.08.2012

Намерих това и има много свойства, следвани за същото..

    With ActiveSheet.QueryTables.Add(Connection:= _
    "TEXT;\\Path\To\CSV\Folder\CSV_Data.csv" _
    , Destination:=Range("$A$1"))
    .CommandType = 0
    .Name = "Book1"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 437
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = True
    .TextFileSemicolonDelimiter = True
    .TextFileCommaDelimiter = False
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(1, 1, 1)
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
    End With
    End Sub
person Kamal Bharakhda    schedule 27.03.2018