如果某个单元格中存在“ - ”(VBA),则复制到宏

时间:2017-04-26 14:52:37

标签: excel vba excel-vba cells copying

如果在某个单元格中有“ - ”或“/”,我试图在同一张纸上复制一些单元格。

根据“ - ”或“/”的数量是它要复制的次数。 这是我的代码但不起作用,任何人都可以帮忙吗?

Sub TWB_Copy_columns()
'TWB_Copy_columns Macro

Dim celltxt As String
Range("B14").Select
Selection.End(xlToRight).Select
celltxt = Selection.Text
If InStr(1, celltxt, "-") Or InStr(1, celltxt, "/") Then
    Range("BA5:BB36").Select
    Selection.Copy
    Range("BD5").Select
    ActiveSheet.Paste
    Range("BG5").Select
End If

End Sub

3 个答案:

答案 0 :(得分:0)

这是重构和修复版本:

Sub TWB_Copy_columns()
    'TWB_Copy_columns Macro

    'Range("B14").Select
    'Selection.End(xlToRight).Select
    'celltxt = Selection.Text

    ' Use explicit references and avoid select. In this case, you will need to
    ' qualify the workbook and sheetname of the range you are using. We can then
    ' directly access the value of that range.

    ' Also, no need to declare a string just to hold onto the value. Directly use the value instead
    With ThisWorkbook.Sheets("Sheetname")
        If InStr(1, .Range("B14").End(xlToRight).value, "-") > 0 Or InStr(1, .Range("B14").End(xlToRight).value, "/") > 0 Then
            .Range("BD5:BB36").value = .Range("BA5:BB36").value
        End If
    End With
End Sub

首先,始终避免SelectActivate。在这种情况下,我直接分配值而不是尝试复制,粘贴或选择。每当您看到Range("A5").Select; Selection.Value时,您确实需要Range("A5").Value。同样,永远不会有不合格的范围。 Range("A5")与说ActiveSheet.Range("A5")相同,如果错误的工作表处于活动状态,可能会使事情变得复杂。

最后,如果您实际上使用变量进行一次比较,请使用直接值。没有必要为一个任务创建变量(至少在我看来)。

编辑:

正如拉尔夫建议的那样,请考虑阅读这个帖子:How to avoid using Select in Excel VBA macros。一旦你学会避免Select你的能力就会飙升。

答案 1 :(得分:0)

您似乎正在查看单元格内容的显示格式,以确定它是否为日期。有一个原生的VBA函数IsDate可以在真实日期很好地做出这个决定。如果你的数据没有包含日期​​作为真实日期,那么它们应该是真实日期,这是另一个需要解决的问题。

with worksheets("sheet1")
    if isdate(.cells(14, "B").end(xltoright)) then
        .range("BA5:BB36").copy destination:=.range("BD5")
    end if
end with

在我看来,如果BA5:BB36不是静态的,那么此代码只能重复使用,但您没有提供确定位置的指示。它可能是数据块中最后两列数据,但这只是猜测。

答案 2 :(得分:0)

这就是我认为您正在寻找的内容(对于每个“ - ”或“/”,复制Range("BD5")并将其粘贴到Range("BG5")Sub TWB_Copy_columns() 'TWB_Copy_columns Macro Dim celltxt As String Dim vWords As Variant Dim rFind As Range Dim i As Long celltxt = Range("B14").Value celltxt = Replace(celltxt, "-", "/") vWords = Split(celltxt, "/") Range("BA5:BB36").Copy Range("BD5").Activate For i = 1 To UBound(vWords) ActiveCell.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False ActiveCell.Offset(0, 2).Activate Next End Sub - 留下空格你的专栏):

def median(lst):
    s = sorted(lst)
    l = len(lst)/2
    if len(lst) % 2 == 0:
        print((s[l] + s[l-1])/2.0)
    else:
        print(s[l])
median([3,3,5,6,7,8,1])