2017-05-04 82 views
2

我在Excel中有一個名爲StartDates的命名範圍。指定的範圍只包含日期。下面的代碼示例如下:命名範圍的數據類型

Sub test2() 
Dim dat_readdates() As Date 

dat_readdates = Range("StartDates").Value 

End Sub 

這總是導致公告運行時錯誤'13':類型不匹配。

一個簡單的改變,它工作正常。

Sub test2() 
Dim var_readdates() As Variant 

var_readdates = Range("StartDates").Value 

End Sub 

是否有一個已知的規則,數據必須作爲變體數據類型讀入?顯然,爲了提高速度,我希望使用最適合讀取數據的數據類型。 我是否需要將它作爲變體讀取,然後使用cDate轉換爲日期類型的另一個變量?我可以做一個質量轉換如:

dat_readdates = cDate(var_readdates) 
+0

如果你檢查'Typename(var_readdates(1,1))'',你會得到什麼?如果你的範圍有日期,那麼它應該已經是'日期'了...... –

+0

@TimWilliams,那麼它應該是'Variant/Date',而不是原生VBA'Date'。 OP想與本地變量:) –

回答

2

不幸的是,不。從Excel中取值爲Variant s。時,取單細胞,則可以直接將其轉換爲適當的類型,即

Dim x as Long 
x = myCell.Value 

在上面的代碼中,第一個myCell.Value被取出作爲Variant,然後通過VBA轉換爲長(執行分配)如果轉換是可能的,否則運行時錯誤。

對於多單元格範圍,它更棘手。 range.value返回變體陣列。不幸的是,VBA不提供將Variant數組自動轉換爲類型數組。因此,下列不會工作:

Dim x() as Long 
x = myRange.Value 

VBA不允許像使用簡單變量一樣轉換數組;即使程序員確信陣列中的所有變體都是所需類型(即上述示例中的Long))。

強調,忘記excel;下面不會在VBA中工作:

Dim varArray() ' a variant array 
varArray = Array(1, 2, 3, 4, 5) 
Dim longArray() as Long 
longArray = varArray ' <-- type mismatch. No conversion from variant array to typed array. 
+2

謝謝A.S.H.通過元素循環遍歷變體元素並使用cDate按元素創建Date數組元素似乎是唯一的方法。我當然希望避免從Excel中讀取元素,因此它將以VBA作爲正確的類型。質量讀取和逐元素轉換感覺可能會更快。 – farmerandy

+0

@farmerandy:你是對的。將變體數組REDIM到正確的大小,然後從Range的** Value2 **屬性中分配給它。我發現這比單元處理速度快許多倍,寫入範圍時速度提高了30倍。 –

+0

@farmerandy我同意,我沒有看到另一種方式,而不是一個循環轉換爲一個類型數組。無論是否有益取決於隨後的代碼 - 肯定是的,如果大量的計算與類型變量將遵循。不要忘記在轉換完成後擺脫變量數組以節省空間。像'Redim theVariantArray(0)'。 –