2017-09-26 57 views
1

我有一個不幸的具體問題,我的能力谷歌/拼湊VBA代碼只能走得這麼遠。VBA搜索D列爲「PM」,然後向列B添加12小時,如果找到

我從包含顯示30分鐘間隔的列的文本文件導入報告(請參見屏幕截圖)。出於某種原因,任何時間在12PM後將在列B中顯示爲AM,但不在列D中。我試圖創建一個代碼,將在D列中搜索PM並將12小時添加到B列,以便它以PM結尾。我的嘗試不工作,我相信這是因爲範圍。

Screenshot of Data

Sub AM2PM()  
Dim rngC As Range 
Dim rngT As Range 
Set rngT = Range("B2", Cells(Rows.Count, "B").End(xlUp)) 

rngT.NumberFormat = "mm/dd/yyyy hh:mm:ss AM/PM" 

For Each rngC In rngT 
    If InStr(1, (Range("D")), "PM") > 0 Then 
     rngC.Value = DateValue(rngC.Value) + TimeValue(rngC.Value) + 0.5 
    Else 
     rngC.Value = DateValue(rngC.Value) + TimeValue(rngC.Value) 
    End If 
Next rngC 

End Sub 

任何幫助,不勝感激!

+1

它不工作,因爲'12:00 - 12:30 PM'是**不是日期類型的對象**。這是一個字符串。您需要首先從單元格中去除「12:30 PM」。 –

+0

@ScottHoltzman什麼是最好的方式去 –

回答

1

你可能想嘗試沒有循環:

Sub Minus30M() 
    With Columns("D:D") 
     .Replace What:="A", Replacement:=" A", LookAt:=xlPart 
     .Replace What:="P", Replacement:=" P", LookAt:=xlPart 
    End With 
    Range("D1").FormulaR1C1 = "=1/48" 
    Columns("D:D").Copy 
    Range("B1").Select 
    ActiveSheet.Paste 
    Application.CutCopyMode = False 
    Range("D1").Copy 
    Columns("B:B").PasteSpecial Paste:=xlPasteAll, Operation:=xlSubtract 
    Application.CutCopyMode = False 
    Selection.NumberFormat = "h:mm AM/PM" 
End Sub 
+1

這工作!非常感謝!你介意解釋你如何看待它?願意理解,所以我可以改善。 –

+0

幾乎總是在處理日期和時間Excel時可以幫助*提供*可識別的日期/時間序列(格式)。這只是意味着在數字和AM/PM之間增加一個空格。然後利用* 30分鐘的時間間隔*重新開始結束 - 1/2小時。可能是每天最後一次間隔的問題,儘管:) – pnuts

相關問題