如果某个单元格中有“-”,则复制到宏 (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
首先,始终避免 Select
和 Activate
。在这种情况下,我直接分配值而不是尝试复制、粘贴或 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
如果某个单元格中有“-”或“/”,我正在尝试复制同一个 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
首先,始终避免 Select
和 Activate
。在这种情况下,我直接分配值而不是尝试复制、粘贴或 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