我需要连接值并用“ |”分隔但忽略空白

时间:2018-07-09 21:46:29

标签: excel macos

我首先要说我是新手,但是有人要求我做一些工作。我在Mac上使用Excel 2008。

我创建了一个大约3000行x 95列的数据集。第一列是产品说明,制造商等的串联。这些行是关键字的列表,我使用以下公式来识别并显示在3000行中的每一行中:

=IF(ISNUMBER(SEARCH(C$3,$A3)),C$2,"") . 

这给我留下了分散在整个工作表中的数据。现在,我需要将每一行的数据合并到一个单元格中,每个发现的关键字之间用|隔开,但是我需要忽略空白单元格,以便得到如下结果:

Keyword1|Keyword3|Keyword4|

而不是这样:

Keyword1||Keyword3|Keyword4|||||||||||| 

有人有什么想法吗?

谢谢

4 个答案:

答案 0 :(得分:0)

您可以这样使用&:

="keyword1"&"|"&"keyword2"&... which does not skip blank cells

或者如果关键字1在单元格A1中,关键字2在B1中,那么

= IF(OR(A1 =“”,B1 =“”),“”,A1&“ |”&B1)

如果A1或B1为空白,则结果将为空白

答案 1 :(得分:0)

几年前,当我试图从比赛中的马匹列表中创建潜在的选秀权列表时遇到了我。我从来没有发现自己喜欢的东西,但是随着时间的流逝,我使用了几种不同的方法。这是一个通用的解决方案:

=SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(SUBSTITUTE(A7&"|"&B7&"|"&...&DM7," ","~"),"|"," "))," ","|"),"~"," ")

其中以A7开始并以DM7结尾的系列将替换为具有多个“ |”的串联符号。

该公式查找现有空格,并将其替换为未使用的字符(在这种情况下,我使用“〜”),然后替换为“ |”带有“”,并使用TRIM命令消除开头和结尾的空格以及之间的多余空格。然后将剩余的空格替换为“ |”并通过用空格替换任何“〜”来放回初始空格。

很显然,如果您的关键字没有空格,但是没有说明,这会稍微简单一些。

附录......

考虑到昨晚的这一点,我认为基于3000行数据和多达95列的连接字符串可能是不可能的。这很容易达到32,767的字符串限制大小,因为即使这些单元格中的5%(只有一个字符),您也将有14,250个字符加上几乎相等的分隔符。我看不到您将如何使用我发布的技术来执行此操作。您可以逐行使用此技术,然后将其剪切并粘贴到纯文本文件中,但是我开始认为原生Excel解决方案几乎是不可能的,尤其是如果没有VBA(我们可以用来编写文本)

答案 2 :(得分:0)

虽然我先前的建议在相对较小的范围内可能会很好地工作,但是对于接近原始请求大小的数据将不起作用。 Mac上的Excel 2008可能无法处理此问题,但是如果您可以使用可以使用VBA的Excel版本,则此建议可能会对您有所帮助,因为它使用了VBA的扩展功能,并将合并的数据放入文本文件,而不是尝试将其保留在电子表格中。

我仍在尝试找出一种不使用字符串或VBA的方法。

我会提供一些分步信息,以防对您或其他人有用。

使用95行和3000列数据打开电子表格。 打开Visual Basic编辑器,然后从菜单中选择“插入/模块”。 将以下代码粘贴到编辑器窗口中:

Option Explicit

Function ConcatNonblankWithSeparator(rngRange As Range, strSeparator As String) As String
    Dim rngCell As Range
    Dim strReturn As String
    For Each rngCell In rngRange
'        MsgBox rngCell.Address
        If Len(rngCell.Value) > 0 Then
'        MsgBox "before: " & strReturn
            strReturn = strReturn & rngCell.Value & strSeparator
'        MsgBox "after: " & strReturn
        End If
    Next rngCell
'    MsgBox strReturn
'    MsgBox Len(strReturn)
'    MsgBox Len(strSeparator)
    ConcatNonblankWithSeparator = Left(strReturn, Len(strReturn) - Len(strSeparator))
End Function

Sub ConcatRange()
    Dim rngCell As Range
    Dim strSeparator As String
    Dim strFileName As String

    strFileName = Application.DefaultFilePath & "\TestDelimOutput.txt"
    Set rngCell = Sheets("Data").Range("A1:DX3000")
    strSeparator = "|"

    Open strFileName For Output As #1

    Write #1, ConcatNonblankWithSeparator(rngCell, strSeparator)

    Close #1
End Sub

第一行可以保护您(或更可能是我)在使用变量之前不定义变量。

该函数创建一个相当通用的串联例程,该例程采用一个范围和一个字符串,并创建一个返回的字符串,该字符串具有在该字符串串联并分隔的范围内的非空白值。如果您想查看发生了什么,可以取消注释msgbox命令(通过删除行首的')。由于该功能的大小限制,“ MsgBox strReturn”不太可能显示连接数据的全部数量,但可能会在测试期间显示。

Sub实际上可以对要处理的范围进行特定标识,并标识要使用的分隔符。它将结果写入测试文件。如果要使用其他分隔符(可能是“ |”而不是“ |”,请在此处指定。如果要使用其他工作表名称,则可以用工作表名称(用引号引起来)替换“ Data”。您具有不同的范围,则可以用范围(也用引号引起来)替换“ A1:DX3000”。如果要使用其他文件名,请在strFileName变量中指定(以及位置的路径)您要使用)。

关于VBA,我有点黑客,所以有人可能会建议您进行一些风格上或技术上的改进,但这应该可以帮助您入门。我确实以此创建了一个700,000字节的文件,因此它将处理大量数据。

我希望这可以为您指明比我之前的帖子更好的方向。

答案 3 :(得分:0)

我接下来尝试的是一些手动步骤。我尝试使用Macintosh CSV文件,但由于无法解释行尾字符而无法使用它,因此我决定允许Excel在此过程中创建MS-DOS文本文件。您的实际过程可能需要适应您的环境。我使用MS Word代替Notepad或Notepad ++,希望微软已经将其搜索/替换功能调整为适用于MAC。

使用A1..DX3000列中名为“数据”的工作表中的数据,我在A1中使用以下公式创建了第二个工作表:

=SUBSTITUTE(TRIM(SUBSTITUTE(SUBSTITUTE(Data!A1&","&Data!B1&","&Data!C1&","&Data!D1&","&Data!E1&","&Data!F1&","&Data!G1&","&Data!H1&","&Data!I1&","&Data!J1&","&Data!K1&","&Data!L1&","&Data!M1&","&Data!N1&","&Data!O1&","&Data!P1&","&Data!Q1&","&Data!R1&","&Data!S1&","&Data!T1&","&Data!U1&","&Data!V1&","&Data!W1&","&Data!X1&","&Data!Y1&","&Data!Z1&","&Data!AA1&","&Data!AB1&","&Data!AC1&","&Data!AD1&","&Data!AE1&","&Data!AF1&","&Data!AG1&","&Data!AH1&","&Data!AI1&","&Data!AJ1&","&Data!AK1&","&Data!AL1&","&Data!AM1&","&Data!AN1&","&Data!AO1&","&Data!AP1&","&Data!AQ1&","&Data!AR1&","&Data!AS1&","&Data!AT1&","&Data!AU1&","&Data!AV1&","&Data!AW1&","&Data!AX1&","&Data!AY1&","&Data!AZ1&","&Data!BA1&","&Data!BB1&","&Data!BC1&","&Data!BD1&","&Data!BE1&","&Data!BF1&","&Data!BG1&","&Data!BH1&","&Data!BI1&","&Data!BJ1&","&Data!BK1&","&Data!BL1&","&Data!BM1&","&Data!BN1&","&Data!BO1&","&Data!BP1&","&Data!BQ1&","&Data!BR1&","&Data!BS1&","&Data!BT1&","&Data!BU1&","&Data!BV1&","&Data!BW1&","&Data!BX1&","&Data!BY1&","&Data!BZ1&","&Data!CA1&","&Data!CB1&","&Data!CC1&","&Data!CD1&","&Data!CE1&","&Data!CF1&","&Data!CG1&","&Data!CH1&","&Data!CI1&","&Data!CJ1&","&Data!CK1&","&Data!CL1&","&Data!CM1&","&Data!CN1&","&Data!CO1&","&Data!CP1&","&Data!CQ1&","&Data!CR1&","&Data!CS1&","&Data!CT1&","&Data!CU1&","&Data!CV1&","&Data!CW1&","&Data!CX1&","&Data!CY1&","&Data!CZ1&","&Data!DA1&","&Data!DB1&","&Data!DC1&","&Data!DD1&","&Data!DE1&","&Data!DF1&","&Data!DG1&","&Data!DH1&","&Data!DI1&","&Data!DJ1&","&Data!DK1&","&Data!DL1&","&Data!DM1&","&Data!DN1&","&Data!DO1&","&Data!DP1&","&Data!DQ1&","&Data!DR1&","&Data!DS1&","&Data!DT1&","&Data!DU1&","&Data!DV1&","&Data!DW1&","&Data!DX1&","," ","~"),","," "))," ",",")

我一直将此复制到A3000。这给了我每一行的一组用“ |”分隔的值。显然,您需要将其调整为要处理的实际范围。通过将大小减小到一行,我没有遇到32,767的文本限制。希望你也不会。

我将其保存为MS-DOS文本文件。

我在MS Word中打开它,并使用其“查找/替换”命令将段落分隔符(^ p)替换为“ |”并将其重新保存为文本文件。生成的文件与我想要创建的文件不同,仅具有一个额外的“ |”最后。

希望这对您有用,或者您可能需要将其另存为Macintosh文本文件,以便Mac版本的MS Word能够替换每行末尾的字符。

不确定这是否可以帮助您实现所需的目标。如果您只需要一次或偶尔执行一次此操作当然可以工作,但是如果这是一项经常性的任务,则可能会有些痛苦。