2017-04-26 171 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 
相關問題