Excel 2010年至2016年的VBA:将文本复制/粘贴为不受限文本,即使它包含分隔符

Excel 2010年至2016年的VBA:将文本复制/粘贴为不受限文本,即使它包含分隔符,excel,vba,Excel,Vba,我已经将一个启用宏的文档从XLSM转换为XLSB,因为它是在Excel 2010中创建的,但用户现在已移动到Excel 2016 我从记事本中复制包含分隔字符的信息时遇到问题,例如文本;1.2.3并将其粘贴到Excel中:它将自身分隔为多个列,但我需要它保持未分隔的格式 这有什么办法吗?到目前为止,我发现唯一的方法是先将它复制到另一张Excel表格中,但这并不实用 Selection.TextToColumns Destination:=Range("C2"), DataType:=xlDeli

我已经将一个启用宏的文档从XLSM转换为XLSB,因为它是在Excel 2010中创建的,但用户现在已移动到Excel 2016

我从记事本中复制包含分隔字符的信息时遇到问题,例如文本;1.2.3并将其粘贴到Excel中:它将自身分隔为多个列,但我需要它保持未分隔的格式

这有什么办法吗?到目前为止,我发现唯一的方法是先将它复制到另一张Excel表格中,但这并不实用

Selection.TextToColumns Destination:=Range("C2"), 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)), TrailingMinusNumbers _
    :=True

Columns("C:AD").Select
Columns("C:AD").EntireColumn.AutoFit
Columns("G:G").Select
Selection.Delete Shift:=xlToLeft
Columns("E:E").Select
Columns("E:E").Cut Destination:=Columns("H:H")
Columns("E:E").Select
Selection.Delete Shift:=xlToLeft
Columns("J:J").Select
Range("J:J,L:Y,AA:AB").Select
Range("AA1").Activate
Selection.Delete Shift:=xlToLeft
ActiveWindow.ScrollColumn = 1
Range("A1").Select 

您可以在“文本到”列中伪造一个选项以清除其选项

Sub ClearTextToColumns()
    If IsEmpty(Range("A1")) Then Range("A1") = "XXXX"
    Range("A1").TextToColumns Destination:=Range("A1"), _
        DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, _
        ConsecutiveDelimiter:=False, _
        Tab:=False, _
        Semicolon:=False, _
        Comma:=False, _
        Space:=False, _
        Other:=False, _
        OtherChar:=""
    If Range("A1") = "XXXX" Then Range("A1") = ""
End Sub
请注意,单元格A1的内容不会被修改,因为没有为TextToColumns方法指定任何操作


请注意,代码的第二部分可以简化为

Columns("C:AD").EntireColumn.AutoFit
Columns("G:G").Delete Shift:=xlToLeft
Columns("E:E").Cut Destination:=Columns("H:H")
Columns("E:E").Delete Shift:=xlToLeft
Range("J:J,L:Y,AA:AB").Delete Shift:=xlToLeft
使用
.Select
是一种不好的做法,不需要执行这些操作。如果您避免这样做,您的代码会变得更稳定、更快,并防止许多问题。

另请参见:。

不清楚为什么从Excel 2010移动到Excel 2016需要将格式从xlsm更改为xlsb,但除此之外,是的,Excel的一个恼人功能是,它会记住在工作表上完成的文本到列的操作,并会继续在该工作表上自动执行该操作。虽然这种行为已经很老了,但是你可以。当你手动使用文本到列时,你可以使用粘贴设置,包括复制粘贴。尝试在关闭所有分隔符的情况下对列运行虚拟文本,然后重试again@SolarMike我将编辑我的问题以包含代码,我相信删除数组可以解决此问题,但问题取决于用户如何将信息粘贴到excel工作表中。第一次它将粘贴在我需要它的方式,例如文本;1.2.3和其他时间,它将粘贴到多个列中,但它似乎是在我第一次运行宏之后发生的。因此,工作表似乎保存了通过数组创建的格式。@Paula问题不是来自您的宏。这是因为Excel会记住最后一个文本到列选项此外,我建议阅读并遵循:@chrisneilsen我已经尝试过了,但这并不能阻止信息的传播splitting@PEH这似乎已经做到了,我已经将其构建到clear down函数中,并进行了多次测试,所有信息似乎都正确,谢谢you@Paula看我的编辑,以改进您的代码。请注意,宏录制器使用了大量的
。请选择
,但应尽可能将其删除。@PEH谢谢,这似乎确实加快了速度。我将尝试删除。如果可能,请选择