您可能必須自己從一個字符串轉換時間。 Mid function正在返回一個字符串;將其轉換爲TimeValue。 TimeValue不接受時區縮寫,因此必須將其刪除。
dim sTZ as string
With Range("J8")
.Value = "='" & FilePath & "[Report.xlsm]Data'!J8" '// J8 = 02/12/2016 08:17 AM CST
sTZ = Mid(.Value, 21, 3)
.Value = TimeValue(Mid(.Value, 12, 8)) '// J8 = 08:17 AM (No time zone)
.Value = .Value + TimeSerial(1, 0, 0) ' <-- Time is added to time; no mismatch
'optionally put the time zone back in
'.value = .value & chr(32) & sTZ
'optionally keep the time as time and format the time zone back in
'.numberformat = "hh:mm AM/PM C\ST"
End With
如果保持與UTC的關係時間是關鍵任務,那麼您將不得不連接後端的時區信息。這將轉換表示時間帶的時間字符串中的時間值。如果您只是更改了Range.NumberFormat property,則可以避免轉換爲字符串。
將大量時區硬編碼爲自定義數字格式可能不切合實際。以下內容將從原始文本看起來像一次一樣地構建具有適當時區的自定義數字格式。
Dim sTZ As String, sTZmask As String
With Range("J8")
.Value = "='" & FilePath & "[Report.xlsm]Data'!J8" '// J8 = 02/12/2016 08:17 AM CST
sTZ = Mid(.Value, 21, 3)
'split the time zone and stitch it back together with the number format escape character
sTZmask = Join(Split(StrConv(Chr(32) & sTZ, vbUnicode), vbNullChar), Chr(92))
'remove any trailing escape characters
Do While Right(sTZmask, 1) = Chr(92): sTZmask = Left(sTZmask, Len(sTZmask) - 1): Loop
.Value = TimeValue(Mid(.Value, 12, 8)) '// J8 = 08:17 AM (No time zone)
.Value = .Value + TimeSerial(1, 0, 0) ' <-- Time is added to time; no mismatch
'keep the time as time and format the time zone back in
.NumberFormat = "hh:mm AM/PM" & sTZmask
End With
也許你可以聲明一個變量來保存時間和分配給變量(因而脅迫的數據,當您去),你把它分配給範圍之前。 –
@JohnColeman不起作用 - 我可能做錯了什麼,你能舉一些例子嗎? – 0m3r
這只是一個想法。這是不是100%清楚你想要做什麼。從公式到值到修改值似乎都是圍繞着 - 爲什麼不直接從其他工作簿中讀取值直接寫入變量變量,然後找出如何修改它,也許使用'Debug.Print typenam(var )'看看VBA如何解釋這個價值。然後在你想修改這個值之後 - 把它放到單元格中。 –