VBA中,单元格属性有NumberFormat可以获取单元格格式,比如:

  • G/通式格式→常规
  • @→文本
  • yyyy/m/d→日期

问题:

  1. G/通式格式,无法知道值是整数还是浮点数,
  2. yyyy/m/d如果换一种日期格式就对不上了。

所以cell.Value(12)就派上用场了,是XML格式的单元格更详细的信息。

<xml xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
<x:PivotCache>
<x:CacheIndex>1</x:CacheIndex>
<s:Schema id="RowsetSchema">
<s:ElementType name="row" content="eltOnly">
<s:attribute type="Col1"/>
<s:extends type="rs:rowbase"/>
</s:ElementType>
<s:AttributeType name="Col1" rs:name="字段1">
<s:datatype dt:type="dateTime"/>
</s:AttributeType>
</s:Schema>
<rs:data>
<z:row Col1="2019-04-07T00:00:00"/>
</rs:data>
</x:PivotCache>
</xml>

dateTime就是相应的数据类型所在位置,获取方法(AutoHotkey)

;返回为字符串,int|float|255|dateTime|boolean
;255表示字符串,boolean表示空单元格,其他还没遇到,待完善
valueType(cell)
{
xml := cell.Value()
oXML := ComObjCreate("MSXML2.DOMDocument.6.0")
oXML.loadXML(xml)
;oNS := ComObjCreate("***")
;oNS.AddNamespace("x", "urn:schemas-microsoft-com:office:excel")
;oXML.SelectSingleNode("xml/x:PivotCache", oNS)
  ;不懂XML,也没搞定SelectSingleNode的命名空间,以下的方法比较Low,希望有人指点。(纯处理字符串,oDatetype其实也没什么必要)
oDatatype := oXML.childNodes[].childNodes[].childNodes[].childNodes[].childNodes[]
strType := oDatatype.xml ;除了xml不知道还有什么属性更好用
Return RegExReplace(SubStr(strType,,StrLen(strType)-), '.*"')
}
05-20 10:17