在Excel中,我正在尝试使用宏来移动带有“ - ”的数字。
我有一个列E
,其中包含数字列表
54525841-1
454152
1365466
1254566-1
1452577-1
我想要一个宏将所有带有破折号或连字符的数字移到C列。
因此,我需要将E1
54525841-1移至C1
。
答案 0 :(得分:2)
您需要将“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
答案 1 :(得分:1)
它必须是一个宏吗?高级过滤器怎么样?
您的号码在E栏中。我们假设他们有一个标题。
E1: Number
E2: 54525841-1
E3: 454152
E4: 1365466
E5: 1254566-1
E6: 1452577-1
在工作表的另一个区域(比如G列)中列出了以下条件:
G1: Number
G2: *-*
您的高级过滤条件如下所示:
其中带有“ - ”的任何内容都将被复制到C列。
答案 2 :(得分:1)
我得到了它的工作:
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
答案 3 :(得分:0)
您可以在没有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(就像每个循环一样)。这将使功能快速(特别是如果你有几万行)并且效率更高。首先,我找到E中使用的最后一个单元格,然后在一次移动中将整行转储到变量数组中。然后我循环遍历每个元素,检查它是否包含“ - ”,如果是,我将它添加到字典对象。 POINT :将条目添加为ITEM,而不是KEY。这可以确保我们允许重复。变量I对于每个条目都是唯一的,因此我将其用作键。然后我简单地用“ - ”将整个单元格数组转储到C列中。
为何选择词典? 字典对象非常快,并带有2个非常棒的函数:.Keys和.Items。这些将返回字典中所有键或项的数组,您可以使用Transpose函数将整列值转储到Excel中。超级高效。