用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中。 超高效。