用macros数移动到新的单元格的macros

在Excel中,我试图让一个macros用“ – ”来移动数字。

我有一个列E的列表中的数字

 54525841-1 454152 1365466 1254566-1 1452577-1 

我想要一个macros将所有的数字在最后连接到一个破折号或连字符C列,所以我需要将E1 54525841-1移到C1

您需要将“Sheet1”更改为数据所在工作表的名称。

这将查看E列中的每个单元格(包含数据),如果它包含破折号,则将该值移到C列。

 Sub MoveDashes() Dim Sheet As Worksheet Dim Index As Long Set Sheet = ThisWorkbook.Worksheets("Sheet1") For Index = 1 To Sheet.Cells(Application.Rows.Count, "E").End(xlUp).Row If InStr(1, Sheet.Cells(Index, "E"), "-") > 0 Then Sheet.Cells(Index, "C") = Sheet.Cells(Index, "E").Value Sheet.Cells(Index, "E").Value = "" End If Next End Sub 

它是否必须是一个macros? 高级filter怎么样?

你的号码在E栏中。我们假设他们有一个标题。

 E1: Number E2: 54525841-1 E3: 454152 E4: 1365466 E5: 1254566-1 E6: 1452577-1 

在你的工作表的一个单独的区域(比方说G列)把以下标准:

 G1: Number G2: *-* 

您的高级过滤标准如下所示:

高级过滤标准

任何带有“ – ”的东西都会复制到C列。

我得到这个工作:

 Sub MoveDash() x = Range("E" & Rows.Count).End(xlUp).Row For Each Cell In Range("E2:E" & x) If InStr(Cell, "-") <> 0 Then Cell.Offset(, 1) = Cell Cell.ClearContents End If Next Cell end sub 

你可以做到这一点没有VBA,但这是一个有效的方式来使用字典对象。

 Sub MoveNumbersWithDash() Application.ScreenUpdating = False Dim i As Long, lastRow As Long Dim varray As Variant Dim dict As Object Set dict = CreateObject("scripting.dictionary") lastRow = Range("E" & Rows.Count).End(xlUp).Row varray = Range("E1:E" & lastRow).Value For i = 1 To UBound(varray, 1) If InStr(1, varray(i, 1), "-") <> 0 Then dict.Add i, varray(i, 1) End If Next Range("C1").Resize(dict.Count).Value = _ Application.WorksheetFunction.Transpose(dict.items) Application.ScreenUpdating = True End Sub 

它是如何工作的:这里的主要主题是避免调用Excel(就像每个循环一样)。 这将使function快速(尤其是如果你有成千上万的行),更高效。 首先,我findE中使用的最后一个单元格,然后将整行转储到variables数组中。 然后我遍历每个元素,检查它是否包含“ – ”,如果是,我将它添加到一个字典对象。 要点 :添加条目作为ITEM,而不是KEY。 这确保我们允许重复。 variables我将是唯一的每个条目,所以我用它作为关键。 然后,我简单地转储整个数组的单元格为“ – ”到列C.

为什么字典? 字典对象非常快,并且带有两个非常棒的function:.Keys和.Items。 这些将返回字典中所有键或项目的数组,您可以使用Transpose函数将整个值列转储到Excel中。 超高效。