【问题标题】:Changing connection string in Excel messes up column data types在 Excel 中更改连接字符串会弄乱列数据类型
【发布时间】:2012-08-27 06:23:49
【问题描述】:

这与我的previous question 有关。我正在尝试在 Excel 中更新与文本文件(由多个数据透视表使用)的外部数据连接以指向正确的数据源,以便在将 Excel 工作簿和文本文件复制到不同的目录/计算机时刷新数据. (它应该像文本文件的路径是相对的一样。)

数据源是制表符分隔的文本文件,标题位于第一列。我有可以更改 ODBC 连接字符串中的路径的代码,但是当我尝试刷新数据时,Excel 将其全部导入为文本,而不是保留某些列的原始数字。

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

我尝试将MaxScanRows 更改为零,我在某处读到它会让 Excel 扫描所有行以猜测数据类型,但这似乎没有帮助。

原来的连接信息是:

连接字符串:

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

当我使用数据透视表向导(外部数据 -> MS 文本驱动程序)创建连接时,我设置了所有导入/解析信息(制表符分隔、第一行中的列标题、猜测数据类型等)。

有什么方法可以 (1) 告诉 Excel 查看行并找出数据类型,(2) 手动编码每列的数据类型,(3) 保持最初使用的相同数据类型,或(4)刷新数据后通过宏中的数据透视表并将所有数字转换为数值而不是文本?显然 (1) 或 (3) 似乎是最简单且最有意义的,但我愿意尝试其他选项。

【问题讨论】:

  • 您的数据是否混合?您只能通过篡改注册表将 MaxScanRows 设置为零。然后您需要设置 IMEX=1。您也许可以使用 schema.ini,它适用于通常的记录集,但我没有使用数据透视表进行测试。
  • @Remou 我的一些列是文本,而其他列是数字。我需要能够将整个项目复制到另一台计算机上并且仍然可以正常工作,因此篡改注册表似乎不太实用。您将如何使用 schema.ini 来(可能)做到这一点?有没有办法在 VBA 中做到这一点?
  • 您可以将文本复制到excel中的各种表格中,而不是复制到文本文件中,并参考VBA中的excel表格。 schema.ini 也是 VBA。混合数据是指同一列中的不同数据,而不是不同列中的数据。
  • 你会在这里找到一个 schema.ini 的例子stackoverflow.com/a/12109123/2548 更多:msdn.microsoft.com/en-us/library/windows/desktop/…
  • 谢谢。我无法先将其复制到 Excel 中,因为行数太多无法放入 Excel。我会尝试使用 schema.ini 并回复您!

标签: excel vba odbc type-conversion


【解决方案1】:

鉴于您的要求,使用 schema.ini 似乎是最好的选择。

例如:

[mycsv.csv]
Format=Delimited(|)
NumberDigits=2
CurrencyThousandSymbol=,
CurrencyDecimalSymbol=.
CurrencyDigits=2
DateTimeFormat="yyyy-mm-dd"

Col1=ADate Date
Col2=AText Text

Schema.ini File (Text File Driver)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多