簡體   English   中英

在VBA中更改小數點分隔符(不僅在Excel中)

[英]Changing decimal separator in VBA (not only in Excel)

輸入A1單元格=1/10

運行此宏:

Sub ChangeDecimalSeparator()
    Application.DecimalSeparator = "#"
    Application.UseSystemSeparators = False
    MsgBox Range("A1").Value
End Sub

顯然現在在單元格A1中,您可以看到小數分隔符已更改為新字符#。 為什么在地球上VBA仍然將它視為你的默認分隔符,雖然你已經改變它(我的意思是MsgBox)。

為什么我需要它? 我的默認分隔符是,(逗號)。 我想將數據插入到使用的SQL。 (點)。

Application.DecimalSeparator影響單元格中顯示的內容,它是一個次要的,但重要的區別,單元格中顯示的內容並不總是與單元格的.Value屬性相同,特別是如果我們正在修改值的格式或顯示方式。 這在使用日期值時很明顯,例如:

在此輸入圖像描述

如您所見,無論單元格的格式如何, MsgBox函數都使用我的(美國)語言環境來格式化日期:

異常,實際上並不是例外,如果MsgBox函數傳遞了一個字符串文字:

MsgBox(Format(#6/1/2018#,"dd-mm-yyyy"))

在這里,我們沒有傳遞日期 ,而是傳遞一個字符串, MsgBox將根據Format函數顯示:

在此輸入圖像描述

當你修補DecimalSeparator或其他分隔符屬性時,這就是同樣的事情。 您沒有更改基礎值,只是Excel應用程序在UI中表示它們的方式。

您可能希望MsgBox函數使用您通過Application.DecimalSeparator分配的覆蓋,但MsgBox函數僅接受其第一個參數的String類型,因此當您傳遞除字符串以外的任何內容時,會隱式轉換為字符串類型,基本上發生的是:

MsgBox(CStr(Range("A1").Value))

仍然與區域設置無關,現在您將該值轉換為字符串。 唯一真正的邏輯輸出是使用windows / system local來處理該轉換。

TL; DR

您可以使用單元格的Text屬性來獲取單元格中實際顯示的內容,而不是單元格的真實

我無法100%確定地說話,但我相信當Application.DecimalSeparator影響單元格中顯示的內容時,似乎MsgBox使用Windows語言環境默認值。

如果您嘗試在Windows級別更改它會發生什么? 此外,您確定您的SQL插入沒有正確解釋它嗎?

如果需要,可能會嘗試使用潛在的 解決方法

Dim x as Integer
Dim xs as String
x = 1.5
xs = replace(cstr(x),".", ",")
SQLString = Stuff & xs & MoreStuff

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM