我有這樣的excel資料,一列:
10/15/2021 7:59:42 AM
10/15/2021 7:59:44 AM
10/15/2021 7:59:46 AM
.
.
.
10/16/2021 7:59:42 AM
10/16/2021 7:59:48 AM
10/16/2021 7:59:49 AM
我在 VBA 中使用此代碼創建了兩列,一列包含日期,另一列包含時間:
Sub CommandButton1_Click()
Dim rng As Range
Set rng = [A1]
Set rng = Range(rng, Cells(Rows.Count, rng.Column).End(xlUp))
rng.Texttocolumns Destination:=[B1], DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo:=Array(Array(1, xlMDYFormat), Array(2, xlMDYFormat), Array(3, xlGeneralFormat)), _
TrailingMinusNumbers:=True
Columns("C").Delete
Columns("E").Delete
Columns("D").Delete
End Sub
在那之后,我有兩列。我的目標是有一個帶有日期和時間的列,但只有第一次出現時才有日期。我使用 IF 和后來的 CONCAT 用 excel 完成了這項作業。我復制了第一行,第二行使用了:
IF(B3=B2,"",B3)
結果是空單元格,然后我將 CONCAT 與包含時間的行一起使用。我很想在 VBA 中做到這一點,但我不確定如何。
uj5u.com熱心網友回復:
請嘗試下一個方法。它將處理初始列,而不按列拆分。它假定保留日期的列是“A:A”。對于更大的范圍,使用陣列并在記憶體中作業,它應該非常快。它將在“B:B”列中回傳處理過的陣列,從第二行開始(在第一行中我假設標題應該是):
Sub keepFirstDateOnly_Date()
Dim sh As Worksheet, lastR As Long, arrD, arrFin
Dim firstD As String, i As Long, j As Long
Set sh = ActiveSheet
lastR = sh.Range("A" & sh.rows.count).End(xlUp).row
arrD = sh.Range("A2:A" & lastR).Value2
ReDim arrFin(1 To UBound(arrD), 1 To 1)
For i = 1 To UBound(arrD)
arrFin(i, 1) = Format(arrD(i, 1), "mm/dd/yyyy hh:mm:ss AM/PM")
Do While DateSerial(Year(arrD(i j, 1)), month(arrD(i j, 1)), Day(arrD(i j, 1))) = _
DateSerial(Year(arrD(i, 1)), month(arrD(i, 1)), Day(arrD(i, 1)))
j = j 1: If i j >= UBound(arrD) Then Exit Do
arrFin(i j, 1) = Format(TimeValue(CDate(arrD(i j, 1))), "hh:mm:ss AM/PM")
Loop
i = i j - 1: j = 0
Next i
sh.Range("B2").Resize(UBound(arrFin), 1).value = arrFin
End Sub
正如您所說,它僅在要處理的范圍被格式化為 As Date時才有效。
請測驗它并發送一些反饋。
如果您喜歡 B:B 中的結果,同樣建議將“B2”更改為“A2”,以使其覆寫 A:A 現有內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/366820.html
上一篇:從收到的郵件中更改約會/邀請主題
