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

Copying to a Macro if there is a "-" in a certain cell (VBA)

如果某个单元格中有“-”或“/”,我正在尝试复制同一个 sheet 中的一些单元格。

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

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

这是重构和修复后的版本:

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。在这种情况下,我直接分配值而不是尝试复制、粘贴或 select。任何时候你看到 Range("A5").Select; Selection.Value 你真的需要 Range("A5").Value。同样,永远不要有不合格的范围。 Range("A5") 与说 ActiveSheet.Range("A5") 相同,如果错误的 sheet 处于活动状态,这会使事情复杂化。

最后,如果你真的使用变量进行一次比较,请使用直接值。没有必要只为一项任务创建变量(至少在我看来)。

编辑:

正如 Ralph 所建议的那样,请考虑阅读此主题:How to avoid using Select in Excel VBA macros。一旦你学会避免Select,你的能力就会飙升。

您似乎是在查看单元格内容的显示格式以确定它是否为日期。有一个原生 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 不是静态的情况下才可重用,但您没有提供有关确定位置的因素的指示。它可能是您数据块中的最后两列数据,但这只是一个猜测。

这就是我认为您正在寻找的(对于每个“-”或“/”,复制 Range("BA5:BB36") 并将其粘贴到 Range("BD5")Range("BG5") - 留下space 在你的专栏中):

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