2017-04-26 166 views
2

如果在某个单元格中存在“ - ”或“/”,我试图复制同一个表格中的某些单元格。复制到宏如果在某个单元格中有“ - ”(VBA)

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

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 
+0

什么它是做而不是工作? –

+1

你可以请更具体一点吗?当你说它不起作用时,你的意思是什么?代码是否运行有错误?如果是这样,错误代码/消息是什么,并在哪一行是代码打破?或者代码正在运行(没有错误),但仅仅是没有做你期望的事情?如果是这样的话,请与我们分享它在做什么(取而代之)以及预期的结果是/将会是什么。也许一些截图和样本数据可以在这方面提供帮助。 – Ralph

+1

诱惑下来投票为**这是我的代码,但它不工作**不帮助我们找到问题。但是,这样说 - 'InStr(1,celltxt,“ - ”)'将在字符串中返回'-'的位置,所以请使用'InStr(1,celltxt,“ - ”)> 0' –

回答

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是不是静态的,而是你提供什么确定位置没有指示。这可能是数据块中最后两列的数据,但这只是一个猜测。

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你的能力将会飞涨。

+0

你可能想在你的回答中引用这篇文章:http:// stackoverflow。com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros关于如何避免使用'Select',相当详细。然而,我怀疑这是真正的问题。我猜测OP的代码“不正确”,因为它没有做到他/她真正想要的。 – Ralph

+0

@Ralph好点。我在其他地方也使用了相同的参考,但在这里没有想到。 –

0

这做什么,我认为你正在寻找(每一个“ - ”或“/”,复制Range("BA5:BB36")并粘贴到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 
相关问题