【发布时间】:2016-03-08 00:24:58
【问题描述】:
我在使用 Excel VBA 和 Text-to_Columns 时遇到问题。
我有 30 多个文本文件,其中一些包含 DD/MM/YYYY 格式的日期。我正在使用 VBA 宏来导入它们,删除不需要的数据,然后将文件重新组合成 CSV 格式。最小的文件包含大约 600 行和 20 列,最大的包含 1,000,000 行和 93 列(800mb+ 文件)。
当我使用 VBA 文本将它们提取到列代码时,日期的格式从 DD/MM/YYYY 变为 MM/DD/YYYY。 (例如,2015 年 5 月 11 日 - 2015 年 11 月 5 日变为 2015 年 11 月 5 日,2015 年 5 月 11 日)。日期通常不在同一列中,并且每个文件中的名称都不会相同。
这是使用的 VBA 代码:
Sub Stripper()
' Go through each spreadsheet, and extract from Text-to-column
' System allows for 150 columns
' Text-to-column can handle commas, semicolons, and pipe delimitations
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.DisplayStatusBar = False
Dim y As Variant
Dim lastColumn As Integer
Dim k As Integer
Dim MT As Integer
Dim Cd As Integer
k = Sheets.Count
y = 1
MT = 0
Cd = 0
While y <= k
t = Sheets(y).Name
If t = "Launch" Then
ElseIf Left(t, 4) = "MFGI" Or IsNumeric(Left(t, 1)) = True Then
Worksheets(t).Activate
Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=True, Comma:=False, Space:=False, Other:=True, OtherChar _
:="|", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), _
Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), _
Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array(20, 1), _
Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), Array(27, 1), Array(28, 1), Array(29, 1), Array(30, 1), _
Array(31, 1), Array(32, 1), Array(33, 1), Array(34, 1), Array(35, 1), Array(36, 1), Array(37, 1), Array(38, 1), Array(39, 1), Array(40, 1), _
Array(41, 1), Array(42, 1), Array(43, 1), Array(44, 1), Array(45, 1), Array(46, 1), Array(47, 1), Array(48, 1), Array(49, 1), Array(50, 1), _
Array(51, 1), Array(52, 1), Array(53, 1), Array(54, 1), Array(55, 1), Array(56, 1), Array(57, 1), Array(58, 1), Array(59, 1), Array(60, 1), _
Array(61, 1), Array(62, 1), Array(63, 1), Array(64, 1), Array(65, 1), Array(66, 1), Array(67, 1), Array(68, 1), Array(69, 1), Array(70, 1), _
Array(71, 1), Array(72, 1), Array(73, 1), Array(74, 1), Array(75, 1), Array(76, 1), Array(77, 1), Array(78, 1), Array(79, 1), Array(80, 1), _
Array(81, 1), Array(82, 1), Array(83, 1), Array(84, 1), Array(85, 1), Array(86, 1), Array(87, 1), Array(88, 1), Array(89, 1), Array(90, 1), _
Array(91, 1), Array(92, 1), Array(93, 1), Array(94, 1), Array(95, 1), Array(96, 1), Array(97, 1), Array(98, 1), Array(99, 1), Array(100, 1), _
Array(101, 1), Array(102, 1), Array(103, 1), Array(104, 1), Array(105, 1), Array(106, 1), Array(107, 1), Array(108, 1), Array(109, 1), Array(110, 1), _
Array(111, 1), Array(112, 1), Array(113, 1), Array(114, 1), Array(115, 1), Array(116, 1), Array(117, 1), Array(118, 1), Array(119, 1), Array(120, 1), _
Array(121, 1), Array(122, 1), Array(123, 1), Array(124, 1), Array(125, 1), Array(126, 1), Array(127, 1), Array(128, 1), Array(129, 1), Array(130, 1), _
Array(131, 1), Array(132, 1), Array(133, 1), Array(134, 1), Array(135, 1), Array(136, 1), Array(137, 1), Array(138, 1), Array(139, 1), Array(140, 1), _
Array(141, 1), Array(142, 1), Array(143, 1), Array(144, 1), Array(145, 1), Array(146, 1), Array(147, 1), Array(148, 1), Array(149, 1), Array(150, 1)), _
TrailingMinusNumbers:=True
s = 1
lastColumn = Cells(1, Columns.Count).End(xlToLeft).Column
While s <= lastColumn
Cells(1, s).EntireColumn.Select
If Cells(1, s) = "Original Data Source" Or Cells(1, s) = "Original Data Source Table/Field" Then
Selection.Delete
lastColumn = Cells(1, Columns.Count).End(xlToLeft).Column
Else
s = s + 1
End If
Wend
Range(Cells(1, s), Cells(1, s + 30)).EntireColumn.Select
Selection.Delete
MT = MT + 1
End If
y = y + 1
Wend
Worksheets("Launch").Activate
Range("D28") = y - 2
Range("F28") = MT
Range("D31") = Cd
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.DisplayStatusBar = True
End Sub
有什么方法可以阻止 VBA 更改日期,因为它会丢弃文件上的所有对帐信息?
【问题讨论】:
-
我在日期方面遇到了同样的问题,如果我没记错的话,我可以用 CDate() 围绕这些值进行修复,但我不确定如何将其应用于您的代码, 如果日期不在同一列中。
-
问题是要在
TextToColumns中修复它,您需要提供正确的日期格式作为FieldInfo参数内相关数组中的第二个值。如果您不知道那是哪一列,那将是棘手的。既然您知道它会尽可能将它们转换为美国格式,那么您必须在之后搜索日期值并反转月/日,并找到日期字符串并使用 @Alex4336 所说的CDate进行转换。 -
听起来好像您已经将这大约 30 个 TXT/CSV 文件整理到一个工作簿中,每个工作表都包含其中一个文件。没有一个文件被分割;而是位于 A 列中,标题位于 A1 中。您需要一些解释性过程来遍历工作表并确定每个目标列(有时超过 100 个字段)的 XlColumnDataType。听起来对吗?
-
@Jeeped 听起来不错。如何将 XlColumnDataType 与我已有的一起使用?
-
我挖出了一个我一直在研究的旧的免费赠品插件。它对前 64 行进行预处理,以识别常见问题,例如 MDY 与 DMY、大于 15 位的零件编号或必须保留的 DUNS 编号等前导零,诸如此类。这类似于 SQL 服务器执行的“前瞻”或标识 Access 的导入字段类型的 Schema.ini。它获取信息并构建一个字段类型数组,以在Workbooks.OpenText method 中使用。我可以回去,但不要期待一天左右的时间。