VBA中的Excel TextToColumns方法忽略公式

首先,请允许我说,我希望在原来的同一篇文章中提出这样的礼节。 这一切都是一样的,但我不确定这是否正确。 所以,如果我不对,请纠正我,以便我可以解决它。

我创build了一个macros来执行TextToColumns。 我编辑和清理macros。 直到我开始使用公式将数据传播到这些字段中,而不是手动将数据复制到这些字段中,这正是我以前所做的工作。

现在,我已经扩展了我的工作表模块代码,并意识到我几个月前写的方法干扰现在将值复制到我原来执行TextToColumns的字段中的公式。

总之,有没有办法告诉.TextToColumns采取它的工作范围的 ,并忽略公式?

Sheet4.Range(categorySrcColumn & srcCategoryColLastRow) .TextToColumns _ Destination:=Range(categoryDestColumn), _ Other:=True, _ OtherChar:="/", _ FieldInfo:=Array(1,1), _ TrailingMinusNumbers:=true 

我检查了TextToColumnssearchxlValues的文档,但找不到像这样的东西。

———-附录———–

雷切尔。 我感谢你的意见。 也许你可以帮助一点点。 我已经插入你的build议,但它只是无所事事。 我已经在这里采取了一些libterties希望结合你给我所需要的东西。 免责声明:我绝不是VBA开发人员。 我知道的是我从谷歌学到的东西。 我住在Unix / Linux世界,所以这是一个非常不同的鸟,我习惯于。

这是我到目前为止…

 Public Function sbTextToColumn(srcRange As String, dstRange As String) Dim vData As Variant vData = Split(ActiveSheet.Range(srcRange).Value, "/") ' I need to massage the data in the srcRange a bit before I can separate it out. ' This is a partial sanity check on the data as well. Range(srcRange).Replace What:="I/R", Replacement:="IR", Lookat:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False _ ReplaceFormat:=False Range(srcRange).Replace What:="N/A", Replacement:="NA", Lookat:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False _ ReplaceFormat:=False Range(srcRange).Replace What:=" ", Replacement:="", Lookat:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False _ ReplaceFormat:=False ActiveSheet.Range(dstRange).Resize(ColumnSize:=UBound(vData) + 1) = vData sbTextToColumn = "" End Function 

不幸的是,我无法发布一个电子表格的例子。 这是一个封闭的,安全的networking。

现在,当我通过: =sbTextToColumn(C836, E836)插入工作表时,没有任何反应。

这是我第一次尝试创build和使用UDF。 以下是我如何调用函数。 我有一个工作表,前三列AC从另一个电子表格抓取数据。 这些列当然是公式。 D列没有被使用,但是我在这里给UDF打电话,希望这能起作用。 列EI被保留用于T2C数据,列J被用于提取与列B相同的数据(是的,冗余的,我知道)。 我的目标是,我想摆脱列J(它用于在另一个工作表中的查找,我可能无法删除它,但我想)。 理想情况下,我想从其他电子表格中抽取源数据,进行完整性检查,将其分开,然后将sorting后的数据放在必要的n列中。

那么,我在正确的轨道上? 我仍在为此工作。 如果我取得进展,我会公布进度。 TIA!

函数(包括UDF)只能向调用者返回一个值。 他们不能修改其他单元格。

这里是雷切尔的方法包装为UDF:

 Function sbTextToColumn(rng As Range) As Variant Dim vData As Variant vData = Split(rng.Value2, "/") ReDim Preserve vData(0 To Application.Caller.Columns.Count - 1) sbTextToColumn = vData End Function 

你把它作为一个数组函数input。 在你的例子中,说row 2

  • select范围E2:I1
  • Type =sbTextToColumn(C2)
  • 按下Ctrl + Shift + Enter
  • 根据需要向下复制5个单元格区域

不能修改其他单元格的函数意味着你不能在UDF中进行消毒。

从你想要的示例代码

  • 用IRreplaceI / R,用NAreplaceN / A
  • 删除空格
  • 在数据分成列E:I (因此I / R已经被分成两个单元)
  • 用清理的数据replace原始的C列公式作为

这是正确的吗?

如果是这样的话,最好不要使用UDF,而是使用Sub (从快捷键调用,或者添加到菜单中)

像这样的东西:

 Sub sbTextToColumn() Dim ws As Worksheet Dim srcRng As Range Dim rw As Range Dim vData As Variant Dim srcData As Variant Dim dstData As Variant Dim i As Long, j As Long Dim maxCol As Long Set ws = ActiveSheet Set srcRng = Range(ws.Columns(3).Cells(1, 1), _ ws.Columns(3).Cells(ws.Columns(3).Rows.Count).End(xlUp)) srcData = srcRng ReDim dstData(LBound(srcData, 1) To UBound(srcData, 1), 1 To 5) For i = LBound(srcData, 1) To UBound(srcData, 1) If srcData(i, 1) <> "" Then ' Split data vData = Split(srcData(i, 1), "/") maxCol = UBound(vData, 1) If maxCol > 5 Then maxCol = 5 For j = 1 To maxCol + 1 dstData(i, j) = vData(j - 1) Next ' Sanitise data srcData(i, 1) = Replace(srcData(i, 1), "I/R", "IR", Compare:=vbTextCompare) srcData(i, 1) = Replace(srcData(i, 1), "N/A", "NA", Compare:=vbTextCompare) srcData(i, 1) = Replace(srcData(i, 1), " ", "", Compare:=vbTextCompare) End If Next ' Put results back in sheet srcRng = srcData srcRng.Offset(0, 2).Resize(, 5) = dstData End Sub 

如果您真的想在拆分之前进行清理,只需交换拆分数据和清理数据代码块的顺序即可。

这种方法可能适用于您,因为它利用了Value属性并且不受公式的影响。 它使用Splitfunction将数据拆分成一维数组。 然后将该数组粘贴到右侧的单元格中:

 Sub sbTextToColumn() Dim vData As Variant vData = Split(Sheet4.Range("A1").Value, "/") Sheet4.Range("B1").Resize(ColumnSize:=UBound(vData) + 1) = vData End Sub