2015-06-19 37 views
2

我有兩個值在Excel中的同一列。我選擇其中一個並運行以下命令:vba Excel訪問:零長度字符串爲空數

Debug.Print IsNumeric(Selection), _ 
      VarType(Selection), _ 
      VarType(Trim(Selection)), _ 
      ">" & Selection.Value & "<", _ 
      Len(Trim(Selection)), _ 
      Len(Selection), _ 
      Selection.NumberFormat 

然後,我選擇其他並運行相同的調試。

而且我得到這個:

  • 真,5,8,> 9.46979663546499 <,16,16,一般
  • 假,8,8,> <,0,0,一般

注:該列中多次出現兩個

  1. 有人能解釋一下嗎?我一直在vba'ing和Excel'很長一段時間,但我仍然沒有(詳細)Excel的數字格式,以及如何最好地與他們合作。我想我有它,然後我總是偶然發現這樣的新事物。
  2. 在這種情況下,我的目標是讓MS Access自動理解這個列是一個double/number/float/whatever列,當我導入並且不會拋出錯誤時它可以是NULL。在導入之前,我必須通過在Excel中格式化/更改它來實現此目的。 (部分原因是因爲這對我的客戶端流程來說效果最好,部分原因是我最終想到了這個問題......不能相信我還沒有!)我有超過2000行來更改每列,所以解決方案一次格式化整個列的做法是最好的,而不是一次一個單元格。

謝謝!

+0

你期望輸出看起來像什麼?你選擇的是什麼? –

+0

S O - 我想知道如何使用VBA和格式或轉換使數據類型(VarType(Trim(Selection)))在Excel中相同。 N8確實「解決」了問題,但我仍然對原始問題沒有更好的理解。如果您有任何意見,那就太棒了! – mountainclimber

+0

你如何將它導入到Access? Via Access'導入過程?複製和粘貼? VBA? –

回答

2

IsNumeric對數字返回true,對於空白則返回false。我不確定這是否意外,但MS必須讓它返回一個或另一個。邏輯是空白既不是數字也不是文字。

Vartype對數字返回Double(如預期的那樣)。如果我VarType一個空單元格,我會得到vbEmpty(0),而不是8(Excel 2010 x86)。如果我在單元格中放一個撇號,我就和你一樣。

當你修剪()的東西,你將其轉換爲文本。不管你修剪什麼,修剪功能只返回一個字符串,所以你總是會得到VarType 8。

閱讀本帖子的混合數據類型http://dailydoseofexcel.com/archives/2004/06/03/external-data-mixed-data-types/。確保你閱讀了評論。

當Office程序導入時,它使用一些註冊表項來確定數據類型。通常,它讀取字段的前8行以確定數據類型是什麼。如果它看到數據類型的混合,它會選擇多數並轉換或忽略其他所有內容。您可以更改註冊表設置以查看超過8行或將所有內容默認爲文本,但不能告訴它將空單元格視爲數字。

這將是很好,如果它會簡單地忽略空單元格,並採取其餘的大部分。但是「空單元格」不僅僅是Excel以外的概念,所以它並沒有讓我感到驚訝。

我認爲你的正確答案是創建一個Schema文件並將其放入與要導入的文件相同的目錄中。請閱讀https://msdn.microsoft.com/en-us/library/ms709353%28v=vs.85%29.aspx這實質上是將所有列數據類型設置爲一個文件。

我幾乎每天都在Excel VBA中使用它 - 我使用VBA創建一個Schema.ini文件,then use ADO to read in the file。我從未在Access中使用過這個功能,特別是通過UI進行導入。但值得一試。如果它不起作用,你可以在VBA和ADO中自己完成所有的導入操作。

+0

我正在研究使用schema.ini文件。它會在Excel文件上工作,還是需要將其轉換爲文本文件?您每天使用哪些信息創建架構文件?你有可以分享的代碼示例嗎?我發現這個鏈接,但它看起來很舊:https://support.microsoft.com/en-us/kb/155512 – mountainclimber

+1

你一定需要將它保存爲txt或csv,或任何純文本。 Schema.ini與文本文件驅動程序一起工作,所以它不適用於二進制文件(或者Excel壓縮的xmls文件)。按照上面段落中的鏈接。它明確說明了我的工作。但是,如果您遇到困難,請在此處發佈另一個問題,並使用VBA和ADO標記,我一定會看到它。 –

1

首先,我會看邏輯上看每列應該包含哪種類型的數據。有些數字是不能計算的,因此應該作爲文本來處理,特別是在(例如)具有前導零的項目編號的情況下。你絕對不希望將這些轉換爲數字並丟失這些前導零,如果查詢它們無法處理隱式轉換,它通常會導致下游問題。另一個例子是數字長度超過15的地方。 Excel會將第15位數字後的所有內容都變成零,因爲它不是一個有意義的數字,但如果這是一個序列號(或類似的數字),那麼您正在破壞數據。

一旦您瞭解每個列應該是什麼,請使用文本到列。數字應該是一般的,日期應該是日期,其他的都應該是文本。

http://www.excel-easy.com/examples/text-to-columns.html

文本到列優於用於此目的,因爲它實際上將轉換數據類型。如果使用格式化,則在編輯單元格之前不會應用格式。

+0

n8 - 解決了這個問題,非常感謝。它有一個令我很失望的問題,那就是我有1350列和文本到列,每次只有一列。我想我會自動化它。但是,它沒有解決我所遇到的一般Excel數據格式問題/問題。如果有人想在這上面發笑,那會很棒。有趣的是,在對列進行文本處理之後,導入的數據可以正常訪問,但上面的Debug.Prints沒有改變!是的,我對我的數據類型有很多想法,但是我想要的具體類型對於回答具體問題並不重要,所以我沒有提及它。 Thx再次! – mountainclimber

+1

很高興工作!迪克也有一些有趣的觀點,我可能會在某些時候使用我自己。我通常只使用Excel作爲「轉儲到」而不是「讀取」,這主要是因爲您遇到的問題類型。 –

+0

我改變了Dick K答案的「答案」,因爲這一直不成功。我看到的一個案例是,當我的前10個值是空白,第11-13個值是短文本,並且該字段出現錯誤和雙倍。 – mountainclimber