2010-07-21 41 views

回答

11

只是對每個人都擴大else has added ...如前所述,散列標記(#)是一個類型聲明字符(TDC)並強制文字「1」爲Double類型。此數據類型轉換屬於一類稱爲「顯式轉換」的轉化。在這個類中還有Casts(例如CStr(),CLng()等)。

顯式轉換通常用於避免不正確的隱式轉換。隱式轉換是VBA自動執行的轉換。如果聲明並鍵入所有變量(例如Dim j As Long),則更易於控制數據解釋的方式。但是,還有一些邊緣案例涉及如何處理文字(「硬編碼數字」)。

我知道使用類型聲明字符與文字最常見的原因是:

  1. 強制十六進制和八進制文字爲long,以避免已知的問題。 (更多信息:http://support.microsoft.com/kb/38888
  2. 防止數學運算產生的結果大於操作中使用的最大數據類型時引起的常見溢出條件。
  3. 避免浮點計算異常。
  4. 微觀優化。由類型聲明字符引起的轉換髮生在編譯時。 Casted轉換和隱式轉換在運行時發生。在99.999%的案例中,這不會產生任何可衡量的收益,通常是浪費時間。

由於你的例子沒有做任何事情,我只能猜測它不是真正的代碼。所以它很難直視作者的意圖。 1不適用。原因2是可能的。我會描述這個問題和一個可能的解決方法。

爲了解溢出問題,您需要了解兩件事情。如何輸入文字以及隱式轉換是如何工作的。如果沒有類型聲明字符,則文字將具有默認分配的類型。以下是規則:

  1. 如果該值在引號中,即使它是數值,也是一個字符串。
  2. 如果該值是數字並且有小數,則它是Double。
  3. 如果該值爲數值,則具有十進制,並且介於-32,767和32,767(含)之間,則它是Integer類型。
  4. 如果值是數字,有沒有小數,並且是-2,147,483,647和2,147,483,647(含)但之間-32,767和32,767之間不這是Long類型。
  5. 如果該值爲數值,則具有十進制,外部的範圍是-2,147,483,647至2,147,483,647它是Double類型的。
  6. 科學計數法中的任何字面值都是雙精度。

現在您已經知道文字是如何輸入的,您需要了解隱式轉換。所有數學運算都對兩個輸入值起作用並輸出一個結果。通過分析輸入值的數據類型來選擇結果的DataType。輸出數據類型基於三個規則進行選擇: 1.如果其中任何一個輸入值是DataType Variant VBA將根據文字描述的相同規則選擇輸出DataType。 2.如果兩個輸入值都是鍵入的,那麼它將選擇兩個數據類型中較大的一個。 3.如果兩個輸入值的類型相同,則輸出DateType將與輸入DataType相同(假定該類型不是「Variant」)。

條件3出現問題。如果您有兩個整數(例如500和400),並對它們執行操作(例如500 * 400),則會產生一個大的結果(200,000)結果DateType(整數)。然後你得到一個溢出錯誤。因爲默認情況下500和400是整數,所以您必須通過類型聲明字符(例如500 & * 400)將其中的一個顯式鍵入Long或Double來避免這種情況。然後,當選擇輸出類型時,它會選擇兩個中較大的一個(Long),這將足以保存結果。

我可以肯定地說,如果原因是2,那麼沒有理由擔心(至少在給定的例子中)。任何帶有小數點的文字默認都是Double類型。由於隱式轉換總是選擇操作中的最大類型,並且Double總是存在,所以無論發生什麼溢出,都沒有機會產生溢出。

如果關注的原因是浮點問題,那麼需要一個更真實的例子才能看出您是否需要類型聲明字符。

如果原因是微型優化,那麼如果你把它留在那裏或者沒有,它真的沒關係。從技術上來說,最好使用帶Double的Double。所以離開它沒有什麼壞處。但是,沒有任何理由可以讓你自己去做。


其它

的各種類型聲明字符如下:

 
Type Declaration Character Data Type 
      %     Integer 
      &     Long 
      !     Single 
      #     Double 
      $     String 
      @     Currency 

要添加更多一點的信息: 類型聲明字符來代替在昏暗使用它們相應的型聲明(雖然這被認爲是很多不良的做法)。因此:Dim s As StringDim s$相同,在兩種情況下都將創建爲字符串。同樣,您可以使用TDC鍵入函數返回值。所以Public Function MyFunc()&Public Function MyFunc() As Long相同。


轉換函數

 
Function Return Type 
CBool  Boolean 
CByte  Byte 
CCur  Currency 
CDate  Date 
CDbl  Double 
CDec  Decimal 
CInt  Integer 
CLng  Long 
CSng  Single 
CStr  String 
CVar  Variant 
2

1#表示1是evaluated as a double

我懷疑這會對計算產生影響。如果1是未修飾的並且因此將其視爲整數,則計算仍然會給出97.45。以及當所述計算的結果被分配給整數some_integer這將是97

Sub Macro1() 
    Dim i As Integer 
    i = 97.45 * 1# 
    MsgBox (i) 'Shows 97 
End Sub 
+0

沒了,我相信你是錯的 – 2010-07-21 17:04:56

+0

在Excel 2007中,這也正是它做什麼。它顯示了97.我曾經預料過類型不匹配會將一個大變成一個小變量,但似乎只適用於函數參數(我最常見的錯誤修正是將一個整數升級爲一個長變量)。 – 2011-01-23 14:06:56

5

1#意思是「1爲雙」。當然,如果some_integer 是一個整數,那麼結果表達式的非整數部分將被截斷爲97(因此我很困惑它在這種情況下做了什麼)。

INFO: Type Declaration Character to Data Type Chart (in VBA)

+0

看起來像只mikeabyss得到這一個權利 – 2010-07-21 17:04:28

2

在VB手段甲# 「型雙」。

所以some_integer爲97

+0

看起來像只mikeabyss得到這一個權利 – 2010-07-21 17:04:00

+4

MikeAbyss是唯一正確的,如果some_integer被聲明爲非整數類型。鑑於它是VBA,它可能根本沒有聲明,因此在賦值後變成Variant/Double,但這意味着任何名爲some_integer的人都應該被解僱或者至少徹底用一袋肥皂徹底毆打。 – 2010-07-21 17:11:17

+0

我會記下這一點。你推薦什麼樣的肥皂? – 2010-07-21 17:44:45

8

some_integer將是97.45。

它被用來將1作爲一個double而不是任何其他類型。 (EG 1可以看作是一個整數,但在這種情況下,我們要正確對待1爲雙)

你可以把它看作some_integer = 97.45 * 1#爲同some_integer = 97.45 * 1.00