4

私は次の問題の解決策を探していましたが、本当に役立つものは見つかりませんでした。いくつかのcsvへのデータ接続を含むExcelシートがあります。悲しいことに、Excelは接続を絶対パスとして保存します。パスを相対パスとして設定できるのが理想的ですが、最初に使用する前に、ユーザーが接続を更新できるようにするマクロを選択しthisworkbook.pathます。

プロジェクトはフォルダd:\ projectにあり、Excelシートはd:\ project \ excelにあり、csvはd:\ project\resultsにあります。プロジェクトをzipとして一部のユーザーに送信し、彼がc:\ mydocuments \ projectに解凍した場合、彼は10程度のcsvを再接続する必要があります。

私の一般的な考え方は、次の行に沿ってマクロを作成することです(vbaを初めて使用するため、実際のコードはありません。コードを知っていれば、質問する必要はありません)。

filepath = thisworkbook.path
cons = thisworkbook.connections
for each cons
   filename = cons.filename
   newpath = filepath & filename
end for
4

3 に答える 3

2

私はこれが古い質問であることを知っていますが、私は今同じことを探していて、ついにこれを理解しました。たぶん他の誰かが同じことを言ったかもしれませんが、私はグーグルを検索してそれを見つけられませんでした...

あなたがすでにこれらの条件を持っているとしましょう:

  1. ブックにデータ接続が既に設定されています(接続マネージャーで名前がMyDataであるとします)
  2. データ接続の宛先はすでに定義されており、Sheet1のある場所にあります
  3. 接続したいファイル名のセル(Sheet2のA1と言います)があります
  4. ブックのパスに従うように、接続が探しているパスを変更する必要があります

この場合、このようなものでうまくいくはずです。

Dim fileLoc As String
Dim fileName As String

fileLoc = ThisWorkbook.Path
fileName = Sheet2.Range("A1").Value

Dim conString As String
conString = "TEXT;" & fileLoc & "\" & fileName

Sheet1.QueryTables.Item("MyData").Connection = conString

必要に応じて、自由に変更またはtweekしてください。

于 2015-11-04T12:55:56.800 に答える
1

このように接続パスにアクセスできます

Sub UpdateConnections()
    Dim con As WorkbookConnection
    Dim ConString As String
    For Each con In ThisWorkbook.Connections
        ConString = con.Ranges.Item(1).QueryTable.Connection
        ' Path update code here
    Next
End Sub

テキストデータソースの場合、次のような文字列を返します"TEXT;C:\My\Path\Documents\FileName.csv"

これをテストしているときに、パスを変更すると他のいくつかのプロパティにも影響することがわかったため、パスを変更した後に一連のプロパティをリセットする必要があります。

于 2012-08-24T20:57:40.857 に答える
1

助けてくれてありがとう、以下は私が最終的に思いついたものです:

Sub UpdateAllConnections()

    For Each cn In ThisWorkbook.Connections
        cn.Delete
    Next cn

    Dim arrConNames(1) As String
    Dim arrSheetNames(1) As String
    arrConNames(0) = "test1.csv"
    arrConNames(1) = "test2.csv"
    arrSheetNames(0) = "test1"
    arrSheetNames(1) = "test2"

    Dim indCon As Integer

    For indCon = LBound(arrSheetNames) To UBound(arrSheetNames)
        UpdateConnections arrConNames(indCon), arrSheetNames(indCon)
    Next
End Sub

Sub UpdateConnections(ConName As String, SheetName As String)
    FilePath = ThisWorkbook.Path
    ResultPath = Replace(FilePath, "Excel-Shell", "Results")
    ThisWorkbook.Worksheets(SheetName).Select
    ActiveSheet.Cells.Clear
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;" & ResultPath & "\" & ConName, Destination:=Range( _
        "$A$1"))
        .Name = ConName
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 850
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = True
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
End Sub
于 2012-08-27T12:07:51.017 に答える