0

Microsoft Text Driver を使用して、最初の行 (Excel ファイルと同じディレクトリ) に列名を持つタブ区切りのテキスト ファイルからデータを読み取る複数のピボット テーブルがある MS Excel のプロジェクトに取り組んでいます。テキスト ファイルと 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
4

3 に答える 3

2

わかりましたので、私はそれを機能させ、共有したいと思いました. ワークブック内の各接続を循環し、そのパスをテキスト ファイルへの新しいパスに変更しました (アクティブなワークブックのパスを取得し、テキスト ファイルのディレクトリの名前を追加することによって作成されます)。また、毎回テキスト ファイルが正しくインポートされるようにするために、インポート情報を含む「schema.ini」ファイルを (テキスト ファイルと同じディレクトリに) 含める必要がありました。

于 2012-09-18T01:35:07.893 に答える
1

私はその方法でピボット テーブルを正確に作成することに完全に精通しているわけではありませんが、通常は QueryTable オブジェクトを見ることで Connection のようなピボット テーブルの情報を取得できます。この例をチェックしてください:

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 文字列を調べて、それを解析し、ピボットテーブルごとに置き換える方法を確認してください。

于 2012-08-25T02:52:07.847 に答える