使用短划线将数字移动到新单元格的宏

时间:2011-11-03 19:57:53

标签: excel vba

在Excel中,我正在尝试使用宏来移动带有“ - ”的数字。

我有一个列E,其中包含数字列表

54525841-1
454152
1365466
1254566-1
1452577-1

我想要一个宏将所有带有破折号或连字符的数字移到C列。 因此,我需要将E1 54525841-1移至C1

4 个答案:

答案 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: *-*

您的高级过滤条件如下所示:

advanced filter criteria

其中带有“ - ”的任何内容都将被复制到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中。超级高效。